返回列表 发新帖我要提问本帖赏金: 50.00元(功能说明)

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

[复制链接]
3511|2
 楼主| xhackerustc 发表于 2024-5-8 09:03 | 显示全部楼层 |阅读模式
本帖最后由 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源码
  1. https://gitee.com/rtthread/rt-thread.git

更新apm32f4xx标准库
观察bsp/apm32下各目录组成:
1.jpg
形如apm32mnxyz-board这样的都是板级支持包。再看看libraries目录:
2.jpg
Drivers目录是在APM官方std driver之上的适用于RT-Thread接口的一层glue层,而形如APM32F4xx_Library这样的应该来自apm官方sdk,不妨瞅瞅APM32F4xx_Library:
3.jpg
这四个目录”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:
  1. 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
  2. index 89994c2022..1a5bbf0f8a 100644
  3. --- a/bsp/apm32/libraries/APM32F4xx_Library/Device/Geehy/APM32F4xx/Source/gcc/startup_apm32f411.S
  4. +++ b/bsp/apm32/libraries/APM32F4xx_Library/Device/Geehy/APM32F4xx/Source/gcc/startup_apm32f411.S
  5. @@ -91,8 +91,9 @@ L_loop1:

  6.    bl  SystemInit
  7.    bl __libc_init_array
  8. -  bl  main
  9. -  bx  lr
  10. +  bl entry
  11. +L_loop3:
  12. +    b L_loop3
  13. .size  Reset_Handler, .-Reset_Handler

  14. // This is the code that gets called when the processor receives an unexpected interrupt.

修改bsp/apm32/apm32f411v-tinyboard/board/SConscript
这里需要修改下使用芯片相关的startup汇编源文件如下:
  1. if rtconfig.PLATFORM in ['gcc']:
  2.     src += [startup_path_prefix + '/APM32F4xx_Library/Device/Geehy/APM32F4xx/Source/gcc/startup_apm32f411.S']
再加上芯片定义
  1. # You can select chips from the list above
  2. CPPDEFINES = ['APM32F411']


修改bsp/apm32/apm32f411v-tinyboard/board/linker_scripts/link.lds
编主要是修改flash和sram大小
  1. MEMORY
  2. {
  3.     CODE (rx) : ORIGIN = 0x08000000, LENGTH = 512k  /* 512KB flash */
  4.     DATA (rw) : ORIGIN = 0x20000000, LENGTH = 128k  /* 128KB sram */
  5. }
以及startup code所在section,因为我下载的apm SDK中默认汇编写的startup code所在section名字为.apm32_isr_vector
  1.         KEEP(*(.apm32_isr_vector))      /* Startup code */


修改bsp/apm32/apm32f411v-tinyboard/applications/main.c
根据板子原理图有两LED,笔者选用LED2,它接到PE6引脚:
  1. /* defined the LED2 pin: PE6 */
  2. #define LED2_PIN    GET_PIN(E, 6)
然后加点打印多显示一点信息,也区分其它板子bsp
  1. #if defined(__CC_ARM)
  2.     rt_kprintf("using armcc, version: %d\n", __ARMCC_VERSION);
  3. #elif defined(__clang__)
  4.     rt_kprintf("using armclang, version: %d\n", __ARMCC_VERSION);
  5. #elif defined(__ICCARM__)
  6.     rt_kprintf("using iccarm, version: %d\n", __VER__);
  7. #elif defined(__GNUC__)
  8.     rt_kprintf("using gcc, version: %d.%d\n", __GNUC__, __GNUC_MINOR__);
  9. #endif
  10.     rt_kprintf("APM32F411V HelloWorld\r\n");


编译&烧录
  1. cd bsp/apm32/apm32f411v-tinyboard/
  2. scons --menuconfig
  3. scons -j8
会在当前目录生成rtthread.bin文件,烧录之:
  1. pyocd load -e sector -t apm32f411ve rtthread.bin


运行截图
5.jpg

打赏榜单

Gfan 打赏了 50.00 元 2024-07-17
理由:APM32F411V Tiny测评活动优质测评帖

lemonhub 发表于 2024-5-26 09:07 | 显示全部楼层
能否提供一下完整的工程代码文件
星辰大海不退缩 发表于 2024-6-22 20:49 | 显示全部楼层
给主线RT-Thread添加支持需要硬件支持嘛?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

166

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部