superstar_gu

  • 2021-03-03
  • 发表了主题帖: 【Perf-V评测】VIVADO流水灯

    1 硬件设计要求 当复位引脚电平为低电平时,所有led引脚电平拉低,同时,计数寄存器清零,且状态位清零 (1)    SW1为高电平时,D0,D1,D2,D3按照跑马灯运行;否则D0,D1,D2,D3灯灭 (2)    SW2为高电平时,三色D4绿灯亮;否则,三色D4切换颜色 (3)    SW3为高电平时,三色D5绿灯亮;否则,三色D5切换颜色 (4)    SW4为高电平时,三色D6绿灯亮;否则,三色D6切换颜色 1.2    VIVADO设计 1.2.1    项目创建 启动vivado,选择Create New Project,指定工程名字和工程存放目录,选择RTL Project,选择FPGA设备,工程创建完成后   1.2.2    Verilog代码 开始编写verilog代码(复制例程中的LED程序),详见附件 输入:时钟clk,复位rst_n, 按键开关sw1, sw2, sw3, sw4 input clk;     input rst_n;     input sw1;     input sw2;     input sw3; input sw4; 输出:跑马灯pio_led01234,分别有三盏三色灯pio_rgb_d4;pio_rgb_d5; pio_rgb_d6;     output reg  [3:0] pio_led0123;     output reg  [2:0] pio_rgb_d4;     output reg  [2:0] pio_rgb_d5;     output reg  [2:0] pio_rgb_d6; 中间变量: 26位计数寄存器cnt 4位状态寄存器state 常量T 程序为时钟上升沿触发或复位下降沿触发启动。 当复位引脚电平为低电平时,所有led引脚电平拉低,同时,计数寄存器清零,且状态位清零 当按键开关被按下时,检测状态寄存器state状态信息 当state为0时,pio_led0123[3]为高电平,其他led0123引脚为低电平,计数寄存器累加,当计数到T时,state翻转为1; 当state为1时,pio_led0123[2]为高电平,其他led0123引脚为低电平,计数寄存器累加,当计数到T时,state翻转为2; 当state为2时,pio_led0123[1]为高电平,其他led0123引脚为低电平,计数寄存器累加,当计数到T时,state翻转为3; 当state为3时,pio_led0123[0]为高电平,其他led0123引脚为低电平,计数寄存器累加,当计数到T时,state翻转为4; sw2为高,pio_rgb_d4[2]为高,否则切换; sw3为高,pio_rgb_d5[2]为高,否则切换; sw4为高,pio_rgb_d6[2]为高,否则切换; 1.2.3    添加XDC管脚约束文件 主要分配管脚分配,设置下列信号电平为LVCMOS33: 时钟clk,N14   复位rst_n, L13   按键开关Sw1,T15   set_property IOSTANDARD LVCMOS33 [get_ports {pio_led0123[0]}] set_property IOSTANDARD LVCMOS33 [get_ports {pio_led0123[1]}] set_property IOSTANDARD LVCMOS33 [get_ports {pio_led0123[2]}] set_property IOSTANDARD LVCMOS33 [get_ports {pio_led0123[3]}] set_property IOSTANDARD LVCMOS33 [get_ports {pio_rgb_d4[2]}] set_property IOSTANDARD LVCMOS33 [get_ports {pio_rgb_d4[1]}] set_property IOSTANDARD LVCMOS33 [get_ports {pio_rgb_d4[0]}] set_property IOSTANDARD LVCMOS33 [get_ports {pio_rgb_d5[2]}] set_property IOSTANDARD LVCMOS33 [get_ports {pio_rgb_d5[1]}] set_property IOSTANDARD LVCMOS33 [get_ports {pio_rgb_d5[0]}] set_property IOSTANDARD LVCMOS33 [get_ports {pio_rgb_d6[2]}] set_property IOSTANDARD LVCMOS33 [get_ports {pio_rgb_d6[1]}] set_property IOSTANDARD LVCMOS33 [get_ports {pio_rgb_d6[0]}] set_property IOSTANDARD LVCMOS33 [get_ports clk] set_property IOSTANDARD LVCMOS33 [get_ports rst_n] set_property IOSTANDARD LVCMOS33 [get_ports sw1] set_property IOSTANDARD LVCMOS33 [get_ports sw2] set_property IOSTANDARD LVCMOS33 [get_ports sw3] set_property IOSTANDARD LVCMOS33 [get_ports sw4] set_property PACKAGE_PIN N14 [get_ports clk] set_property PACKAGE_PIN L13 [get_ports rst_n] set_property PACKAGE_PIN T15 [get_ports sw1] set_property PACKAGE_PIN M14 [get_ports sw2] set_property PACKAGE_PIN L14 [get_ports sw3] set_property PACKAGE_PIN K13 [get_ports sw4] set_property PACKAGE_PIN M16 [get_ports {pio_led0123[0]}] set_property PACKAGE_PIN N16 [get_ports {pio_led0123[1]}] set_property PACKAGE_PIN P15 [get_ports {pio_led0123[2]}] set_property PACKAGE_PIN P16 [get_ports {pio_led0123[3]}] set_property PACKAGE_PIN M2 [get_ports {pio_rgb_d4[2]}] set_property PACKAGE_PIN L5 [get_ports {pio_rgb_d4[1]}] set_property PACKAGE_PIN P5 [get_ports {pio_rgb_d4[0]}] set_property PACKAGE_PIN N12 [get_ports {pio_rgb_d5[2]}] set_property PACKAGE_PIN P10 [get_ports {pio_rgb_d5[1]}] set_property PACKAGE_PIN P11 [get_ports {pio_rgb_d5[0]}] set_property PACKAGE_PIN R12 [get_ports {pio_rgb_d6[2]}] set_property PACKAGE_PIN P6 [get_ports {pio_rgb_d6[1]}] set_property PACKAGE_PIN K12 [get_ports {pio_rgb_d6[0]}] 1.2.4    编译 代码写好,检查无语法错误,开始进行run synthesis和run implementation   然后指定硬件管脚,有D0~D3,sw1~sw4对应的四盏红色LED灯和四个开关:   1.2.5    生成下载bit文件并下载   1.3    程序运行结果 81009b647db56c3dc2659eeab ... LEDTEST02.rar  

  • 2021-02-23
  • 加入了学习《深入浅出玩转FPGA视频教程2020版(特权同学)》,观看 FPGA器件结构

  • 加入了学习《深入浅出玩转FPGA视频教程2020版(特权同学)》,观看 FPGA基本概念

  • 2021-02-18
  • 发表了主题帖: 【GD32E503评测】一个月测试总结

    GD32因测试而相识。GD32E503V-EVAL开发板,核心芯片GD32E503VET6(以下简称GD32E5)。GD32E5属于国内开发的芯片,架构比较新,平台高,毕竟站在前人肩膀上,性能会有所提升。测试进行了一个多月,总结如下。 内核 GD32E503VET6主频最大108M。 主频大意味着单片机代码运行的速度会更快。项目开发,如:LCD刷屏,数字运算,电机控制等操作,GD32E5是一个不错的选择。 供电与功耗 内核电压:GD32E5内核电压是1.2V。GD32E5的芯片在运行的时候运行功耗低。 Flash GD32E5的Flash是自主研发的,GD Flash执行速度:GD32E5Flash中程序执行为0等待周期。 接口测试 GD32E503V-EVAL开发板接口如下表所示: Tab  2 GD32E503V-EVAL开发板用户信号列表 编号 信号名称 描述 接口位置 备注 1 ADC012_IN1(PA1) AD, 0-3.3V,滑动变阻器调节     2 ADC012_IN2(PA2) AD,Pin2 JP4 Pin1与JP7,pin1直连 3 DAC_OUT0(PA4) DA,pin1 JP7 Pin3.GND 4 DAC_OUT1(PA5) DA,pin2 JP7 Pin3.GND 5 LED1(PC0) LED1,0603     6 LED2(PC2) LED2,0603     7 LED3(PE0) LED3,0603     8 LED4(PE1) LED4,0603     9 扩展 外部扩展接口JP8 JP8   10 扩展 外部扩展接口JP9 JP9   11 扩展 外部扩展接口JP10 JP10   12 扩展 外部扩展接口JP11 JP11   13 KEY A(PA0) 按键,K1-1506SN-01,pin 1(A),上拉3.3V K2 Pin4(COM), GND 14 KEY B(PC13) 按键,K1-1506SN-01,pin 2(B),上拉3.3V K2 Pin4(COM), GND 15 KEY C(PB14) 按键,K1-1506SN-01,pin 3(C),上拉3.3V K2 Pin4(COM), GND 16 KEY D(PC5) 按键,K1-1506SN-01,pin 5(D),上拉3.3V K2 Pin4(COM), GND 17 KEY Cet(PC4) 按键,K1-1506SN-01,pin 6(Cet),上拉3.3V K2 Pin4(COM), GND 18 GD-Link 片上集成资源GD-Link CN100   19 I2C0_SCL(PB6) SCL, pin6, I2C, AT24C02C-SSHM-T(U4)     20 I2C0_SCA(PB7) SCA, pin5, I2C, AT24C02C-SSHM-T(U4)     21 I2S_SD(PB15) SDIN,pin1, I2S, CS4344(U10) J3 HeadPhone 22 I2S_CK(PB13) SCLK,pin2, I2S, CS4344(U10) J3 HeadPhone 23 I2S_WS(PB12) LRCK,pin3, I2S, CS4344(U10) J3 HeadPhone 24 I2S_MCK(PC6) MCLK,pin4, I2S, CS4344(U10) J3 HeadPhone 25 JTAG   JP1   26 BOOT0 BOOT0, pin94, GD32E503VET6(U1) JP2,pin2 Pin3 GND, pin3 与pin2直连 27 BOOT1 BOOT1, pin37(PB2), GD32E503VET6(U1) JP3,pin2 Pin3 GND, pin3 与pin2直连 28 NRST 复位按键,K-1102B,上拉3.3V,默认为高,复位时为低电平, pin14, GD32E503VET6(U1) K1   29 VBAT 芯片供电,板载电子还是电源芯片供电 JP0   30 TFCAD SDIO JP21   31 SPI GD25Q16(U5) JP12 Short JP12(1,2) for DAC; Short JP12(3,2) for SPI0; 32 USART0 To USB CH340E(U3) J1   33     CN2   接口测试从LED点灯控制到USB控制接口,基本采用厂家例程进行调试与测试。厂家的资源很多,例程很完善。测序项目如下: GPIO测试了轮询模式、中断模式等 串口测试了中断模式、DMA模式收发等 ADC测试了基本采样,以及跟随模式、规格并行模式、差分通道模式等 DAC输出,I2C通讯主机发送/接收模式,SPI FLAH,I2S音频播放,LCD触摸屏,SD卡测试,RCU时钟输出、CTC校准,USB通讯,等等。 测试过程中未发现功能性问题。 在串口通讯过程中,发现串口APP软件有些不能连接,不知道是例程程序,还是操作系统与APP兼容性问题。最后采用与WIN10兼容版本没啥问题。这里需要注意的是:GD在连续发送数据的时候每两个字节之间会有一个Bit的Idle,GD的串口在发送的时候停止位只有1/2两种停止位模式。 性能测试 如何综合考虑GD32E503各方面性能?在嵌入式处理器领域,常见测试CPU性能方法有:Dhrystone 和 CoreMark。Dhrystone方法陈旧,且 一直没有更新,我也没有没有移植成功,因此测试借助于CoreMark测试方法。 IDE支持 所有例程提供了Keil 和IAR 两个版本 案例开发 案例开发我做了两个内容      (1)FreeRTOS移植 前面已经移植了FreeRTOS V202012.00,新版本增加部分功能。未来考虑在GD32E503V-EVAL开发板上综合测试FreeRTOS系统各个应用。从测试角度,我准备重新选择FreeRTOS版本,利用熟悉的版本进行测试。 GD芯片在FreeRTOS官方网址有例程与技术指导,开发程度比较高。 (2) 贪吃蛇应用 由于GD32E503V-EVAL开发板集成LCD触摸屏,直接利用现有条件进行开发,算是一个小小作品。 GD32E503V-EVAL开发板,核心芯片GD32E503VET6(以下简称GD32E5),是Armv8-M架构的Cortex-M33处理器。Cortex-M33是ARM公司2016年十月发布的,所以这个架构比较新。Cortex-M33有如下特点: Cortex-M3/M4 + 性能提升 专门的栈溢出硬件检测 指令集不可忽略的小动作 安全扩展(TrustZone for Armv8-M) MPU开发者模型的友好化改进 未来需要对以上特点进一步测试,进一步熟悉该应用架构,争取应用到产品中去。

  • 2021-02-08
  • 回复了主题帖: 【GD32E503评测】+音乐播放器

    看着不错 mark  

  • 2021-02-05
  • 回复了主题帖: 【Perf-V评测】之UART

    谢谢分享  

  • 2021-02-04
  • 回复了主题帖: 【GD32E503评测】 ADC实验(续)

    解析代码确实很耗时间

  • 发表了主题帖: 【GD32E503评测】贪吃蛇程序运行

    2.6    小程序贪吃蛇 按照测试计划,完成贪吃蛇小程序,在GD32E503V-EVAL开发板上运行。 2.6.1    贪吃蛇需求说明 贪吃蛇需求如下: (1)    触摸屏显示蛇身、蛇头、食物等 (2)    蛇身、舌头通过触摸屏控制光标行进方向 (3)    食物能随机产生,遇到蛇头被吃掉 (4)    蛇吃到食物,蛇身增长食物的长度 (5)    蛇的移动速度能够设定以及其他设置功能 2.6.2    贪吃蛇设计说明 1)    显示界面 设置一个二维地图,定义(x,y),二维数组显示图像位置信息。 定义蛇身、蛇头、食物、墙的显示方式,蛇身显示为“X”,蛇头显示为“H”,墙显示为“#”,食物显示为“*”。 /****************************************************************************** * Function: map creation * void creatmap(char  map[MAP_ROW][MAP_COLUMN]) ******************************************************************************/ void creatmap(char map[6][20]) {     for (int i = 0; i < MAP_COLUMN; ++i)   /* Wall created in bottom and top site*/     {         map[0] = wall;         map[MAP_ROW-1] = wall;     }     for (int i = 1; i < MAP_ROW-1; ++i)  /* Wall created in left and right site*/     {         map[0] = wall;         map[MAP_COLUMN-1] = wall;     }     for (int i = 1; i < MAP_ROW-1; ++i)  /* Blank area used to display snake and food*/     {         for (int j = 1; j < MAP_COLUMN-1; ++j)             map[j] = ' ';     }     } /****************************************************************************** * Function: snake body creation * void creatsnake(int snake[MAP_ROW][MAP_COLUMN]) ******************************************************************************/ void creatsnake(int snake[6][20]) {     for (int i = 1; i < snake_initiallength; ++i)     {         snake[1] = body;         ++body;     } } /****************************************************************************** * Function: image displayed * void displaymap(char map[MAP_ROW][MAP_COLUMN],int snake[MAP_ROW][MAP_COLUMN]) ******************************************************************************/ void displaymap(char map[6][20],int snake[6][20]) {     /*snake中,0表空闲位置,-1表食物,正数表蛇*/     for (int i = 1; i < MAP_ROW-1; ++i)     {         for (int j = 1; j < MAP_COLUMN-1; ++j)         {             if (snake[j] == 0)map[j] = ' ';             else map[j] = snake_body;         }     }     map[head_x][head_y] = snake_head;     map[food_x][food_y] = food;          for (uint16_t i = 0; i < MAP_ROW; i++)     {         for (uint16_t j = 0; j < MAP_COLUMN; j++)         {             lcd_char_display((a1+8*j), b3+i*16, map[j], char_format);         }     } } 2)    控制蛇的移动 蛇的移动,利用触摸屏虚拟按键“↑”“↓”“←”“→”实现,蛇按照惯性移动。 int a;             switch(button_id){             case 0: direction = FLAG_UP;break;             case 1: direction = FLAG_DOWN;break;             case 2: direction = FLAG_LEFT;break;             case 3: direction = FLAG_RIGHT;break;             default:               break;             }                          switch(direction){                 case 0:snake[head_x][head_y] = body; body++; head_x--; break;                 case 1:snake[head_x][head_y] = body; body++; head_x++; break;                 case 2:snake[head_x][head_y] = body; body++; head_y--; break;                 case 3:snake[head_x][head_y] = body; body++; head_y++; break;             default:                 break;             }             if (snake[head_x][head_y] != -1)             {                 a = snake[tail_x][tail_y];                 snake[tail_x][tail_y] = 0;                 if (tail_x + 1 < MAP_ROW - 1 && snake[tail_x + 1][tail_y] == a+1)                     tail_x = tail_x + 1;                 else                     if (tail_x - 1 > 0 && snake[tail_x - 1][tail_y] == a + 1)                         tail_x = tail_x - 1;                     else                         if (tail_y + 1 < MAP_COLUMN - 1 && snake[tail_x][tail_y + 1] == a + 1)                             tail_y = tail_y + 1;                         else                             if (tail_y - 1 > 0 && snake[tail_x][tail_y - 1] == a + 1)                                 tail_y = tail_y - 1;             }             else             {                 creatfood(snake);             }             num[0]=num[1]=num[2]=num[3]=0;             count=0;         }         b = judge(map); 3)    食物放置 用随机数函数来放置食物的坐标。如果食物没吃掉,不用调用随机数函数;否则重新生成。 /****************************************************************************** * Function: food creation * void creatfood(int snake[MAP_ROW][MAP_COLUMN])  ******************************************************************************/ void creatfood(int snake[6][20]) {     while (snake[food_x][food_y] != 0)     {         food_x = rand() % 6 ;         food_y = rand() % 20 ;     }     snake[food_x][food_y] = -1; /* The food is displayed with "-1" */ } 4)    蛇吃到食物变化 蛇头“吃”到食物,旧的食物消失,新的食物显示; 蛇身生长。 5)    设置菜单 控制按键显示 2.6.3    贪吃蛇程序编写 为了开发速度,在GD32E503V-EVAL开发板demo程序“16_EXMC_TouchScreen”基础上作开发。 1)    调试并测试“16_EXMC_TouchScreen”程序 Shot JP12(2,3) for SPI0 function “16_EXMC_TouchScreen”程序通过“External momory controller(EXMC)”接口控制触摸屏 2)    程序主体 #include <stdlib.h> #include <time.h> uint16_t MAP_ROW = 6;              /* map row*/ uint16_t MAP_COLUMN = 20;          /* map COLUMN*/ char snake_head = 'H'; char snake_body = 'X'; char wall = '#'; char food = '*'; char map_string[6][20]={"####################",                                  "#                  #",                                  "#   XH             #",                                  "#           *      #",                                  "#                  #",                                  "####################"}; char gameover_string[1][10]={"GAME OVER!"}; uint16_t snake_initiallength = 5; uint16_t body = 1; uint8_t direction = 3;//蛇移动方向 int tail_x = 1, tail_y = 1;//蛇尾坐标 int head_x = 1, head_y = 5;//初始蛇头位置 int food_x = 1, food_y = 1;//食物位置 void snake_init(void);           /* snake app initiation */ void creatmap(char map[6][20]); void creatsnake(int snake[6][20]); void creatfood(int snake[6][20]); void displaymap(char map[6][20],int snake[6][20]); int judge(char map[6][20]);   /* main*/ uint8_t led_string[4][4]={"UPPE","DOWN","LEFT","RGHT"};     uint8_t button_id = 3;     enum eFLAG{         FLAG_UP = 0,          FLAG_DOWN = 1,         FLAG_LEFT = 2,         FLAG_RIGHT = 3     }direction; snake_init();      char map[6][20]={0};     int snake[6][20]={0};         creatmap(map);     delay_1ms(100);      creatsnake(snake);     delay_1ms(100);      creatfood(snake);     delay_1ms(100);  while(1){         displaymap(map,snake);         /* get the position of touch on LCD screen */         if(SUCCESS == touch_scan()){             count++;             if(0x8989 == device_code){                 /* SSD1289 */                 get_touch_area(touch_coordinate_x_get(touch_ad_x),(LCD_Y - touch_coordinate_y_get(touch_ad_y)),num);             }else if((0x9320 == device_code) || (0x9300 == device_code)){                 /* ILI9320 */                 get_touch_area(LCD_X - touch_coordinate_x_get(touch_ad_x),(LCD_Y - touch_coordinate_y_get(touch_ad_y)),num);             }                       }         /*  generate response to the touch(turn on LED and change picture )*/         if(count==20){             button_id = find_max(num);             turn_on_led(button_id);             //change_picture(button_id);             int a;             switch(button_id){             case 0: direction = FLAG_UP;break;             case 1: direction = FLAG_DOWN;break;             case 2: direction = FLAG_LEFT;break;             case 3: direction = FLAG_RIGHT;break;             default:               break;             }                          switch(direction){                 case 0:snake[head_x][head_y] = body; body++; head_x--; break;                 case 1:snake[head_x][head_y] = body; body++; head_x++; break;                 case 2:snake[head_x][head_y] = body; body++; head_y--; break;                 case 3:snake[head_x][head_y] = body; body++; head_y++; break;             default:                 break;             }             if (snake[head_x][head_y] != -1)             {                 a = snake[tail_x][tail_y];                 snake[tail_x][tail_y] = 0;                 if (tail_x + 1 < MAP_ROW - 1 && snake[tail_x + 1][tail_y] == a+1)                     tail_x = tail_x + 1;                 else                     if (tail_x - 1 > 0 && snake[tail_x - 1][tail_y] == a + 1)                         tail_x = tail_x - 1;                     else                         if (tail_y + 1 < MAP_COLUMN - 1 && snake[tail_x][tail_y + 1] == a + 1)                             tail_y = tail_y + 1;                         else                             if (tail_y - 1 > 0 && snake[tail_x][tail_y - 1] == a + 1)                                 tail_y = tail_y - 1;             }             else             {                 creatfood(snake);             }             num[0]=num[1]=num[2]=num[3]=0;             count=0;         }         b = judge(map);     } 2.6.4    贪吃蛇程序运行 目前程序运行正常!撞墙程序需要调整一下。其他运行正常

  • 2021-01-29
  • 发表了主题帖: 【Perf-V评测】环境搭建与跑马灯程序运行

    本帖最后由 superstar_gu 于 2021-1-29 16:04 编辑 2.2.1    Vivado硬件开发环境搭建 Perf-V 开发板核心处理芯片采用Xilinx Artix-7 FPGA 芯片,需要安装Xilinx官方设计软件Vivado。Vivado下载地址如下链接所示。 https://www.xilinx.com/support/download.html 考虑到安装授权问题,一般推荐安装Web版本的Vivado。通过查询《Vivado Design Suite User Guide》,Web版本支持的XC7A35T。 Perf-V 开发板要求的版本号为2018.1,按照厂家推荐步骤安装完成,过程不细阐述。   VIVADO2018.1界面示意图 VIVADO许可文件安装,打开“VIVADO License Manage”文件->obtain license,  然后程序连接到Xilinx官方网址,按照官方程序,得到免费的Vivado web许可文件,打开“VIVADO License Manage”文件->Load license,打开“VIVADO License Manage”文件->View License Status, 安装完毕    VIVADO License确认界面示意图 2.2.2    LED跑马灯 (1)    启动vivado,选择Create New Project,指定工程名字和工程存放目录,选择RTL Project,选择FPGA设备,工程创建完成后   (2)    开始编写verilog代码(复制例程中的LED程序) 三个输入:时钟clk,复位rst_n, 按键开关Sw 一个输出:pio_led,13位寄存器输出 中间变量: 26位计数寄存器cnt 4位状态寄存器state 常量T 程序为时钟上升沿触发或复位下降沿触发启动。 当复位引脚电平为低电平时,所有led引脚电平拉低,同时,计数寄存器清零,且状态位清零 当按键开关被按下时,检测状态寄存器state状态信息 当state为0时,只有第12 led亮,计数寄存器累加,当计数到T时,state翻转为1; 当state为1时,只有第11 led亮,计数寄存器累加,当计数到T时,state翻转为2; 当state为2时,只有第10 led亮,计数寄存器累加,当计数到T时,state翻转为3; 当state为3时,只有第9 led亮,计数寄存器累加,当计数到T时,state翻转为4; 当state为4时,只有第7 led亮,计数寄存器累加,当计数到T时,state翻转为5; 当state为5时,只有第5 led亮,计数寄存器累加,当计数到T时,state翻转为6; 当state为6时,只有最后位led亮,计数寄存器累加,当计数到T时,state翻转为0;   本文没有描述仿真过程。 (3)    添加XDC管脚约束文件 主要分配管脚分配,设置下列信号电平为LVCMOS33: 时钟clk,N14   复位rst_n, L13   按键开关Sw   PIN M16 pio_led[12] D0 PIN N16 pio_led[11] D1 PIN P15  pio_led[10] D2 PIN P16  pio_led[9] D3 PIN M2 pio_led[8] D4B PIN L5 pio_led[7] D4G PIN P5 pio_led[6] D4R PIN N12  pio_led[5] D5B PIN T9 pio_led[4] D5G PIN T10 pio_led[3] D5R PIN D10 pio_led[2] D6B PIN P6 pio_led[1] D6G PIN K12 pio_led[0] D6R 注意:厂家提供的LED部分引脚约束需要根据原理图进行调整。 (4)    编译 第一步:运行Run Synthesis综合     运行过程中,发现下列错误“ [Common 17-180] Spawn failed: No such file or directory” 网上给出的建议参考下了链接: https://forums.xilinx.com/t5/Synthesis/common-17-180-spawn-failed-No-such-file-or-directory-during-IP/td-p/818187 一般重启工程运行,错误消失。 第二步:运行Run Implementation 布局布线   第三步:运行Generate Bitstream  生成bit文件。下载程序时遇到下列问题:   问题为:There are no debug cores,分析可能由于版本问题或者下载驱动的问题,重新安装最新版本再试试看。

  • 2021-01-27
  • 回复了主题帖: 【GD32E503评测】IAR环境移植FreeRTOSV202012.00

    w494143467 发表于 2021-1-27 10:55 如果能分享移植好的工程就更好了!
    OK,我会上传的,工程还点小尾巴。FreeRTOS任务调度体现不是很好,还有下一个文档!

  • 回复了主题帖: 【GD32E503评测】基于uCOSIII项目实现U盘功能1

    开发新技能,期待!

  • 回复了主题帖: 【GD32E503评测】IAR环境移植FreeRTOSV202012.00

    freebsder 发表于 2021-1-26 22:43 怎么现在freertos的版本变成202012.00这种了。。。
    我特意查看了下最新的版本信息,之前版本为以V202011.00,V10.4.1,如下: Changes between FreeRTOS V202012.00 and FreeRTOS V202012.00 released December 2020 Changes between FreeRTOS V10.4.1 and FreeRTOS V202011.00 released November 10 2020 ...... 亚马逊收购了FreeRTOS,以后的版本可能以日期为基准。

  • 回复了主题帖: 【GD32E503评测】IAR环境移植FreeRTOSV202012.00

    caizhiwei 发表于 2021-1-26 23:10 楼主可以参考一下我的帖子,mdk里面移植很方便,勾选一下pack就OK  
    的确,ARM开发编辑器环境最好选择KEIL。IAR搭建时,会走很多弯路

  • 2021-01-26
  • 发表了主题帖: 【GD32E503评测】IAR环境移植FreeRTOSV202012.00

    本帖最后由 superstar_gu 于 2021-1-27 09:49 编辑 2.5    GD32E503V-EVAL开发板移植FreeRTOS系统 2.5.1    概况 开发板:GD32E503V-EVAL开发板,板载GD32E503VET6,Cortex-M33内核, 512K FLASH,512K RAM, 128K PSRAM 电脑系统:WIN10 编辑器:IAR v8.32.1 2.5.2    FreeRTOS系统内核源码 FreeRTOS内核源码下载链接如下: https://freertos.org/a00104.html 最新版本为V202012.00,解压缩,FreeRTOS文件夹如下:   Source文件夹包含FreeRTOS内核的源代码,移植FreeRTOS就需要这部分源代码。 2.5.3    LED程序 以LED亮灯程序作为模板,移植FreeRTOS系统。本次测试以开发板例程GPIO_Running_LED作为基础程序,调试并测试完毕。 2.5.4    FreeRTOS移植 1)    在GPIO_Running_LED工程文件夹下新建“src”文件夹,用于保存FreeRTOS中的核心源文件。我们将FreeRTOS内核的源代码下属源程序复制到“src”文件夹内。   2)    在GPIO_Running_LED工程文件夹下新建“inc”文件夹,用于保存FreeRTOS中的一些头文件。我们将FreeRTOS内核的源代码下属“include”文件夹内容复制到“inc”文件夹内。   3)    在GPIO_Running_LED工程文件夹下新建“port”文件夹,用于RTOS硬件接口层。我们将\FreeRTOS\Source\portable\IAR\ARM_CM33\non_secure文件夹内容复制到“port”文件夹内。 说明下,GD32E503V为ARM Cortex-M33架构,且编辑器平台为IAR,所以选择用ARM_CM33文件夹。   4)    FreeRTOSConfig.h文件是FreeRTOS的工程配置文件,因为FreeRTOS是可以裁剪的实时操作内核,应用于不同的处理器平台,用户可以通过修改这个FreeRTOS内核的配置头文件来裁剪FreeRTOS的功能,所以我们把它拷贝一份放在user这个文件夹下面。将FreeRTOS内核的源代码下属FreeRTOS\Demo\CORTEX_STM32L152_IAR文件夹FreeRTOSConfig.h复制到“inc”文件夹内。 5)    至此FreeRTOS内核的源代码提取完成。 2.5.5    准备工作 1)    在工程GPIO_Running_LED工程新建分组“FreeRTOS”,将文件夹“inc”“port”“src”放置到该分组文件中 2)    添加头文件路径   3)    修改FreeRTOSConfig.h #define xPortPendSVHandler     PendSV_Handler #define vPortSVCHandler     SVC_Handler FreeRTOSConfig.h该头文件对裁剪整个FreeRTOS所需的功能的宏均做了定义,有些宏定义被使能,有些宏定义被失能。 把configUSE_IDLE_HOOK、configUSE_TICK_HOOK、configCHECK_FOR_STACK_OVERFLOW、configUSE_MALLOC_FAILED_HOOK这几个宏定义设为0。 /* 置1:使用空闲钩子(Idle Hook类似于回调函数);置0:忽略空闲钩子  *  * 空闲任务钩子是一个函数,这个函数由用户来实现,  * FreeRTOS规定了函数的名字和参数:void vApplicationIdleHook(void ),  * 这个函数在每个空闲任务周期都会被调用  * 对于已经删除的RTOS任务,空闲任务可以释放分配给它们的堆栈内存。  * 因此必须保证空闲任务可以被CPU执行  * 使用空闲钩子函数设置CPU进入省电模式是很常见的  * 不可以调用会引起空闲任务阻塞的API函数  */ #define configUSE_IDLE_HOOK                0        /*change from 1 to 0*/ /* 置1:使用时间片钩子(Tick Hook);置0:忽略时间片钩子  * * 时间片钩子是一个函数,这个函数由用户来实现,  * FreeRTOS规定了函数的名字和参数:void vApplicationTickHook(void )  * 时间片中断可以周期性的调用  * 函数必须非常短小,不能大量使用堆栈,  * 不能调用以”FromISR" 或 "FROM_ISR”结尾的API函数  */  /*xTaskIncrementTick函数是在xPortSysTickHandler中断函数中被调用的。因此,vApplicationTickHook()函数执行的时间必须很短才行*/ #define configUSE_TICK_HOOK                0        /*change from 1 to 0*/ /*  * 大于0时启用堆栈溢出检测功能,如果使用此功能   * 用户必须提供一个栈溢出钩子函数,如果使用的话  * 此值可以为1或者2,因为有两种栈溢出检测方法 */ #define configCHECK_FOR_STACK_OVERFLOW    0        /*change from 2 to 0*/ //使用内存申请失败钩子函数 #define configUSE_MALLOC_FAILED_HOOK    0        /*change from 1 to 0*/ 注释掉时间状态相关宏定义 /* Run time stats related macros. */ /*#define configGENERATE_RUN_TIME_STATS    1 #define configUSE_STATS_FORMATTING_FUNCTIONS 1 #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() vConfigureTimerForRunTimeStats() #define portALT_GET_RUN_TIME_COUNTER_VALUE( ulCountValue )                                    \     {                                                                                        \         TIM_Cmd( TIM6, DISABLE );                                                            \         ulCountValue = ( ( ulTIM6_OverflowCount << 16UL ) | ( unsigned long ) TIM6->CNT );    \         TIM_Cmd( TIM6, ENABLE );                                                            \     } */ 4)    修改gd32e50x_it.c SysTick中断服务函数,FreeRTOS所有跟时间相关的事情都在里面处理,SysTick就是FreeRTOS的一个心跳时钟,驱动着FreeRTOS的运行,就像人的心跳一样,假如没有心跳,我们就相当于“死了”,同样的,FreeRTOS没有了心跳,那么它就会卡死在某个地方,不能进行任务调度,不能运行任何的东西,因此我们需要实现一个FreeRTOS的心跳时钟,FreeRTOS帮我们实现了SysTick的启动的配置:在port.c文件中已经实现vPortSetupTimerInterrupt()函数,并且FreeRTOS通用的SysTick中断服务函数也实现了:在port.c文件中已经实现xPortSysTickHandler()函数,所以移植的时候只需要我们在gd32e50x_it.c文件中实现我们对应平台上的SysTick_Handler()函数即可。FreeRTOS为开发者考虑得特别多,PendSV_Handler()与SVC_Handler()这两个很重要的函数都帮我们实现了,在在port.c文件中已经实现xPortPendSVHandler()与vPortSVCHandler()函数,防止我们自己实现不了,那么在gd32e50x_it.c中就需要我们注释掉PendSV_Handler()与SVC_Handler()这两个函数了。 屏蔽掉SVC_Handler、PendSV_Handler、SysTick_Handler三个函数。 /* void SVC_Handler(void) { } */ /* void PendSV_Handler(void) { } */ /* void SysTick_Handler(void) {     delay_decrement(); } */ 工程中把HAL库与FreeRTOS共用Systic,所以在FreeRTOS的xPortSysTickHandler函数中添加HAL_IncTick函数的执行。 5)    创建任务(Main.c) (1)    在main.c中包含有关于FreeRTOS的.h文件 /* FreeRTOS header file */ #include "FreeRTOS.h" #include "task.h" #include "queue.h" #include "croutine.h" (2)    创建任务句柄和入口函数 /* create tast handle */ static TaskHandle_t AppTask_Handle = NULL; /* AppTask function*/ static void AppTaskCreate(void); static void vTaskLED(void* parameter) {         while (1)     {          /* turn on LED1 */         gpio_bit_set(GPIOC, GPIO_PIN_0);         /* insert 200 ms delay */         delay_1ms(200);         /* turn on LED2 */         gpio_bit_set(GPIOC, GPIO_PIN_2);         /* insert 200 ms delay */         delay_1ms(200);         /* turn on LED3 */         gpio_bit_set(GPIOE, GPIO_PIN_0);         /* insert 200 ms delay */         delay_1ms(200);         /* turn on LED4 */         gpio_bit_set(GPIOE, GPIO_PIN_1);         /* insert 200 ms delay */         delay_1ms(200);         /* turn off LEDs */         gpio_bit_reset(GPIOC, GPIO_PIN_0 | GPIO_PIN_2);         gpio_bit_reset(GPIOE, GPIO_PIN_0 | GPIO_PIN_1);         /* insert 200 ms delay */         delay_1ms(200);                      } } (3)    创建并启动调度器     /* 创建AppTaskCreate任务 */     xReturn = xTaskCreate((TaskFunction_t )vTaskLED,  /* 任务入口函数 */                           (const char*    )"vTaskLED",/* 任务名字 */                           (uint16_t       )512,  /* 任务栈大小 */                           (void*          )NULL,/* 任务入口函数参数 */                           (UBaseType_t    )1, /* 任务的优先级 */                           (TaskHandle_t*  )&AppTask_Handle);/* 任务控制块指针 */ 2.5.6    总结 编译后下载程序,观察到板子上LD1开始闪烁,任务创建并成功运行。   GD32E503VET6为Cortex-M33架构,新版本FREERTOS新增了时间状态相关宏定义,若时间充裕可以研究,一般可以注释掉.

  • 2021-01-24
  • 加入了学习《深入浅出玩转FPGA视频教程2020版(特权同学)》,观看 FPGA入门实例:流水灯实例

  • 加入了学习《深入浅出玩转FPGA视频教程2020版(特权同学)》,观看 FPGA入门实例:PLL的IP核配置实例

  • 2021-01-22
  • 加入了学习《深入浅出玩转FPGA视频教程2020版(特权同学)》,观看 查看Vivado的Schematic视图

  • 加入了学习《深入浅出玩转FPGA视频教程2020版(特权同学)》,观看 FPGA入门实例:拨码开关的LED控制实例

  • 加入了学习《深入浅出玩转FPGA视频教程2020版(特权同学)》,观看 第一个工程编译、引脚分配、下载与固化

  • 加入了学习《深入浅出玩转FPGA视频教程2020版(特权同学)》,观看 第一个工程创建、源码输入与仿真

最近访客

< 1/2 >

统计信息

已有40人来访过

  • 芯币:83
  • 好友:2
  • 主题:11
  • 回复:114
  • 课时:--
  • 资源:--

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言