- 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版(特权同学)》,观看 第一个工程创建、源码输入与仿真