1. 准备好一个HC32L136的裸机工程,这里选择了136的Demo工程Gpio输出点灯;
2. 从RT_Thread官网下载了rtthread-nano-master源码包;
3. 将RT_Thread中的文件分为两部分添加到裸机工程的结构中;
4. 添加RT_Thread相关头文件的路径;
5. 移植工作,主要涉及RT_Thread源码目录下的bsp和libcpu这两个文件夹,因为hc32l136为cotex-m0内核,RT_Thread源码里面已经支持好,所以libcpu里面不需要移植,这里主要关心bsp文件夹
这里只保留board.c和rtconfig.h两个文件,其它的都可以删掉。
6. 修改 rtconfig.h
#define RT_TICK_PER_SECOND 1000,根据需要设置合适的tick;
7. 修改board.c
修改void rt_hw_board_init()函数内容
#if 0
/* System Clock Update */
SystemCoreClockUpdate();
/* System Tick Configuration */
_SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND);
#endif
增加CPU时钟初始化,这一步可选HAL_CpuClkCfg();
//系统时钟配置
static void HAL_CpuClkCfg(void)
{
stc_sysctrl_clk_cfg_t stcCfg;
///< 因要使用的时钟源HCLK小于24M:此处设置FLASH 读等待周期为0 cycle(默认值也为0 cycle)
Flash_WaitCycle(FlashWaitCycle0);
///< 时钟初始化前,优先设置要使用的时钟源:此处设置RCH为4MHz(默认值为4MHz)
Sysctrl_SetRCHTrim(SysctrlRchFreq24MHz);
///< 选择内部RCH作为HCLK时钟源;
stcCfg.enClkSrc = SysctrlClkRCH;
///< HCLK SYSCLK/1
stcCfg.enHClkDiv = SysctrlHclkDiv1;
///< PCLK 为HCLK/1
stcCfg.enPClkDiv = SysctrlPclkDiv1;
///< 系统时钟初始化
Sysctrl_ClkInit(&stcCfg);
}
SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND);使用hc32l136固件库的函数配置SysTick;
8. 然后编译整个工程会出现如下错误
这个时候我们只需要将interrupt_hc32l13x.c里面的HardFault_Handle和SysTick_Handle两个函数注释掉,再将system_hc32l13x.c里面的main函数注释掉,然后再编译整个工程就可以正确通过了;
9. 这时候就可以将裸机代码里面的闪烁点灯代码改成一个线程
static void rt_led1_thread_entry(void *parameter)
{
while(1){
///< LED点亮
Gpio_SetIO(STK_LED_PORT, STK_LED_PIN);
rt_thread_delay(100);
///< LED关闭
Gpio_ClrIO(STK_LED_PORT, STK_LED_PIN);
rt_thread_delay(100);
}
}
10. 在main函数中创建一个闪烁点灯线程
int32_t main(void)
{
///< LED端口初始化
App_LedInit();
led1_thread = rt_thread_create("led1", rt_led1_thread_entry, RT_NULL, 256, 3, 10);
if (led1_thread != RT_NULL) {
rt_thread_startup(led1_thread);
}
else {
return -1;
}
}
11. 编译整个工程有报错出现
这是因为使用了rt_thread_create函数,这个函数动态创建线程需要用到堆,所以需要在rtconfig.h中打开使用堆的宏 #define RT_USING_HEAP,然后编译整个工程就没有问题了,更改我们想要的线程阻塞延时时间编译工程,下载代码,就可以看到想要的LED闪烁效果了