本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:汪阳
感谢极术社区和兆易创新组织的开发板试用活动。收到开发板有一周多了,因为工作关系好久没有折腾MDK了,上手浪费的时间多了些。
先上GD官网下载了PACK包和DEMO例程,打开01_GPIO_Running_LED例程修改了头文件路径,编译下载LED闪亮了,接下来就是以此例程移植RTX和调试组件了。
移植RTX:RTX4默认包含在MDK中移植非常简单
1.工程魔术棒里面Target开启RTX操作系统。
2.MDK安装目录查找RTX_Conf_CM.c复制到工程目录下并添加到工程中。
3.修改RTX_Conf_CM.c中Tick_Timer,时钟使用systick,主频200000000Hz,Tick 1000us。
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
2.修改debug中trace中core clock为200MHz
3.使用调试组件需要包含头文件#include “EventRecorder.h”
4.初始化调试组件
/* 初始化 EventRecorder 并开启 */
EventRecorderInitialize(EventRecordAll, 1U);
EventRecorderStart();
5.可以使用EventRecord发送数值并且可以使用printf了
6.同时也可以使用Event Statistics测试时间了
7.编译下载后打开调试功能,开始运行,调试组件自动输出
主要代码
#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;
/*!
\brief main function
\param[in] none
\param[out] none
\retval none
*/
int main(void)
{
/* enable the LEDs GPIO clock */
rcu_periph_clock_enable(RCU_GPIOC);
/* configure LED1 GPIO port */
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);
/* reset LED1 GPIO pin */
gpio_bit_reset(GPIOC, GPIO_PIN_6);
/* enable the User Key GPIO clock */
rcu_periph_clock_enable(RCU_GPIOA);
/* configure key pin as input */
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)); /* 任务栈大小,单位字节数 */
}