[APM32F4] 【APM32F402R Micro-EVB开发板测评】APM32F402R Micro-EVB开发板移植RT-Thread教程

[复制链接]
 楼主| hbzjt2011 发表于 2025-8-1 15:41 | 显示全部楼层 |阅读模式
本帖最后由 hbzjt2011 于 2025-8-2 14:10 编辑

1. 开发板简介
APM32F402R Micro-EVB V1.0开发板是极海半导体推出的基于APM32F402R芯片的评估板。APM32F402R是一款基于ARM Cortex-M4内核的32位微控制器,具有以下特点:
  • ARM Cortex-M4F内核,最高主频128MHz
  • 集成FPU浮点运算单元
  • 丰富的外设接口
  • 工业级温度范围
2. RT-Thread简介
RT-Thread 是一个开源的实时操作系统(RTOS),最初由中国开发者陈祥于2006年创建,专为嵌入式系统设计,具有小巧、稳定、可裁剪、易移植等特点。它支持多种架构(如 ARM Cortex-M/R/A、RISC-V、MIPS、x86 等),广泛应用于物联网、工业控制、智能家居、车载电子等领域。
RT-Thread 的主要特点包括:
  • 内核轻量高效
    RT-Thread 的内核设计精简,典型内核最小占用仅几 KB,适用于资源受限的微控制器。
  • 组件化设计
    系统由内核、驱动框架、中间件和应用层组件构成,用户可按需裁剪和配置,实现高效资源利用。
  • 丰富的软件生态
    拥有 RT-Thread Studio IDERT-Thread Smart(类 Linux 系统)RT-Thread Nano(超轻量内核) 等多个版本,配套的 RT-Thread 软件包管理器(PKG) 支持快速集成网络协议栈(如 TCP/IP、MQTT)、文件系统(如 FAT、LittleFS)、图形界面、设备驱动等。
  • 友好的开发体验
    提供图形化配置工具、完善的文档和活跃的社区支持。兼容 POSIX 部分接口,便于传统软件移植。
  • 支持主流开发环境和芯片平台
    支持 Keil、IAR、GCC 等开发工具链,已移植至 STM32、NXP、TI、Nordic、GD、Geehy、瑞萨、ESP32 等大量主流芯片。



RT-Thread目前已经支持极海的部分芯片和开发板,具体如下:
97378688b3470bdd31.png

