源码准备
获取 HC32L196 的裸机工程
首先,获取 HC32L196 的裸机工程,可以通过小华半导体有限公司的网站 xhsc.com.cn 下载 HC32L19x_DDL_Rev1.2.0。
下载 RT-Thread Nano 源码
RT-Thread Nano 源码可以通过官网 rt-thread.org 下载。
移植步骤
1. 复制 HC32L196 裸机源码
使用 gpio_output
例程文件。
HC32L19x_DDL_Rev1.2.0\example\gpio\gpio_output\source
HC32L19x_DDL_Rev1.2.0\driver
HC32L19x_DDL_Rev1.2.0\mcu\common
2. 通过 IAR 建立工程
使用 IAR 的 ewp
项目文件和 eww
工程文件,通过工具进行导入。
3. 开始编译并解决问题
- 在 IAR 中,依次进行以下设置:
- 选择
Options/General Options/Target/Device/HC32L19x
(在 XHSC 中)。 - 在
Options/General Options/Library Configuration
中,将 Library 等级改为 Full,并在 CMSIS (legacy) 中勾选Use CMSIS 5.7
。
- 选择
- 以上操作后,无编译错误。
4. 复制 nano-3.1.5 源码
- 删除
libcpu
中除m0
外的其他架构。因为使用IAR,context_gcc.S
与context_rvds.S
也删除 - 在
bsp
中只保留board.c
与rtconfig.h
。
5. 编译并处理剩余报错
- RT-Thread 会接管异常处理函数
HardFault_Handler()
和悬挂处理函数PendSV_Handler()
,这两个函数已由 RT-Thread 实现,需要删除工程中的中断服务例程文件中的这两个函数,避免在编译时产生重复定义错误。如果编译没有出现重复定义错误,则无需修改。 - 除以上两个外,
SysTick_Handler()
和__low_level_init()
也可能重复,需要一并处理。
6. 编写点灯程序
- 打开
main.c
,由于电路板 LED 灯为 B10,将board_stkhc32l19x.h
中定义做对应修改:
///< LED
#define STK_LED_PORT GpioPortB
#define STK_LED_PIN GpioPin10
-
点灯成功后,引入非阻塞延时,至此移植 RT-Thread Nano 到 HC32L196 成功。
-
注意:因为RT-Thread改写了时间处理,所以混用原来的延时函数会导致异常
int32_t main(void) { ///< LED端口初始化 App_LedInit(); while(1) { ///< LED点亮 Gpio_SetIO(STK_LED_PORT, STK_LED_PIN); // delay1ms(1000); rt_thread_mdelay(1000); ///< LED关闭 Gpio_ClrIO(STK_LED_PORT, STK_LED_PIN); // delay1ms(1000); rt_thread_mdelay(1000); } }
后续工作
- 系统时钟配置
- 内存堆初始化
- 创建线程
- printf 重定向
- 其他功能实现
至此,已经完成了 RT-Thread Nano 到 HC32L196 的移植,接下来可以继续进行其他功能的开发和优化。