资讯详情

资讯详情

RIOT OS 在 STM32L496G-DISCO 开发板上的外设支持与引脚映射全解析

RIOT OS 在 STM32L496G-DISCO 开发板上的外设支持与引脚映射全解析【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT导读本文以 RIOT 操作系统中stm32l496g-disco板级支持包BSP为核心系统讲解 STM32L496G-DISCO 评估板的硬件资源、当前已支持与尚未支持的外设清单、按外设与按连接器两种视角的完整引脚映射表并结合板级源码periph_conf.h、board.h等深入解析 ADC/DAC/SPI/UART 的复用冲突、焊桥solder bridge切换机制与 FMC 总线上的 PSRAM/LCD 挂载细节。读完本文你将能够在 RIOT 下针对该板正确选用外设模块、避开引脚冲突并掌握烧录固件的基本流程。开发板概览STM32L496G-DISCODiscovery 系列评估板的核心是意法半导体基于 ARM Cortex-M4 的超低功耗 MCU STM32L496AG片上资源为320 KB RAM 1 MB ROM Flash。从 板级文档 可知该板的主要板载特性包括1.54 英寸 RGB 240×240 像素 TFT 彩色 LCD带电容触摸屏SAI 音频编解码器立体声输出含模拟麦克风输入立体声数字麦克风8-Mbit 外部 PSRAM64-Mbit 外部 QSPI FlashUSB OTG FS 接口8 位摄像头接口DCMI立体声耳机插孔micro-SD 卡连接器在 RIOT 中该板的板级支持目录为 boards/stm32l496g-disco其中 Makefile.features 声明了CPU stm32、CPU_MODEL stm32l496ag并提供了包括periph_adc、periph_dac、periph_dma、periph_fmc、periph_i2c、periph_pwm、periph_sdmmc、periph_spi、periph_uart、periph_usbdev在内的大量外设特性同时提供 Arduino 兼容引脚arduino_analog、arduino_pins、riotboot与tinyusb_device等板级特性。当前硬件支持状态板级文档给出了 RIOT 对该板外设的支持矩阵。其中标记为X的表示已支持标记为-的表示尚未支持特性支持备注ADCX8 个通道DACX1 或 2 个通道I2CX2 个设备I2C1 与 I2C2PWMX3 个设备共 6 个通道SPIX1 或 2 个设备SPI1 与 SPI2定时器X2 个设备TIM2 与 TIM3UARTX3 个设备USART2、LPUART1 与 USART1USB OTG FSX1 个设备TFT 彩色 LCD 240×240-驱动 IC 为 ST7789H2文档标注时尚未支持电容触摸屏-驱动 IC 为 FT3267文档标注时尚未支持立体声麦克风-SAI 音频编解码器-外部 PSRAMX连接到 FMC 外设外部 Quad-SPI Flash-QSPI 外设尚未支持SD 卡接口-SDMMC1 位于 PC8..PC13/PD2源码视角的更新值得注意的是文档中的“尚未支持”标记反映的是文档撰写时的状态。从当前仓库源码看LCD 与触摸屏的驱动支持已实际落地board.h 中定义了完整的ST77XX_PARAM_*参数ST77XX_PARAM_CNTRL ST77XX_CNTRL_ST7789、ST77XX_PARAM_SPI SPI_UNDEF即使用 8080 并行接口以及FT5X06_PARAM_*触摸参数Makefile.dep 中disp_dev模块会拉入st7789touch_dev模块会拉入ft5x06并分别通过lcd_parallel_16bit、lcd_parallel_ll_mcu与periph_fmc_nor_sram支撑并行 LCD 访问。因此读者在后续章节看到的 LCD/触摸配置属于仓库当前实现层面的内容。按外设排序的板级配置文档核心章节给出了按 RIOT 外设排列的完整引脚映射表。这是编写驱动、配置 SAUL 与编写应用时最重要的参考表RIOT 外设GPIO连接器引脚备注ADC_LINE(0)PC4Arduino A0ADC1 IN13ADC_LINE(1)PC1Arduino A1ADC1 IN2ADC_LINE(2)PC3Arduino A2ADC1 IN4ADC_LINE(3)PF10Arduino A3ADC3 IN13ADC_LINE(4)PA1Arduino A4ADC1 IN6ADC_LINE(5)PC0Arduino A5ADC2 IN13ADC_LINE(6)-V_REF_INTADC1 IN0 连接到 V_REFINTADC_LINE(7)PA4STmod ADC未启用periph_dac时为 ADC1 IN9ADC_LINE(7)--启用periph_dac时为连接到 DAC1 的 ADC2 IN17DAC_LINE(0)PA4STmod ADC启用periph_dac时为 DAC1DAC_LINE(1)PA5Arduino D13未启用periph_spi时为 DAC2I2C_DEV(0) SCLPB8Arduino D15I2C1 SCL同时连接到 STmod SCLI2C_DEV(0) SDAPB7Arduino D14I2C1 SDA同时连接到 STmod SDAI2C_DEV(1) SCLPH14-I2C2 SCL用于 MFX_x、CODEC_x、CTP_x、DCMI_xI2C_DEV(1) SDAPB14-I2C2 SDA用于 MFX_x、CODEC_x、CTP_x、DCMI_xPWM_DEV(0) CH0PH15Arduino D3TIM8_CH3NPWM_DEV(0) CH1PI6Arduino D6TIM8_CH2PWM_DEV(0) CH2PH13Arduino D9TIM8_CH1NPWM_DEV(1) CH0PB9Arduino D5TIM4_CH4PWM_DEV(2) CH0PA0STmod PWMTIM5_CH1SPI_DEV(0) SCKPA5Arduino D13SPI1 SCKSPI_DEV(0) MISOPB4Arduino D12SPI1 MISOSPI_DEV(0) MOSIPB5Arduino D11SPI1 MOSISPI_DEV(0) CSPA15Arduino D10SPI1 NSSSPI_DEV(1) SCKPI1STmod CLK, Pmod CLKSPI2 SCK*1SPI_DEV(1) MISOPI2STmod MISO, Pmod MISOSPI2 MISO*1SPI_DEV(1) MOSIPB15STmod MOSI, Pmod MOSISPI2 MOSI*1SPI_DEV(1) CSPG1STmod CS, Pmod CSSPI2 NSS*1UART_DEV(0) RXPD6ST-LinkUSART2 RXUART_DEV(0) TXPA2ST-LinkUSART2 TXUART_DEV(1) RXPD6Arduino D0LPUART1 RXUART_DEV(1) TXPA2Arduino D1LPUART1 TXUART_DEV(2) RXPG10STmod RX, Pmod RXUSART1 RX*2UART_DEV(2) TXPB6STmod TX, Pmod TXUSART1 TX*2UART_DEV(2) CTSPG11STmod CTS, Pmod CTSUSART1 CTS*2UART_DEV(2) RTSPG12STmod RTS, Pmod RTSUSART1 RTS*2注*1SPI2 仅在启用模块periph_spi_stmod时可用。需闭合焊桥 SB4、SB5、SB9 才能把 SPI2 连接到 STmod 与 Pmod 连接器。注*2USART1 仅在未使用模块periph_spi_stmod时可用。需闭合焊桥 SB6、SB7、SB8 才能把 USART1 连接到 STmod 与 Pmod 连接器此为默认状态。该表与 periph_conf.h 中的adc_config[]、dac_config[]、i2c_config[]、pwm_config[]、spi_config[]、uart_config[]数组逐项对应。例如uart_config[]中 USART2ST-Link 虚拟串口使用rx_pin PD6、tx_pin PA2并挂载 DMA1 Channel 7LPUART1Arduino D0/D1使用rx_pin PG8、tx_pin PG7注意此时 Arduino 头引脚 D0/D1 实际走的是 LPUART1 而非普通 USART。关键复用冲突源码确认结合源码可以更精确地理解上述备注背后的硬件复用关系PA4STmod ADC三态复用在 periph_conf.h 中adc_config[]最后一个通道由MODULE_PERIPH_DAC决定——未启用 DAC 时映射为ADC1_IN9引脚 PA4启用 DAC 时该 ADC 通道退化为ADC2_IN17连接到 DAC1 内部输出同时 PA4 由dac_config[]接管为DAC_LINE(0)。同理DAC_LINE(1) 占用 PA5而 PA5 正是 SPI1 的 SCK因此文档注明 DAC2 仅在未使用periph_spi时可用。SPI2 与 USART1 互斥spi_config[]中的第二个设备被#if MODULE_PERIPH_SPI_STMOD包裹uart_config[]中的 USART1 则被#if !MODULE_PERIPH_SPI_STMOD包裹。二者通过 Pmod/STmod 连接器上同一组焊桥实现硬件层面的互斥切换。ADC 通道的共享标注注释中出现的ADC12_IN13、ADC123_IN2等写法表示该通道可由多个 ADC 设备共享采样例如 A1 引脚的ADC123_IN2表示通道 2 可被 ADC1/2/3 任一路使用而代码中固定选择了dev 0ADC1。V_REFINT 与 V_BATadc_config[]中GPIO_UNDEF的两个条目分别是 ADC1_IN0V_REFINT内部参考电压输出与 ADC1_IN18V_BAT对应VREFINT_ADC ADC_LINE(6)与VBAT_ADC ADC_LINE(7)宏periph_conf.h。参考电压VREFBUF说明板级源码对 ADC/DAC 的参考电压做了专门说明板上 V_REF 引脚默认不接外部参考电压而是通过内部 VREFBUF 提供约2.048 V的输出VREFBUF_ENABLE1periph_conf.h。如果需要改用外部参考电压——例如焊接 R18 以 V_DDA 为参考或闭合焊桥 SB2 使用 Arduino 连接器的 AVVD 引脚——则必须定义VREFBUF_ENABLE0禁用内部缓冲。该宏由用户通过编译期定义传入是影响 ADC 满量程电压与 DAC 输出电压精度的关键配置项。按连接器排序的板级配置当需要从 Arduino、Pmod、STmod 等连接器角度查找某引脚对应的 RIOT 外设时使用下表同样完整继承自板级文档连接器RIOT 外设GPIO备注Arduino A0ADC_LINE(0)PC4ADC1 IN13Arduino A1ADC_LINE(1)PC1ADC1 IN2Arduino A2ADC_LINE(2)PC3ADC1 IN4Arduino A3ADC_LINE(3)PF10ADC3 IN13Arduino A4ADC_LINE(4)PA1ADC1 IN6Arduino A5ADC_LINE(5)PC0ADC2 IN13Arduino D0UART_DEV(1) RXPD6LPUART1 RXArduino D1UART_DEV(1) TXPA2LPUART1 TXArduino D3PWM_DEV(0) CH0PH15TIM8_CH3NArduino D6PWM_DEV(0) CH1PI6TIM8_CH2Arduino D5PWM_DEV(1) CH0PB9TIM4_CH4Arduino D9PWM_DEV(0) CH2PH13TIM8_CH1NArduino D10SPI_DEV(0) CSPA15SPI1 CSArduino D11SPI_DEV(0) MOSIPB5SPI1 MOSIArduino D12SPI_DEV(0) MISOPB4SPI1 MISOArduino D13SPI_DEV(0) SCKPA5SPI1 SCKArduino D13DAC_LINE(1)PA5未使用periph_spi时为 DAC2Arduino D14I2C_DEV(0) SDAPB7I2C1 SDAArduino D15I2C_DEV(0) SCLPB8I2C1 SCLPmod SPI CLKSPI_DEV(1) SCKPI1SPI2 SCK*1Pmod SPI CSSPI_DEV(4) CSPG1SPI2 NSS*1Pmod SPI MISOSPI_DEV(2) MISOPI2SPI2 MISO*1Pmod SPI MOSISPI_DEV(3) MOSIPB15SPI2 MOSI*1Pmod UART CTSUART_DEV(2) CTSPG11USART1 CTS*2Pmod UART RTSUART_DEV(2) RTSPG12USART1 RTS*2Pmod UART RXUART_DEV(2) RXPG10USART1 RX*2Pmod UART TXUART_DEV(2) TXPB6USART1 TX*2STmod ADCADC_LINE(7)PA4未使用periph_dac时为 ADC1 IN9STmod ADCDAC_LINE(0)PA4使用periph_dac时为 DAC1STmod PWMPWM_DEV(2) CH0PA0TIM5_CH1STmod I2C SCLI2C_DEV(0) SCLPB8I2C2 SCLSTmod I2C SDAI2C_DEV(0) SDAPB7I2C2 SDASTmod SPI CLKSPI_DEV(1) SCKPI1SPI2 SCK*1STmod SPI CSSPI_DEV(1) CSPG1SPI2 NSS*1STmod SPI MISOSPI_DEV(1) MISOPI2SPI2 MISO*1STmod SPI MOSISPI_DEV(1) MOSIPB15SPI2 MOSI*1STmod UART CTSUART_DEV(2) CTSPG11USART1 CTS*2STmod UART RTSUART_DEV(2) RTSPG12USART1 RTS*2STmod UART RXUART_DEV(2) RXPG10USART1 RX*2STmod UART TXUART_DEV(2) TXPB6USART1 TX*2ST-LinkUART_DEV(0) RXPD6USART2 RXST-LinkUART_DEV(0) TXPA2USART2 TX注*1SPI2 仅在启用模块periph_spi_stmod时可用需闭合焊桥 SB4、SB5、SB9。注*2USART1 仅在未使用periph_spi_stmod时可用需闭合焊桥 SB6、SB7、SB8默认。Arduino 引脚映射源码对应arduino_iomap.h 给出了 MCU 引脚到 Arduino 数字/模拟引脚的完整映射数字引脚ARDUINO_PIN_0~ARDUINO_PIN_15对应 D0~D15模拟引脚ARDUINO_PIN_16~ARDUINO_PIN_21即ARDUINO_PIN_A0~ARDUINO_PIN_A5分别落在 PC4、PC1、PC3、PF10、PA1、PC0 上与上述连接器表一致。同时该文件还提供了 Arduino 模拟引脚到 RIOT ADC 线的映射宏ARDUINO_A0 ADC_LINE(0)等这使得基于arduino_analog/arduino_pins特性的应用可以直接以ARDUINO_PIN_A0之类的名字操作引脚。板载设备与板级初始化LCDST7789 并行接口板级文档将 LCD 列为“尚未支持”但当前仓库的 board.h 已定义完整的并行 LCD 支持屏幕尺寸LCD_SCREEN_WIDTH 240、LCD_SCREEN_HEIGHT 240数据总线LCD_D0~LCD_D15与 FMC 数据线复用详见下文 FMC 小节控制信号LCD_WE、LCD_OE、LCD_RS、LCD_NE分别对应 PD5、PD4、PD13、PD7ST77XX_PARAM_CNTRL ST77XX_CNTRL_ST7789且ST77XX_PARAM_SPI SPI_UNDEF明确告知 st77xx 驱动该实例不走 SPI 总线而是走 8080 并行接口背光通过 PI0 引脚HIGH 有效LD_BL控制board.c 在board_init()中完成背光引脚初始化LCD 电源由 LOW 有效的LD_PWR_ONPH0控制board_init()在启用st77xx或ft5x06模块时会先拉低该引脚以点亮 VDD_LCD。由于 LCD 采用 8080 并行总线Makefile.dep 规定启用st7789模块时必须同时引入lcd_parallel_16bit、lcd_parallel_ll_mcu并要求periph_fmc_nor_sram特性。另外文档注释提到 LCD 复位信号LCD_RESET由 MFX GPIO2 提供由于 MFX 尚未支持复位信号通过上拉与悬空输入默认电平保证驱动可正常工作LCD_RST GPIO_UNDEF。电容触摸屏触摸屏驱动 IC 在板级文档中记录为 FT3267而当前 board.h 的触摸配置则面向FT6236FT5X06_PARAM_TYPE FT5X06_TYPE_FT6X36通过 I2C_DEV(1)即 I2C2连接中断引脚为 PG14坐标映射采用先交换 XY 再镜像 Y 的方式FT5X06_SWAP_XY | FT5X06_MIRROR_Y最大坐标与屏幕分辨率一致240×240。这与 periph_conf.h 中 I2C2 总线上挂载 CTP_x电容触摸面板的描述相互印证。在 Makefile.dep 中touch_dev模块会自动依赖ft5x06使用触摸功能时无需手动选择驱动。I2C2 总线上的多设备共存I2C2PH14/SCL PB14/SDA被设计为板载功能扩展总线periph_conf.h 注释中列出了其上的设备及 I2C 地址MFX多功能扩展器— 地址 0x42Cirrus Logic CS42L51-CNZ 立体声编解码器CODEC_x— 地址 0x4aAD00电容触摸面板CTP_xFT6206 — 地址 0x38数字摄像头模块DCMI_x。因此应用若要与板载传感器/外设通信应优先使用I2C_DEV(1)并注意地址占用。LED 与摇杆按键board.h 定义了板上 3 个用户 LED 与 5 向摇杆按键LD1橙色HIGH 有效但连接在 MFX GPIO4 上不能直接使用LD2绿色PB13HIGH 有效即LED0_PINLD3绿色PA5LOW 有效LED1_IS_INVERTED 1摇杆CenterPC13、LeftPI9、DownPI10、RightPF11、UpPI8全部配置为GPIO_IN_PD内部下拉输入。这些 GPIO 在 gpio_params.h 中被注册为 SAUL 直连 GPIO 设备saul_gpio_params[]名为LD2、LD3以及Joystick (Center)等。因此当应用引入saul_default模块时Makefile.dep 会自动追加saul_gpio即可通过 SAUL registry 直接读写 LED 与读取摇杆状态。FMC 总线上的 PSRAM 与 LCD外部 8-Mbit PSRAM 与 LCD 共享 FMCFlexible Memory Controller总线periph_conf.h 中的fmc_config与fmc_bank_config[]详细定义了这套挂载关系PSRAMIS66WV51216EBLL-70BLI512K×16 bit挂在 Bank 1、subbank 2映射地址0x6400000016 位总线采用异步访问 Mode 1 时序地址建立 6 HCLK、数据建立 2 HCLK、总线周转 1 HCLK适配 70 ns 访问时间LCD挂在 Bank 1、subbank 1映射地址0x60000000同样 16 位总线命令与数据通过地址偏移区分——lcd_fmc_desc[]规定命令地址偏移0x00x60000000、数据地址偏移0x800000x60080000其写时序针对 ST7789H2 的参数t_AST/t_DST/t_WRL/t_WRH/t_WRC做了专门配置。这也解释了 Makefile.include 中FMC_RAM_ADDR0x64000000、FMC_RAM_LEN1024K的来源PSRAM 被暴露为 1 MiB 的 FMC 内存区域。启用periph_fmc模块时Makefile.dep 会要求periph_fmc_16bit特性。SD 卡与文件系统虽然板级文档将 SD 卡接口标记为“尚未支持”当前仓库已具备相应配置periph_conf.h 定义了sdmmc_config[]SDMMC1 使用 PC12CLK、PD2CMD、PC8~PC11DAT0~DAT3卡检测引脚CD未直接连接接在 MFX GPIO8 上故为GPIO_UNDEF并可选挂载 DMA2 Channel 4。构建层面Makefile.dep 在引入mtd模块时会自动添加mtd_sdmmc_default与periph_sdmmc在引入vfs_default时默认采用fatfs_vfsmtd组合即开箱即用的 FATFS 文件系统。烧录固件板级文档说明该板的 RIOT 板名为stm32l496g-discovery与目录名stm32l496g-disco略有差异烧录时以板名为准。从 Makefile.include 可以看到烧录链路的关键配置默认编程器为openocd调试适配器为板载stlinkPROGRAMMER ? openocd、OPENOCD_DEBUG_ADAPTER ? stlink支持riotboot引导默认RIOTBOOT_LEN 0x20008 KB若启用usbus_dfu或tinyusb_dfu则需扩为0x400016 KB。典型烧录命令在 RIOT 应用目录下执行# 指定目标板也可在应用 Makefile 中设置 BOARD BOARDstm32l496g-discovery make flash # 如需使用串口监视 BOARDstm32l496g-discovery make term由于 Makefile.include 通过INCLUDES -I$(RIOTBOARD)/common/stm32/include复用 STM32 板级公共配置片段时钟、启动与链接相关的细节由boards/common/stm32统一维护Kconfig 则通过select BOARD_HAS_LSE声明该板具备外部低速晶振LSE与 periph_conf.h 中CONFIG_BOARD_HAS_LSE 1的定义保持一致这对 RTC/RTT 的精确计时至关重要。小结STM32L496G-DISCO 在 RIOT 中的板级支持已相当完整CPU 侧提供 ADC8 线、DAC、双 I2C、三路 PWM 定时器、双 SPI、三路 UART含 LPUART 与硬件流控、USB OTG、FMCPSRAM 并行 LCD、SDMMC 等特性板载 LCD 与触摸屏的驱动配置也已随 st77xx/ft5x06 模块落地。实际使用时最重要的是牢记两处互斥关系——PA4 上的 ADC/DAC 复用与SPI2/USART1 在 Pmod/STmod 连接器上的焊桥切换并留意 PA5 在 SPI1 SCK 与 DAC2 之间的冲突。结合本文提供的两张引脚映射表与 periph_conf.h、board.h 源码即可在 RIOT 下为该板正确、高效地开发外设应用。【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →