尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

RT-Thread RV32M1 VEGA 板级支持包(BSP)实战指南:编译、烧写与驱动支持解析

RT-Thread RV32M1 VEGA 板级支持包(BSP)实战指南:编译、烧写与驱动支持解析 操作系统嵌入式物联网嵌入式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/rv32m1_vega板级支持包BSP为核心系统讲解 RV32M1 VEGA 多核 RISC-V 开发板的硬件构成、工具链编译流程、JLink/OpenOCD 烧写与串口验证方法并结合 BSP 源码深入剖析 UART、GPIO、时钟与 SD 卡驱动的实现细节。阅读完成后你将能够独立完成该开发板 RT-Thread 环境的搭建、固件烧写与运行验证并掌握在此基础上扩展外设驱动的代码路径。1. 开发板与 BSP 概览RV32M1 VEGA 是 Open-ISA 社区推出的一款多核异构 RISC-V 32 位开发板片上同时集成两个 RISC-V 32 位核心RV32IMC 与 RV32IEMC 构架并带有 BLE 外设。其硬件核心参数如下表所示| 硬件 | 描述 | | -- | -- | | 芯片型号 | RV32M1 | | CPU | RV32IMC带 post-incrementing load/store 扩展、乘累加multiply-accumulate扩展、ALU 扩展与硬件循环hardware loops | | | RV32IEMC | | 主频 | 48MHz 或 72MHz | | 片内 SRAM | 256kB 128kB | | 片内 Flash | 1MB 256kB |在 RT-Thread 仓库中该 BSP 位于 bsp/rv32m1_vega中文说明见 bsp/rv32m1_vega/README_zh.md英文说明见 bsp/rv32m1_vega/README.md。BSP 目录整体分为两个部分ri5cy/面向 RI5CY 核心的工程主体包含应用层applications、板级初始化board与设备驱动driver以及编译相关的SConscript、Kconfig、link.lds、rtconfig.h、rtconfig.pyrv32m1_sdk_riscv/NXP 官方 SDK 的 RISC-V 移植版本包含设备头文件RV32M1_ri5cy.h、RV32M1_zero_riscy.h、系统初始化、启动文件startup_RV32M1_ri5cy.S、startup_RV32M1_zero_riscy.S、外设驱动库fsl_*.c/h与 SD 卡协议栈sdmmc_2.1.2。从工程结构看BSP 采用的是「RT-Thread 驱动框架 芯片厂商 SDK 底层库」的分层方式驱动层如drv_uart.c、drv_gpio.c只负责把 RT-Thread 的设备模型接口映射到 NXP 的fsl_*库函数上层应用无需关心寄存器细节。2. 编译说明2.1 工具链要求BSP 当前测试采用标准 GNU GCC 7.2.0 newlib 2.5.0工具链并按标准的RV32IMC构架编译——也就是说RV32M1 芯片自带的扩展指令如后递增 load/store、乘累加、硬件循环等在本 BSP 中默认未启用仅使用基础指令集以保证工具链的通用性。RT-Thread ENV 版本为 1.0。工具链的构架参数可以在 bsp/rv32m1_vega/ri5cy/rtconfig.py 中确认交叉编译前缀为riscv-none-embed-ARCH risc-v、CPU rv32m1编译与链接均带-marchrv32imc -mabiilp32链接参数-nostartfiles -Wl,--gc-sections,-Maprtthread.map,-cref,-u,Reset_Handler -T link.lds指定了链接脚本 bsp/rv32m1_vega/ri5cy/link.lds入口为Reset_Handler默认构建类型为debug-O0 -gdwarf-2如需优化可在rtconfig.py中切换为 release-O2 -Os工具链搜索路径可通过环境变量RTT_ROOT、RTT_CC、RTT_EXEC_PATH覆盖。2.2 使用 ENV 编译Windows 上推荐使用 ENV 工具在 console 中进入 BSP 工程目录并执行scons工程根目录为bsp/rv32m1_vega/ri5cy该目录下的 SConscript 会递归收集applications、board、driver等子目录中带SConscript的模块参与构建。如果编译正确无误会在工程目录下生成rtthread.elf带调试符号的 ELF 映像rtthread.bin需要烧写到设备 Flash 中运行的二进制映像。2.3 配置裁剪工程支持 Kconfig 菜单配置menuconfig。BSP 的配置入口见 bsp/rv32m1_vega/ri5cy/KconfigSOC_VEGA_RI5CY自动select ARCH_RISCVBOARD_X_FRDM_VEGA默认开启RT_USING_COMPONENTS_INIT与RT_USING_USER_MAIN驱动层的配置项由 bsp/rv32m1_vega/ri5cy/driver/Kconfig 通过rsource引入。当前工程默认配置保存在 bsp/rv32m1_vega/ri5cy/rtconfig.h 中其中与板级直接相关的开关有BSP_USING_UART0、BSP_USING_UART1使能两路 LPUART 串口RT_USING_PIN使能 GPIO/PIN 驱动RT_USING_DFSRT_USING_DFS_ELMFATRT_USING_DFS_DEVFS使能文件系统与设备文件系统启动日志中的File System initialized!即源于此RT_USING_MSH/FINSH_USING_MSH使能 msh 命令行终端RT_USING_CONSOLE、RT_CONSOLE_DEVICE_NAME uart0控制台默认输出到uart0PKG_USING_MICROPYTHON默认还集成了 MicroPython 语言包堆大小PKG_MICROPYTHON_HEAP_SIZE 8192。3. 烧写与执行3.1 硬件连接烧写需要准备 JLink 调试器与两根 USB 线JTAG 连接将 JLink 接入 RV32M1 VEGA 开发板 RISC-V 核的 JTAG 接口。该接口位于 RV32M1 芯片与天线座子旁边是一个小 20pin JTAG 接口同时需要把 JLink 在 PC 上的驱动更改为WinUSB 模式以便 OpenOCD 等工具能够直接访问。串口连接使用 USB 线连接到开发板上标记为SDA的 USB 口PC 上即会出现一个串口设备。用115200-N-8-1波特率 115200、无校验、8 数据位、1 停止位的配置打开该串口即可看到系统输出。设备使用的串口引脚为[PTC7/PTC8]对应 LPUART0。3.2 烧写固件当正确编译产生rtthread.bin映像后可以使用 gdb 连接到 openocd并以load命令将映像烧写到 Flash典型流程为启动 OpenOCD加载 RV32M1 RISC-V 核的 JTAG 配置启动 gdb连接 OpenOCD 的 gdb 服务端口加载rtthread.elf执行load命令写入 Flash按开发板上的SW1复位按钮复位设备。关于 JTAG 使用、gdb 调试 RV32M1 VEGA 开发板的完整细节如 OpenOCD 配置、WinUSB 驱动切换步骤建议参考开发板官方提供的《RV32M1_Vega_Develop_Environment_Setup》开发环境搭建文档以及《RV32M1_VEGA_Board_User_Guide》用户手册与芯片《Reference Manual and Data Sheet》数据手册。3.3 运行结果如果编译与烧写均无误按SW1复位后串口上会看到 RT-Thread 的启动 logo 信息\ | / - RT - Thread Operating System / | \ 4.0.0 build Dec 5 2018 2006 - 2018 Copyright by rt-thread team File System initialized! Hello RT-Thread! msh /日志含义解读前三行为 RT-Thread 内核启动 logo版本 4.0.0构建日期 2018-12-05File System initialized!表示 DFS FatFs 文件系统组件初始化完成Hello RT-Thread!来自应用入口 bsp/rv32m1_vega/ri5cy/applications/main.cmain()函数中调用rt_kprintf(Hello RT-Thread!\n)msh /表示进入了 RT-Thread 的 msh 命令行终端此时即可在串口输入help、list_device、list_thread等命令进行交互。3.4 板级初始化流程源码视角复位后系统的板级初始化由 bsp/rv32m1_vega/ri5cy/board/board.c 中的rt_hw_board_init()完成执行顺序为BOARD_InitPins()完成引脚复用配置见第 5 节BOARD_BootClockRUN()与CLOCK_InitLpFll()初始化时钟LPFLL 被配置为72MHz档kSCG_LpFllRange72MINTMUX_Init()/INTMUX_EnableInterrupt()初始化中断多路复用rt_hw_uart_init()注册串口设备rt_hw_systick_init()配置系统节拍——CLOCK_SetIpSrc(kCLOCK_Lpit0, kCLOCK_IpSrcFircAsync)选择时钟源再调用SystemSetupSystick(RT_TICK_PER_SECOND, 0)对应 rtconfig.h 中RT_TICK_PER_SECOND 100即每秒 100 次 tick节拍周期 10msLPIT0 的中断服务函数LPIT0_IRQHandler()通过rt_tick_increase()驱动内核时钟设置控制台设备uart0并初始化堆内存堆区定义见 bsp/rv32m1_vega/ri5cy/board/board.h从__bss_end__到0x20000000 0x30000 - 0x1800最后执行rt_components_board_init()完成组件级初始化。4. 驱动支持情况与源码解析BSP 当前对外设的驱动支持情况如下驱动支持情况备注UART支持UART0RX(PTC7)TX(PTC8)支持UART1RX(PTA25)TX(PTA26)clock支持GPIO支持列表可能不完善同时也需要按照使用到的 IO 调整 pinmux、clockMMC/SD支持下面结合 BSP 源码逐项解析各驱动的实现路径便于在此基础上扩展或排查问题。4.1 UART 串口驱动串口驱动实现在 bsp/rv32m1_vega/ri5cy/driver/drv_uart.c基于 NXP 的 LPUART 外设设备注册rt_hw_uart_init()遍历uarts[]表以RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX标志注册uart0LPUART0与uart1LPUART1两个串口设备每个设备对应一个中断号LPUART0_IRQHandler/LPUART1_IRQHandler分别转发给uart_isr()。参数配置uart_configure()将 RT-Thread 的serial_configure波特率、数据位、停止位、校验位映射到 LPUART 的寄存器配置——数据位支持 7/8 位kLPUART_SevenDataBits/kLPUART_EightDataBits、停止位支持 1/2 位、校验支持无/奇/偶默认波特率来自RT_SERIAL_CONFIG_DEFAULT串口时钟源统一选择kCLOCK_IpSrcFircAsync。收发与中断uart_putc()写入一个字节并等待发送寄存器空标志uart_getc()读取接收寄存器uart_isr()在接收数据寄存器满时调用rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND)触发接收事件并处理溢出overrun标志的清除——这正是控制台与 msh 能实时回显的关键。4.2 GPIO / PIN 驱动GPIO 驱动实现在 bsp/rv32m1_vega/ri5cy/driver/drv_gpio.c通过rt_device_pin_register(pin, vega_pin_ops, RT_NULL)注册为 RT-Thread PIN 设备由INIT_BOARD_EXPORT(rt_hw_pin_init)自动初始化引脚映射vega_pin_map[]把 RT-Thread 的逻辑引脚号1160映射到 GPIOA/B/C/D/E 的物理引脚例如逻辑引脚 24 对应 PTA23、逻辑引脚 73 对应 PTC8模式控制vega_pin_mode()支持输出、输入、输入上拉PIN_MODE_INPUT_PULLUPconfig_value 0x5030U、输入下拉、开漏输出PIN_MODE_OUTPUT_OD等模式并自动使能对应 PORT 时钟读写vega_pin_read()/vega_pin_write()通过GPIO_ReadPinInput/GPIO_SetPinsOutput完成高低电平操作中断支持vega_pin_attach_irq()绑定回调vega_pin_irq_enable()按 GPIO 端口使能对应 PORTAPORTE 中断gpio_isr()统一清除中断标志并回调用户注册的hdr函数。使用示例rt_pin_write(LED_RED, PIN_HIGH)点亮红灯rt_pin_read(BTN_SW3)读取按键电平。4.3 时钟clock时钟配置集中在 bsp/rv32m1_vega/ri5cy/board/board.c 与 bsp/rv32m1_vega/ri5cy/board/clock_config.c 中BOARD_BootClockRUN()完成系统时钟初始化g_appScgLpFllConfig_BOARD_BootClockRUN将 LPFLL 校准到 72MHz并提供分频配置项div1/div2/div3各外设LPUART、LPIT、SDHC通过CLOCK_SetIpSrc()选择自己的时钟源再以CLOCK_GetIpFreq()获取实际频率用于波特率与传输时钟计算。4.4 MMC/SD 卡SD 卡驱动实现在 bsp/rv32m1_vega/ri5cy/driver/drv_sdcard.c基于 USDHC0 控制器与 SDK 的sdmmc_2.1.2协议栈rt_hw_sdcard_init()将 SDHC0 时钟源设为kCLOCK_IpSrcLpFllAsync初始化sd_card_thost 基地址USDHC0、时钟频率来自CLOCK_GetIpFreq(kCLOCK_Sdhc0)调用SD_Init(card)探测并初始化 SD 卡初始化成功后读取 0 号扇区解析分区表dfs_filesystem_get_partition若存在分区则挂载 FatFsFile System initialized!日志即由此而来读写通过vega_sdcard_read/write转发到SD_ReadBlocks/SD_WriteBlocksvega_sdcard_control上报块大小与扇区数等几何信息卡检测引脚配置在 bsp/rv32m1_vega/ri5cy/board/board.hPTC27上升沿中断SDHC0 数据/时钟/命令引脚PTD6PTD11的复用配置见pin_mux.c。5. IO 在板级支持包中的映射情况BSP 中预定义的 IO 映射如下表所示| IO 号 | 板级代码中的定义 | | -- | -- | | PTA22 | LED_BLUE | | PTA23 | LED_GREEN | | PTA24 | LED_RED | | PTA24 | LED_STS | | PTA25 | UART1_RX | | PTA26 | UART1_TX | | PTE8 | BTN_SW3 | | PTE9 | BTN_SW4 | | PTE12 | BTN_SW5 | | PTA0 | BTN_SW2/BTN_NMI |这些定义对应的底层引脚复用配置在 bsp/rv32m1_vega/ri5cy/board/pin_mux.c 的BOARD_InitPins()中完成LPUART0PTC7/PTC8 配置为kPORT_MuxAlt3复用RX/TXLPUART1PTA25/PTA26 配置为kPORT_MuxAlt2复用RX/TXSDHC0PTD6PTD11 配置为kPORT_MuxAlt2并使能内部上拉kPORT_PullUp、快速压摆率kPORT_FastSlewRate、低驱动强度LED 引脚PTA22/PTA23/PTA24 配置为 GPIO 功能kPORT_MuxAsGpioSD 卡检测PTC27 配置为 GPIO 输入。两点使用提醒源自 BSP 文档说明GPIO 支持列表可能不完善——如果你使用的 IO 不在默认映射中需要手动调整pin_mux.c中的引脚复用pinmux与时钟使能clock使其匹配实际外设功能README中的LED_STS与LED_RED同为 PTA24这是板级文档中记录的原始映射实际使用前建议对照开发板原理图确认。6. 参考与进一步探索BSP 中文说明bsp/rv32m1_vega/README_zh.md英文说明bsp/rv32m1_vega/README.md工程入口与配置bsp/rv32m1_vega/ri5cy/rtconfig.py、bsp/rv32m1_vega/ri5cy/rtconfig.h、bsp/rv32m1_vega/ri5cy/Kconfig、bsp/rv32m1_vega/ri5cy/link.lds板级初始化bsp/rv32m1_vega/ri5cy/board/board.c、bsp/rv32m1_vega/ri5cy/board/pin_mux.c设备驱动bsp/rv32m1_vega/ri5cy/driver/drv_uart.c、bsp/rv32m1_vega/ri5cy/driver/drv_gpio.c、bsp/rv32m1_vega/ri5cy/driver/drv_sdcard.c应用示例bsp/rv32m1_vega/ri5cy/applications/main.c芯片 SDK 与启动文件bsp/rv32m1_vega/rv32m1_sdk_riscv/RISCV/core_riscv32.h、bsp/rv32m1_vega/rv32m1_sdk_riscv/devices/RV32M1/gcc/startup_RV32M1_ri5cy.S官方还提供了《RV32M1 VEGA Board User Guide》开发板用户手册、芯片数据手册RV32M1DS与开发环境搭建等文档涉及更完整的硬件原理与调试细节可在 Open-ISA 社区资料中查阅。对本 BSP 而言以上仓库内文件已经覆盖了从编译、烧写到驱动定制的完整闭环可直接作为二次开发的基础。赞分享操作系统嵌入式物联网嵌入式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 LPC408x 板级支持包BSP使用指南编译、烧写与驱动配置RT Thread LPC408x 板级支持包BSP使用指南编译、烧写与驱动配置 RT Thread 的 LPC408x BSP 是基于 NXP LPC4操作系统嵌入式物联网嵌入式OSRTOSRT-Thread 在 ACM32F4xx 上的板级支持包BSP开发指南编译、烧写与驱动配置RT Thread 在 ACM32F4xx 上的板级支持包BSP开发指南编译、烧写与驱动配置 本篇技术指南围绕 RT Thread 仓库中 bsp/acm操作系统嵌入式物联网嵌入式OSRTOSRT-Thread RV32M1_VEGA 板级支持包实战指南多核 RISC-V 开发板的编译、烧写与驱动解析RT Thread RV32M1_VEGA 板级支持包实战指南多核 RISC V 开发板的编译、烧写与驱动解析 RT Thread 开源仓库中提供了针对恩智浦操作系统嵌入式物联网嵌入式OSRTOS创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表