先上GD官网下载了PACK包和DEMO例程,打开01_GPIO_Running_LED例程修改了头文件路径,编译下载LED闪亮了,接下来就是以此例程移植RTX和调试组件了。
移植RTX:RTX4默认包含在MDK中移植非常简单
1.工程魔术棒里面Target开启RTX操作系统。
![title= title=](//file.elecfans.com/web2/M00/84/FA/poYBAGOiYu-AXixwAAIfvlvS1Uo245.jpg)
2.MDK安装目录查找RTX_Conf_CM.c复制到工程目录下并添加到工程中。
![title= title=](//file.elecfans.com/web2/M00/84/FA/poYBAGOiYu-AZoNCAAEfjIdqrr4733.jpg)
3.修改RTX_Conf_CM.c中Tick_Timer,时钟使用systick,主频200000000Hz,Tick 1000us。
![title= title=](//file.elecfans.com/web2/M00/85/83/pYYBAGOiYu-ALr1LAALkOLqZMFs186.jpg)
4.屏蔽gd32f4xx_it.c中void SVC_Handler(void) void PendSV_Handler(void) void SysTick_Handler(void)三个中断函数
5.在main.c中增加头文件#include "RTL.h"
6.建立调度任务
移植调试组件:使用板载的GD_Link就能方便调试而不需要串口
1.打开Manage Run_Time Enviornment -> Compiler 选项中Event Recorder 和STDOUT
![title= title=](//file.elecfans.com/web2/M00/85/83/pYYBAGOiYu-AAs9dAAOSv5y2VHU108.jpg)
2.修改debug中trace中core clock为200MHz
![title= title=](//file.elecfans.com/web2/M00/85/83/pYYBAGOiYu-AX7PiAAFjXye9oWQ797.jpg)
![title= title=](//file.elecfans.com/web2/M00/85/83/pYYBAGOiYu-AA_KwAAF_6-D3A2k244.jpg)
3.使用调试组件需要包含头文件#include "EventRecorder.h"
4.初始化调试组件
EventRecorderInitialize(EventRecordAll, 1U);
EventRecorderStart();
5.可以使用EventRecord发送数值并且可以使用printf了
6.同时也可以使用Event Statistics测试时间了
7.编译下载后打开调试功能,开始运行,调试组件自动输出
![title= title=](//file.elecfans.com/web2/M00/85/83/pYYBAGOiYvCAeIitAAQ6eOA99L0120.jpg)
![title= title=](//file.elecfans.com/web2/M00/84/FA/poYBAGOiYu-AdzzhAARn4W95Av8590.jpg)
![title= title=](//file.elecfans.com/web2/M00/84/FA/poYBAGOiYu-AeA_kAAYVttRsPtA258.jpg)
主要代码
#include "gd32f4xx.h"
#include "gd32f427r_start.h"
#include "systick.h"
#include <stdio.h>
#include "RTL.h"
#include "EventRecorder.h"
static void AppTaskCreate (void);
__task void AppTaskLED(void);
__task void AppTaskStart(void);
static uint64_t AppTaskLEDStk[256/8];
static uint64_t AppTaskStartStk[512/8];
OS_TID HandleTaskLED = NULL;
int main(void)
{
rcu_periph_clock_enable(RCU_GPIOC);
gpio_mode_set(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_6);
gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6);
gpio_bit_reset(GPIOC, GPIO_PIN_6);
rcu_periph_clock_enable(RCU_GPIOA);
gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_0);
os_sys_init_user (AppTaskStart,
2,
&AppTaskStartStk,
sizeof(AppTaskStartStk));
while(1)
{
}
}
/\*
* 函 数 名: AppTaskLED
* 功能说明: LED 闪烁
* 形 参: 无
* 返 回 值: 无
* 优 先 级: 1 (数值越小优先级越低)
\*/
\\_\\_task void AppTaskLED(void)
{
static int numi = 0;
while(1)
{
EventStartA(0);
os_dly_wait(500);
EventStopA(0);
EventRecord2(1+EventLevelAPI,numi,numi);
numi++;
if((numi % 10) == 0)
printf("计数%d\r\n",numi);
gpio_bit_write(GPIOC, GPIO_PIN_6, (bit_status)(1 - gpio_input_bit_get(GPIOC, GPIO_PIN_6)));
}
}
/\*
* 函 数 名: AppTaskStart
* 功能说明: 启动任务,也就是最高优先级任务。
* 形 参: 无
* 返 回 值: 无
* 优 先 级: 2
\*/
\\_\\_task void AppTaskStart(void)
{
/ _初始化 EventRecorder 并开启_ /
EventRecorderInitialize(EventRecordAll, 1U);
EventRecorderStart();
AppTaskCreate();
while(1)
{
os_dly_wait(500);
}
}
/\*
* 函 数 名: AppTaskCreate
* 功能说明: 创建应用任务
* 形 参: 无
* 返 回 值: 无
\*/
static void AppTaskCreate (void)
{
HandleTaskLED = os\\_tsk\\_create\\_user(AppTaskLED, / _任务函数_ /
1,
&AppTaskLEDStk,
sizeof(AppTaskLEDStk));
}
原作者:兆易创新GD32 MCU 汪阳