使用HC32L136移植RT_Thread

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闪烁效果了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值