打印
[活动]

【APM32F411V Tiny Board测评】如何给主线RT-Thread添加支持

[复制链接]
1082|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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


运行截图


使用特权

评论回复
沙发
lemonhub| | 2024-5-26 09:07 | 只看该作者
能否提供一下完整的工程代码文件

使用特权

评论回复
板凳
星辰大海不退缩| | 2024-6-22 20:49 | 只看该作者
给主线RT-Thread添加支持需要硬件支持嘛?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

53

帖子

0

粉丝