本帖最后由 xhackerustc 于 2024-5-8 21:53 编辑
#申请原创# @21小跑堂
本来想移植nuttx这款RTOS的,但恰好近一个月以来RT-Thread玩得比较多,所以练手目标改成RT-Thread了。大家想必有一个问题:APM官方sdk Examples/RTOS目录带了RT-Thread例子要移植啥?首先官方sdk那里是RT-Thread nano版,其次这就和各大厂商有自己linux内核仓库有自家芯片bsp,但又同时做主线linux内核一样。主线RT-Thread中目前还无APM32F411的支持,笔者本人以前从来没有独自给RT-Thread添加新芯片支持,这次就以这个任务来练练手。
clone最新RT-Thread源码
- https://gitee.com/rtthread/rt-thread.git
更新apm32f4xx标准库
观察bsp/apm32下各目录组成:
形如apm32mnxyz-board这样的都是板级支持包。再看看libraries目录:
Drivers目录是在APM官方std driver之上的适用于RT-Thread接口的一层glue层,而形如APM32F4xx_Library这样的应该来自apm官方sdk,不妨瞅瞅APM32F4xx_Library:
这四个目录”APM32F4xx_ETH_Driver APM32F4xx_StdPeriphDriver CMSIS Device“大概率来自apm官方sdk。目前git log显示最近一次APM32F4xx_Library和apm sdk同步还是2023年一月,所以要支持APM32F411最好和APM的SDk同步下,直接从APM SDK那边拷贝过来。
新建bsp/apm32/apm32f411v-tinyboard目录
当然也不会从无到有创建此目录,最好以一个比较相似的芯片开发板为蓝本,仿照目录结构布局创建,比如笔者就选的apm32f407ig-minibroard
修改bsp/apm32/libraries/APM32F4xx_Library/Device/Geehy/APM32F4xx/Source/gcc/startup_apm32f411.S
apm官方SDK默认是裸机环境,汇编初始化结束后跳转到main函数,但是RT-Thread通常是跳转到entry这个函数,需要做点修改应用于RT-Thread:
- diff --git a/bsp/apm32/libraries/APM32F4xx_Library/Device/Geehy/APM32F4xx/Source/gcc/startup_apm32f411.S b/bsp/apm32/libraries/APM32F4xx_Library/Device/Geehy/APM32F4xx/Source/gcc/startup_apm32f411.S
- index 89994c2022..1a5bbf0f8a 100644
- --- a/bsp/apm32/libraries/APM32F4xx_Library/Device/Geehy/APM32F4xx/Source/gcc/startup_apm32f411.S
- +++ b/bsp/apm32/libraries/APM32F4xx_Library/Device/Geehy/APM32F4xx/Source/gcc/startup_apm32f411.S
- @@ -91,8 +91,9 @@ L_loop1:
- bl SystemInit
- bl __libc_init_array
- - bl main
- - bx lr
- + bl entry
- +L_loop3:
- + b L_loop3
- .size Reset_Handler, .-Reset_Handler
- // This is the code that gets called when the processor receives an unexpected interrupt.
修改bsp/apm32/apm32f411v-tinyboard/board/SConscript
这里需要修改下使用芯片相关的startup汇编源文件如下:
- if rtconfig.PLATFORM in ['gcc']:
- src += [startup_path_prefix + '/APM32F4xx_Library/Device/Geehy/APM32F4xx/Source/gcc/startup_apm32f411.S']
再加上芯片定义- # You can select chips from the list above
- CPPDEFINES = ['APM32F411']
修改bsp/apm32/apm32f411v-tinyboard/board/linker_scripts/link.lds
编主要是修改flash和sram大小
- MEMORY
- {
- CODE (rx) : ORIGIN = 0x08000000, LENGTH = 512k /* 512KB flash */
- DATA (rw) : ORIGIN = 0x20000000, LENGTH = 128k /* 128KB sram */
- }
以及startup code所在section,因为我下载的apm SDK中默认汇编写的startup code所在section名字为.apm32_isr_vector
- KEEP(*(.apm32_isr_vector)) /* Startup code */
修改bsp/apm32/apm32f411v-tinyboard/applications/main.c
根据板子原理图有两LED,笔者选用LED2,它接到PE6引脚:
- /* defined the LED2 pin: PE6 */
- #define LED2_PIN GET_PIN(E, 6)
然后加点打印多显示一点信息,也区分其它板子bsp
- #if defined(__CC_ARM)
- rt_kprintf("using armcc, version: %d\n", __ARMCC_VERSION);
- #elif defined(__clang__)
- rt_kprintf("using armclang, version: %d\n", __ARMCC_VERSION);
- #elif defined(__ICCARM__)
- rt_kprintf("using iccarm, version: %d\n", __VER__);
- #elif defined(__GNUC__)
- rt_kprintf("using gcc, version: %d.%d\n", __GNUC__, __GNUC_MINOR__);
- #endif
- rt_kprintf("APM32F411V HelloWorld\r\n");
编译&烧录
- cd bsp/apm32/apm32f411v-tinyboard/
- scons --menuconfig
- scons -j8
会在当前目录生成rtthread.bin文件,烧录之:
- pyocd load -e sector -t apm32f411ve rtthread.bin
运行截图
|