ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

RT-Thread 在 Microchip SAM 系列 MCU 上的移植与调试:基于 Atmel Start 的完整工程工作流

RT-Thread 在 Microchip SAM 系列 MCU 上的移植与调试:基于 Atmel Start 的完整工程工作流 操作系统嵌入式物联网嵌入式OSRTOS【免费下载链接】rt-threadRT-Thread is an open source IoT Real-Time Operating System (RTOS). https://rt-thread.github.io/rt-thread/项目地址https://gitcode.com/gh_mirrors/rt/rt-thread点击查看免费下载本文以 RT-Thread 仓库中 bsp/microchip/README.md 为骨架系统讲解如何在 Microchip SAMARM Cortex-M 系列MCU 上完成 RT-Thread 的 BSP 移植从 Atmel Start 在线配置外设、把生成的代码工程接入 RT-Thread 源码树、用 RT-Thread env 工具编译到使用 Microchip Studio 7 导入目标文件调试最后落到 CAN 驱动等实际外设的使用与仓库内源码级实现。读完本文你将掌握一条可复制的 SAM MCU RT-Thread 开发流水线并能在仓库中直接找到对应的参考实现。1. Microchip SAM BSP 概览支持的芯片系列README 第 1 节给出了该 BSP 官方声明的支持范围覆盖四代 ARM Cortex-M 内核内核系列芯片型号关键特性ARM Cortex-M23saml103.3V 超低功耗ARM Cortex-M23saml113.3V 超低功耗 TrustZoneARM Cortex-M0samc215V支持 2 路 CAN-FDARM Cortex-M0saml213.3V 低功耗ARM Cortex-M0samd213.3V 工业级ARM Cortex-M4same543.3V120MHz Cortex-M4FCAN-FD / USB / EthernetARM Cortex-M7same703.3V300MHz Cortex-M7CAN-FD / 高速 USB / Ethernet从当前仓库源码看bsp/microchip 下已实际合入的 BSP 目录包括samc21、samd51-adafruit-metro-m4、samd51-seeed-wio-terminal、same54、same70、saml10外加一个多 BSP 共享的common目录和存放截图素材的doc目录。README 列表中提到的 saml11、saml21、samd21 系列尚未以独立 BSP 目录形式合入当前仓库移植时可参照已合入的同内核系列工程例如 samd21 可参考 samd51 的目录结构。以 same70 的 README_zh.md 为例SAME70Q21B 为 300MHz Cortex-M7 内核、2MB Flash、384KB RAM内置双精度 FPU、16KB I-Cache / 16KB D-Cache、GMAC 以太网、USB 2.0 HS、2 路 MCANCAN-FD等外设是文档移植示例中的旗舰参考平台。2. BSP 目录结构applications / board / bsp 三层职责README 对 Microchip BSP 的目录职责划分如下applications用户main函数入口、驱动示例如 i2c、can、adc 等、应用示例board用户板级初始化、用户驱动适配代码如 console 串口设备、以太网设备bspMCU 的 BSP 文件——启动文件、外设驱动、配置头文件和链接脚本由 start.atmel.com 生成禁止手动修改。该结构在每个子 BSP 中完全一致例如 same70 的 SConscript 是顶层构建入口依次引入applications、board、bsp三个子目录的 SConscript其中bsp目录内是 Atmel Start 生成的原生驱动hal/、hpl/、hri/、config/、atmel_start.c、driver_init.c等。仓库中还额外提供了一个common 共享层用于避免各子 BSP 重复维护用户侧代码bsp/microchip/common/applicationsadc_demo.c、can_demo.c、i2c_demo.c、lwip_demo.c四个外设示例bsp/microchip/common/boardserial.c串口 console 驱动、sam_i2c.c、sam_gmac.c以太网驱动。common 层的构建脚本 common/board/SConscript 会根据配置宏动态裁剪源码未开启SAM_I2C_EXAMPLE时移除sam_i2c.c未开启SAM_LWIP_EXAMPLE时移除sam_gmac.c避免无用驱动进入编译。3. 移植第一步在 Atmel Start 上配置工程Atmel Start 是 Microchip 的在线工程配置工具start.atmel.com。README 给出了完整配置流程打开 Atmel Start点击CREATE NEW PROJECT创建新工程。输入 MCU 型号Part Number选择具体器件后点击CREATE NEW PROJECT创建。在工程中添加STDIO以及其他需要的驱动 / 中间件如 CAN、I2C、ADC、以太网 PHY 等。配置STDIO 驱动串口、波特率等参数在此处确定。配置CAN 模块时钟CAN-FD 需要独立的时钟源与分频配置。配置CAN 模块驱动CAN0 与 CAN1 均可独立使能。添加LED 引脚描述供示例程序点灯使用对应LED0。重命名工程README 示例中最终命名为 SAME70 CAN Example。保存工程配置Atmel Start 会生成atmel_start_config.atstart等配置文件该文件后续可用于重新导入配置。导出工程源码包导出内容即上文第 2 节所说的bsp目录原生代码。关键提示导出的bsp目录为自动生成代码README 明确要求DO NOT modify it不要修改。后续所有 RT-Thread 相关的适配都应落在applications、board和构建脚本中。4. 移植第二步把生成的代码接入 RT-Thread 源码树README 第 2.2 节描述了以 SAME70 CAN Example 为例的接入步骤同样适用于其他 SAM 芯片下载 RT-Thread 源码并解压解压 Atmel Start 导出的 SAME70 CAN Example进入rt-thread/bsp/microchip目录复制same70文件夹并重命名为目标板卡名示例为same70q20——当前仓库中该 BSP 已直接以 bsp/microchip/same70 存在进入新目录删除除SConscript外的所有文件将 SAME70 CAN Example 导出的所有文件复制到same70q20/bsp目录修改rtconfig.py修改bsp/SConscript修改链接脚本bsp/same70b/gcc/gcc/same70q21b_flash.ld修改启动文件bsp/same70b/gcc/gcc/startup_same70q21b.c。前三处关键文件的修改点可以直接从仓库中的现成实现反推4.1 修改 rtconfig.py工具链与器件型号bsp/microchip/same70/rtconfig.py 展示了移植时必须对齐的三类信息架构ARCHarm、CPUcortex-m7器件型号宏DEVICE_SERIES SAME70、DEVICE_TYPE __SAME70Q21B__、DEVICE_PART same70其中DEVICE_TYPE会被 SConscript 作为CPPDEFINES注入编译供 ASF4 驱动头文件做器件判定交叉编译工具链CROSS_TOOL支持gcc/keil/iar三选一默认 gccEXEC_PATH指向各自编译器安装目录且允许通过环境变量RTT_CC、RTT_EXEC_PATH覆盖。gcc 分支下的编译参数同样值得关注可据实调整为你自己板卡的 FPU/内核DEVICE -mcpucortex-m7 -mthumb -mfpufpv5-d16 -mfloat-abihard -ffunction-sections -fdata-sections -mlong-calls LFLAGS DEVICE -Wl,--gc-sections,-Maprt-thread- DEVICE_PART .map,-cref,-u,Reset_Handler -T bsp/same70b/gcc/gcc/same70q21b_flash.ld其中-T指定的链接脚本正是第 8 步要修改的文件POST_ACTION会在链接后自动执行objcopy -O binary生成rt-thread-same70.bin并打印size结果。4.2 修改 bsp/SConscript把 ASF4 源码纳入编译bsp/microchip/same70/bsp/SConscript 展示了 Atmel Start 生成代码的编译组织方式用Glob(hal/src/*.c)、Glob(hpl/*/*.c)等批量收编 ASF4 的 HAL / HPL 层源码显式加入atmel_start.c、driver_init.c、ethernet_phy_main.c按rtconfig.PLATFORM选择启动文件gcc 用same70b/gcc/gcc/startup_same70q21b.carmcc 用startup_SAME70.siccarm 用startup_same70q21b.c通过CPPPATH把CMSIS/Core/Include、config、hal/include、hri、same70b/include等头文件目录加入搜索路径最后DefineGroup(Libraries, ...)成组挂入构建系统。移植新板卡时只需把上述路径中的same70/same70q21b替换为你导出的型号即可。4.3 修改链接脚本与启动文件链接脚本same70q21b_flash.ld确认 Flash2MB、RAM384KB的起始地址与大小与目标器件一致并核对HEAP_END、栈顶等符号保证rt_system_heap_init的堆区不越界启动文件startup_same70q21b.c确认中断向量表、Reset_Handler入口以及系统时钟初始化调用保证上电后能正确进入 C 运行时。4.4 板级初始化与 Kconfig 配置board/board.c 中的rt_hw_board_init()给出了 RT-Thread 侧的板级接入点其执行顺序是移植时的重要参考atmel_start_init()初始化 Atmel Start 生成的 MCU、驱动与中间件禁用看门狗WDT-WDT_MR WDT_MR_WDDIS使能 I-CacheSCB_EnableICache()初始化 USART 并取出io_descriptor作为 console 输出通道rt_hw_console_output最终调用io_writeSysTick_Config(CONF_CPU_FREQUENCY / RT_TICK_PER_SECOND)以系统主频为 SysTick 提供 RT-Thread 时钟节拍设置 PendSV 中断优先级、初始化堆、设置 console 设备、触发rt_components_board_init()。同目录的 Kconfig 则声明了SOC_SAME70配置项并select了ARCH_ARM_CORTEX_M7、RT_USING_COMPONENTS_INIT、RT_USING_USER_MAIN移植到其他 SAM 型号时需相应改为对应内核如 Cortex-M0/M23/M4。5. 移植第三步使用 RT-Thread env 工具编译完成上述文件适配后即可用 RT-Thread env 工具构建下载并解压 RT-Thread env 工具运行env.exe在 env 终端中切换到目标 BSP 目录如bsp/microchip/same70执行scons开始编译。README 特别提到编译过程可能遇到的错误及解决办法对应截图 2-3-4 / 2-3-5交叉编译器路径错误检查rtconfig.py中EXEC_PATH是否与本地 gcc 安装位置一致或改用环境变量RTT_EXEC_PATH覆盖器件宏不匹配确认DEVICE_TYPE、DEVICE_SERIES与导出的器件一致链接脚本符号缺失核对-T指定的 ld 文件与启动文件中Reset_Handler等符号是否对应头文件路径缺失对照bsp/SConscript的CPPPATH确保CMSIS、config、hri、hal等目录都已加入。修复后重新执行scons编译成功时会生成rt-thread-same70.elf与rt-thread-same70.bin由POST_ACTION自动产出同时打印镜像大小。6. 使用 Microchip Studio 7 调试 RT-Thread编译产物需要烧录调试README 第 3 节给出了基于 Microchip Studio 7Atmel Studio 的继承者的调试流程安装 Microchip Studio 7打开 Studio 7Open Object File for Debugging选择上一步生成的.elf目标文件填写工程名并选择保存位置选择正确的器件型号Part Number完成目标文件导入——导入后相关源码文件会自动链接到工程中便于单步跟踪右键工程进入属性配置debugger/programmer 工具并选择调试接口SWD 或 JTAG截图原文写作 JTGA正确拼写为 JTAG点击调试按钮启动调试即可设置断点、单步执行程序停在断点时可在Watch 窗口监视局部变量并在输出窗口查看 RT-Thread 的 console 打印。调试阶段可直接验证 RT-Thread 是否跑通观察rt_hw_board_init的堆初始化是否成功、MSH 命令行是否输出提示符、SysTick 节拍是否跳动。7. 重新配置 MCU BSPAtmel Start 配置回灌外设需求变化时不需要手工改驱动重新打开 Atmel Start上传upload之前保存的工程配置即atmel_start_config.atstart即可在网页端重新配置时钟、引脚、外设再次导出代码并覆盖 BSP 目录。README 第 4 节指出这正是 Atmel Start 工作流相对传统寄存器手工移植的核心优势——配置与代码生成闭环且生成的bsp目录保持“只读”用户改动始终集中在applications/board。8. SAM MCU BSP 配置与使用CAN 驱动深入README 第 5 节以SAMC2x / E5x / E70 的 CANCAN-FD驱动为例说明 BSP 使用方式配置截图见 doc/5-1-1-atmel-start-driver-can0.png 与 doc/5-1-1-atmel-start-driver-can1.png并指向 ASF4 API Reference Manual 的 CAN 章节。仓库中 common/applications/can_demo.c 是该文档所述 CAN 用法的完整可编译实现以下几点值得展开8.1 硬件实例映射示例通过宏区分平台统一 CAN 硬件句柄#if defined(SOC_SAMC21) || defined(SOC_SAME54) #define CAN_HARDWARE (void *)CAN1 #elif defined(SOC_SAME70) #define CAN_HARDWARE (void *)MCAN1 #else #error CAN undefined SOC Platform #endif8.2 滤波器设置can_demo_init()中必须至少设置一个标准帧与一个扩展帧滤波器再使能 CANfilter.id 0x469; /* 标准帧 ID 滤波 */ filter.mask 0; can_async_set_filter(CAN_0, 0, CAN_FMT_STDID, filter); filter.id 0x10000096; /* 扩展帧 ID 滤波29 位 */ filter.mask 0; can_async_set_filter(CAN_0, 0, CAN_FMT_EXTID, filter); can_async_enable(CAN_0);代码注释特别提醒若添加第二个标准帧滤波器index必须递增如设为 1否则会覆盖滤波器 0。8.3 中断回调与信号量同步can_tx_callback/can_rx_callback在中断上下文通过rt_sem_release唤醒 RT-Thread 信号量can_txdone/can_rxdoneCAN 接收线程can_thread_entry阻塞在rt_sem_take(can_rxdone, RT_WAITING_FOREVER)收到通知后用can_async_read循环读出 RX FIFO 中的全部报文。线程栈 512 字节、优先级为RT_THREAD_PRIORITY_MAX/3。8.4 错误状态处理错误回调can_err_callback覆盖了 CAN 协议层的五种典型状态并给出处理建议错误类型含义处理建议CAN_IRQ_EWError Warning错误计数达到 96提示总线受扰可加检测手段CAN_IRQ_EAError Active正常参与通信无需处理CAN_IRQ_EPError Passive错误计数大于 127只发被动错误帧需关注CAN_IRQ_BOBus Off发送错误计数 ≥ 256挂起 CAN 任务并can_async_init重新初始化CAN_IRQ_DOData Overrun接收队列溢出丢帧删除并重建 CAN 任务接收线程检测到CAN_IRQ_BO/CAN_IRQ_DO后会自动调用can_async_init(CAN_0, CAN_HARDWARE)复位 CAN 模块。8.5 对外接口can_send_message(struct can_message *msg, rt_uint32_t timeouts)封装了“写报文 等待发送完成信号量”的同步发送语义can_demo_run()负责创建收发信号量、注册回调、初始化滤波器并创建 CAN 线程。上层 applications/main.c 通过SAM_CAN_EXAMPLE宏开关决定是否调用can_demo_run()同理还有SAM_I2C_EXAMPLE、SAM_ADC_EXAMPLE、SAM_LWIP_EXAMPLE对应 i2c / adc / lwip 示例。9. 源码级纵览从启动到控制台的硬件抽象链除 CAN 外仓库还提供了串口、I2C、以太网三类常用外设的 RT-Thread 驱动可作为移植其他 SAM 芯片的模板串口 consolecommon/board/serial.c 基于 ASF4 的usart_async_descriptor实现了 RT-Thread 串口设备驱动serial_rxcallback/serial_txcallback在中断中调用rt_hw_serial_isr上报 RX 指示与 TX 完成事件并兼容 Serial V2 框架通过RT_USING_SERIAL_V2使用rt_ringbuffer_putchar_force收数I2Ccommon/board/sam_i2c.c 基于 ASF4i2c_m_sync实现以太网lwIPcommon/board/sam_gmac.c 将 ASF4 的mac_async_descriptor与ethernet_phy_descriptor包装成 RT-Thread 的eth_device注册名为e0rt_sam_eth_rx/rt_sam_eth_tx完成 pbuf 与 MAC 硬件的数据搬运RX 中断通过eth_device_ready通知协议栈PHY 链路监控由周期定时器或phy线程完成读取 BMSR 寄存器判断 10/100Mbps 与半/全双工并定时重启自动协商MAC 地址优先从 AT24MAC EEPROM通过 I2C 读取获取无 EEPROM 时回退为全0x11。10. 小结与延伸阅读整条 Microchip SAM 移植链路可以概括为Atmel Start 生成只读 BSP 驱动 → 目录规范化接入 RT-Thread 构建系统 → env 工具编译 → Studio 7 目标文件调试 → 配置回灌迭代外设。仓库内 bsp/microchip/same70以及 samc21、same54、saml10、samd51 两个开发板是这条链路各步骤的现成参考bsp/microchip/common 则集中了可在不同 SAM 芯片间复用的 RT-Thread 驱动与示例代码。如需在某个尚未合入的 SAM 型号上开展移植建议先按第 3 节在 Atmel Start 中导出目标器件代码再参照同内核系列的既有 BSPM7 参考 same70、M4 参考 same54、M0 参考 samc21、M23 参考 saml10逐项对齐rtconfig.py、bsp/SConscript、链接脚本与启动文件最后用 env 工具scons编译并用 Studio 7 调试验证。更完整的 ASF4 API 细节可查阅 Microchip 官方 ASF4 API Reference ManualSAM 器件文档目录下的 DeviceDoc 50002633B 等仓库 README 第 5 节亦指向该手册。赞分享操作系统嵌入式物联网嵌入式OSRTOS【免费下载链接】rt-threadRT-Thread is an open source IoT Real-Time Operating System (RTOS). https://rt-thread.github.io/rt-thread/项目地址https://gitcode.com/gh_mirrors/rt/rt-thread点击查看免费下载相关推荐RT-Thread 在 Seeed Wio TerminalMicrochip ATSAMD51P19A上的 BSP 移植指南RT Thread 在 Seeed Wio TerminalMicrochip ATSAMD51P19A上的 BSP 移植指南 本篇技术指南以 RT Thr操作系统嵌入式物联网嵌入式OSRTOSRT-Thread 在 Microchip SAME70Q21B 上的 BSP 移植与应用实战指南RT Thread 在 Microchip SAME70Q21B 上的 BSP 移植与应用实战指南 导读 本文围绕 RT Thread 开源仓库中 bsp/m操作系统嵌入式物联网嵌入式OSRTOSRT-Thread 下 Microchip SAML10 的 EDBG USART 控制台通信基于 Atmel Start 异步串口驱动的回显实战RT Thread 下 Microchip SAML10 的 EDBG USART 控制台通信基于 Atmel Start 异步串口驱动的回显实战 导读 本文操作系统嵌入式物联网嵌入式OSRTOS创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表