3. 移植过程
3.1 开发工具
开发环境
  • IDE: Keil MDK-ARM 5.24及以上版本
  • 调试器: 板载CMSIS DAP Link 调试器
  • 开发板: APM32F402R Micro-EVB V1.0
  • 编译器: ARM Compiler 5.06 或 ARM Compiler 6,以及Env工具(官网下载

3.2 获取RT-Thread源码下载完整源码
  1. git clone https://github.com/RT-Thread/rt-thread.git

3.3 复制基础工程
从\rt-thread\bsp\apm32目录复制相似MCU工程为apm32f402rb-evalboard
16570688b38be124b0.png
使用Keil打开工程,目录如下,同时更改Device为APM32F402RB,并相应选择对应的调试下载工具
38558688b396378c20.png 78947688b39839d054.png
98516688b3b2a49724.png

接下来检查工程目录下的SConstruct文件中的库文件是否与开发板芯片相对应,如果复制的同系列型号则无需更改
89021688c4752e122e.png

修改\rt-thread\bsp\apm32\libraries\APM32F4xx_Library目录下的SConscript文件,注意将库文件均替换为APM32F402_403_StdPeriphDriver中标准库文件 70366688c6db603087.png

接下来修改board/目录下的KConfig文件,主要修改芯片型号并根据实际情况添加/删除片上外设
26757688c527ec8201.png

修改board/目录下的SConstruct文件
72825688c6d4e17abe.png

在board.h文件中修改Flash和SRAM的大小,分别为128KB和32KB
70795688c5413c314b.png

修改\board\linker_scripts\link.sct文件中的Flash和SRAM大小
31913688c552c37204.png

使用scons --target=mdk5命令重新生成工程文件
11197688c5594e046f.png

9297688c6e3d1df44.png


board.c和board.h文件:
  1. /*
  2. * Copyright (c) 2006-2022, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date           Author       Notes
  8. * 2020-08-20     Abbcc        first version
  9. */

  10. #include "board.h"

  11. void apm32_usart_init(void)
  12. {
  13.     GPIO_Config_T GPIO_ConfigStruct = {0U};

  14. #ifdef BSP_USING_UART1
  15.     RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA);
  16.     RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_USART1);

  17.     GPIO_ConfigStruct.mode = GPIO_MODE_AF_PP;
  18.     GPIO_ConfigStruct.pin = GPIO_PIN_9;
  19.     GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz;
  20.     GPIO_Config(GPIOA, &GPIO_ConfigStruct);

  21.     GPIO_ConfigStruct.mode = GPIO_MODE_IN_FLOATING;
  22.     GPIO_ConfigStruct.pin = GPIO_PIN_10;
  23.     GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz;
  24.     GPIO_Config(GPIOA, &GPIO_ConfigStruct);
  25. #endif

  26. #ifdef BSP_USING_UART2
  27.     RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOA);
  28.     RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_USART2);

  29.     GPIO_ConfigStruct.mode = GPIO_MODE_AF;
  30.     GPIO_ConfigStruct.pin = GPIO_PIN_2;
  31.     GPIO_ConfigStruct.otype = GPIO_OTYPE_PP;
  32.     GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz;
  33.     GPIO_Config(GPIOA, &GPIO_ConfigStruct);
  34.     GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_2, GPIO_AF_USART2);

  35.     GPIO_ConfigStruct.mode = GPIO_MODE_AF;
  36.     GPIO_ConfigStruct.pin = GPIO_PIN_3;
  37.     GPIO_ConfigStruct.pupd = GPIO_PUPD_UP;
  38.     GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz;
  39.     GPIO_Config(GPIOA, &GPIO_ConfigStruct);
  40.     GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_3, GPIO_AF_USART2);
  41. #endif
  42. }

  43. void apm32_msp_can_init(void *Instance)
  44. {
  45. #if defined(BSP_USING_CAN1) || defined(BSP_USING_CAN2)
  46.     GPIO_Config_T  GPIO_InitStructure;
  47.     CAN_T *CANx = (CAN_T *)Instance;

  48.     if (CAN1 == CANx)
  49.     {
  50.         RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_CAN1);

  51.         RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOB);

  52.         /* PB8: CAN1_RX, PB9: CAN1_TX */
  53.         GPIO_InitStructure.pin = GPIO_PIN_8 | GPIO_PIN_9;
  54.         GPIO_InitStructure.mode = GPIO_MODE_AF;
  55.         GPIO_InitStructure.otype = GPIO_OTYPE_PP;
  56.         GPIO_InitStructure.speed = GPIO_SPEED_100MHz;
  57.         GPIO_InitStructure.pupd = GPIO_PUPD_UP;
  58.         GPIO_Config(GPIOB, &GPIO_InitStructure);

  59.         GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_8, GPIO_AF_CAN1);
  60.         GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_9, GPIO_AF_CAN1);
  61.     }
  62.     else if (CAN2 == CANx)
  63.     {
  64.         /* When using the CAN2 peripheral, the CAN1 clock must be turned on */
  65.         RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_CAN1);
  66.         RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_CAN2);

  67.         RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOB);

  68.         /* PB12: CAN2_RX, PB13: CAN2_TX */
  69.         GPIO_InitStructure.pin = GPIO_PIN_12 | GPIO_PIN_13;
  70.         GPIO_InitStructure.mode = GPIO_MODE_AF;
  71.         GPIO_InitStructure.otype = GPIO_OTYPE_PP;
  72.         GPIO_InitStructure.speed = GPIO_SPEED_100MHz;
  73.         GPIO_InitStructure.pupd = GPIO_PUPD_UP;
  74.         GPIO_Config(GPIOB, &GPIO_InitStructure);

  75.         GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_12, GPIO_AF_CAN2);
  76.         GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_13, GPIO_AF_CAN2);
  77.     }
  78. #endif
  79. }
  1. /*
  2. * Copyright (c) 2006-2022, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date           Author         Notes
  8. * 2022-03-28     Abbcc          first version
  9. */

  10. #ifndef __BOARD_H__
  11. #define __BOARD_H__

  12. #include <rtthread.h>
  13. #include <apm32f402_403.h>

  14. #include "apm32f402_403_gpio.h"
  15. #include "apm32f402_403_rcm.h"
  16. #include "apm32f402_403_misc.h"
  17. #include "apm32f402_403_rcm.h"
  18. #include "apm32f402_403_eint.h"
  19. #include "apm32f402_403_usart.h"

  20. #if defined(RT_USING_ADC)
  21.     #include "apm32f402_403_adc.h"
  22. #endif
  23. #if defined(RT_USING_DAC)
  24.     #include "apm32f402_403_dac.h"
  25. #endif
  26. #if defined(RT_USING_RTC)
  27.     #include "apm32f402_403_rtc.h"
  28.     #include "apm32f402_403_pmu.h"
  29. #endif
  30. #if defined(RT_USING_SPI)
  31.     #include "apm32f402_403_spi.h"
  32. #endif
  33. #if defined(RT_USING_HWTIMER) || defined(RT_USING_PWM)
  34.     #include "apm32f402_403_tmr.h"
  35. #endif
  36. #if defined(RT_USING_WDT)
  37.     #include "apm32f402_403_iwdt.h"
  38.     #include "apm32f402_403_wwdt.h"
  39. #endif
  40. #if defined(RT_USING_CAN)
  41.     #include "apm32f402_403_can.h"
  42. #endif

  43. #include "drv_common.h"
  44. #include "drv_gpio.h"

  45. #ifdef __cplusplus
  46. extern "C" {
  47. #endif

  48. #define APM32_FLASH_START_ADRESS     ((uint32_t)0x08000000)
  49. #define APM32_FLASH_SIZE             (128 * 1024)
  50. #define APM32_FLASH_END_ADDRESS      ((uint32_t)(APM32_FLASH_START_ADRESS + APM32_FLASH_SIZE))

  51. /* Internal SRAM memory size[Kbytes] <6-128>, Default: 128 */
  52. #define APM32_SRAM_SIZE      32
  53. #define APM32_SRAM_END       (0x20000000 + APM32_SRAM_SIZE * 1024)

  54. #if defined(__ARMCC_VERSION)
  55. extern int Image$RW_IRAM1$ZI$Limit;
  56. #define HEAP_BEGIN      ((void *)&Image$RW_IRAM1$ZI$Limit)
  57. #elif __ICCARM__
  58. #pragma section="CSTACK"
  59. #define HEAP_BEGIN      (__segment_end("CSTACK"))
  60. #else
  61. extern int __bss_end;
  62. #define HEAP_BEGIN      ((void *)&__bss_end)
  63. #endif

  64. #define HEAP_END        APM32_SRAM_END

  65. void SystemClock_Config(void);

  66. void apm32_usart_init(void);

  67. #ifdef __cplusplus
  68. }
  69. #endif

  70. #endif /* __BOARD_H__ */
