园薇

P2 Evb 做一个跑马灯

0
阅读(1373)

之前我用M5 做了一个跑马灯,这次我用P2.  主要想使用一下其中的ARM  这个IP. 最简单的是做一个跑马灯。



代码部分:

ARM 代码如下:(编程环境为Keil)

#include <stdio.h>

#include <string.h>

#include "hme_includes.h"

#include "hme_retarget.h"

#include "timer_delay.h"

#include "gpio_task.h"



void delay(volatile unsigned int ix)

{

      volatile unsigned int cycles = ix *31250;   

       while( cycles )

           --cycles;

}


int main(void)

{

HME_GPIO_InitTypeDef Init;


Init.Mode = PIN_MODE_OUTPUT;

Init.Pins = 0xf;


HME_GPIO_Init(GPIO0, &Init);


  delay(250);


  while(1){


HME_GPIO_Set(GPIO0,GPIO_PIN1);

       delay(250);

HME_GPIO_Clear(GPIO0,GPIO_PIN1);

delay(250);

HME_GPIO_Set(GPIO0,GPIO_PIN0);

delay(250);

HME_GPIO_Clear(GPIO0,GPIO_PIN0);

delay(250);

HME_GPIO_Set(GPIO0,GPIO_PIN2);

delay(250);

HME_GPIO_Clear(GPIO0,GPIO_PIN2);

delay(250);

HME_GPIO_Set(GPIO0,GPIO_PIN3);

       delay(250);

HME_GPIO_Clear(GPIO0,GPIO_PIN3);

delay(250);

    }


}



FPGA的代码 用fuxi这个工具写, 如下:


module  top(led);

 

output [3:0] led;


wire clk; 



//sys_rstn 系统复位低电平有效

wire        sys_rstn;




//GPIO

wire [3:0] gpio_d;//enable

wire [3:0] gpio_out;  

wire [3:0] gpio_in;



por_v1_1 por_inst(

    .O(por)

);


//assign sys_rstn = por;


oscillator_v1 u_osc(

.clkout(clk)

);



pll_v1 u0_pll(

    .clkin0     (clk),

    .locked     (locked0),

    .clkout0    (psram_clk),

    .clkout1    (psram_clk_90),

    .clkout2    (psram_clk_60),

    .ps_ck      (ps_ck),

    .ps_dir     (ps_dir),

    .ps_en      (ps_en0),

    .ps_done    (ps_done),

    .pssel      (pssel)

);


pll_v2 u1_pll(

.clkin0 (clk),

.locked (locked1),

.clkout0 (clk_mcu)

);



assign sys_rstn = locked0 & locked1 & por;

assign rstn_mcu = sys_rstn;




 soc_system_v1 u0_soc(

    .m3soc_clk_o(clk_mcu),

    .m3soc_clken(1'b1),

    .m3soc_rstn(rstn_mcu),


    

    .u_m3soc_gpio0_ext_porta_i(gpio_in),

    .u_m3soc_gpio0_porta_ddr_o(gpio_d),

    .u_m3soc_gpio0_porta_dr_o(gpio_out)


);



assign led[0] = gpio_d[0] == 1'b1 ? gpio_out[0] : 1'bz;

assign led[1] = gpio_d[1] == 1'b1 ? gpio_out[1] : 1'bz;

assign led[2] = gpio_d[2] == 1'b1 ? gpio_out[2] : 1'bz;

assign led[3] = gpio_d[3] == 1'b1 ? gpio_out[3] : 1'bz;


endmodule



这里面有一个东东让我花了一些时间理解:


这个是P2手册里面的,关于地址空间的分配

2bc5c57623df4751bd4a7cd3ab1b5830_.png


根据上面的手册,Keil中做如下配置 (注:IROM1 存放代码; IRAM1 地址是指定存放数据的。完全follow 上面的手册内容,如果想要使用0x18000000 后面的区域,需要在Fuxi工程中用emb扩展SRAM区, 后面有时间我会去实现一下 我们有参考代码)

image.png