main.c文件:
  1. /*
  2. * Copyright (c) 2006-2022, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date           Author       Notes
  8. * 2020-08-20     Abbcc        first version
  9. */

  10. #include <rtthread.h>
  11. #include <rtdevice.h>
  12. #include <board.h>

  13. /* defined the LED2 pin: PB6 */
  14. #define LED2_PIN    GET_PIN(B, 6)

  15. int main(void)
  16. {
  17.     uint32_t sysclock = 0;
  18.     /* set LED2 pin mode to output */
  19.     rt_pin_mode(LED2_PIN, PIN_MODE_OUTPUT);
  20.     /* Print system clock */
  21.     sysclock = RCM_ReadSYSCLKFreq();
  22.     rt_kprintf("System Clock: %d\n", sysclock);

  23.     while (1)
  24.     {
  25.         rt_pin_write(LED2_PIN, PIN_HIGH);
  26.         rt_thread_mdelay(500);
  27.         rt_pin_write(LED2_PIN, PIN_LOW);
  28.         rt_thread_mdelay(500);
  29.     }
  30. }
注意:drv_gpio和drv_usart中的时钟设置,以及GPIO的设置需要根据APM32F402进行相应的修改。

最后编译下载程序,可以看到打印输出和LED2交替闪烁。
65127688c704c172a6.png
绝影孤狼 发表于 2025-8-3 09:15 | 显示全部楼层
这个教程很详细,对于新手来说非常友好。按照步骤操作,应该能够顺利完成RT-Thread的移植。
迷雾隐者 发表于 2025-8-4 15:57 | 显示全部楼层
非常详细的教程,跟着步骤操作应该可以顺利完成RT-Thread的移植。
作业粉碎机 发表于 2025-8-6 16:33 | 显示全部楼层
这个教程很详细,对于想要在APM32F402R上运行RT-Thread的开发者来说非常有帮助。按照步骤操作,应该能够顺利完成移植。
梦境摆渡人 发表于 2025-8-7 20:46 | 显示全部楼层
这个教程非常详细,对于想要在APM32F402R Micro-EVB开发板上使用RT-Thread的朋友来说很有帮助。
复古留声机 发表于 2025-8-7 22:09 | 显示全部楼层
这个教程很详细,对于想要在APM32F402R上运行RT-Thread的开发者来说很有帮助。按照步骤操作,应该能够顺利移植。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:欢迎参与LabVIEW版块的讨论学习! 点我一键即达

255

主题

2826

帖子

44

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