rt-thread驱动篇(02)---STM32F429板卡外设驱动添加
目录
参考链接
前言
一、外设驱动
1、片上外设
2、板载外设
二、外设驱动添加
1、配置CubeMX工程
2、修改Kconfig
3、添加ports文件,修改SConscript
三、外设配置总结
参考链接
STM32 系列外设驱动添加指南
前言
- 此次制作的BSP使用的板卡我司自己开发的板卡,不方便放上来,但是是仿的正点原子阿波罗开发板,外设都差不多,单片机型号为429IGT6,大家看的时候可以参考阿波罗开发板硬件
- 整个驱动篇的源码可以私聊我或是从这里下载
一、外设驱动
对一个 BSP 而言,有如下三类驱动:
- 板载外设驱动:指 MCU 之外,开发板上外设,例如 TF 卡、以太网和 LCD 等
- 片上外设驱动:指 MCU 芯片上的外设,例如硬件定时器、ADC 和看门狗等
- 扩展模块驱动:指可以通过扩展接口或者杜邦线连接的开发板的模块,例如 ESP8266 模块
对于要添加的板卡,有如下外设:
1、片上外设
序号 |
驱动 |
外设 |
1 |
GPIO |
DO1~DO5、DI1~DI2 |
2 |
UART |
|
3 |
SPI |
SPI1(扩展使用)、SPI2(串口扩展芯片使用)、SPI4(扩展使用)、SPI5(W25Q使用,SPI5_SCK不是硬件SPI引脚,需要模拟,所以CubeMX没有开启) |
4 |
soft I2C |
I2C1(扩展使用)、I2C2(DS1340)、I2C3(扩展使用) |
5 |
TIMER |
TIM11、TIM13、TIM14 |
6 |
ADC |
ADC1_IN8(VI0)、ADC1_IN9(VI1) |
7 |
RTC |
设置和读取时间 |
8 |
WDT |
看门狗驱动 |
2、板载外设
序号 |
驱动 |
简介 |
1 |
SDIO |
通过 SDIO 读写TF卡 |
2 |
ETH PHY |
以太网 |
3 |
USB PHY |
USB |
4 |
LCD |
显示屏 |
二、外设驱动添加
添加步骤:
1、配置CubeMX工程
打开 \board\CubeMX_Config 目录下的CubeMX工程,按照原理图配置对应外设的引脚,完成外设时钟使能和管脚配置的工作并生成工程。外设初始化,中断配置,DMA配置等等则由 RT-Thread 提供的驱动文件来完成。也就是说,虽然 STM32CubeMX 生成了多个文件用来初始化外设,但 RT-Thread 只使用了 STM32CubeMX 生成的 stm32fxx_hal_msp.c 文件(存放了在 CubeMX 工具中开启的外设驱动的配置代码)和 stm32fxx_hal_conf.h文件(提供的宏开关会决定 HAL 库将哪些外设驱动添加到工程中)。最后配置完成的外设有:
2、修改Kconfig
修改\board\Kconfig文件,这样就可以通过menuconfig来选择需要使用的外设了
menu "Hardware Drivers Config"config SOC_STM32F429IGboolselect SOC_SERIES_STM32F4select RT_USING_COMPONENTS_INITselect RT_USING_USER_MAINdefault ymenu "Onboard Peripheral Drivers"config BSP_USING_COM1bool "Enable USART1"select BSP_USING_UARTselect BSP_USING_UART1default nconfig BSP_USING_COM6bool "Enable USART6"select BSP_USING_UARTselect BSP_USING_UART6default nconfig BSP_USING_COM7bool "Enable USART7"select BSP_USING_UARTselect BSP_USING_UART7default yconfig BSP_USING_SDRAMbool "Enable SDRAM"select BSP_USING_FMCdefault nconfig BSP_USING_SPI_FLASHbool "Enable SOFT-SPI FLASH (W25Q64)"select BSP_USING_SOFT_SPIselect RT_USING_SFUDselect RT_SFUD_USING_SFDPdefault nconfig PHY_USING_LAN8720Aboolconfig BSP_USING_ETHbool "Enable Ethernet (ETH_RST is PH3)"select RT_USING_LWIPselect PHY_USING_LAN8720Adefault nconfig BSP_USING_SDCARDbool "Enable SDCARD (sdio)"select BSP_USING_SDIOselect RT_USING_DFSselect RT_USING_DFS_ELMFATdefault nconfig BSP_USING_LCDbool "Enable RGB-LCD"select BSP_USING_LTDCselect BSP_USING_SDRAMdefault nconfig BSP_USING_TOUCHbool "Enable TOUCH Driver(TSC2046)"default nendmenumenu "On-chip Peripheral Drivers"config BSP_USING_GPIObool "Enable GPIO"select RT_USING_PINdefault ymenuconfig BSP_USING_UARTbool "Enable UART"default yselect RT_USING_SERIALif BSP_USING_UARTconfig BSP_USING_UART1bool "Enable UART1"default nconfig BSP_UART1_RX_USING_DMAbool "Enable UART1 RX DMA"depends on BSP_USING_UART1 && RT_SERIAL_USING_DMAdefault nconfig BSP_USING_UART6bool "Enable UART6"default nconfig BSP_UART6_RX_USING_DMAbool "Enable UART6 RX DMA"depends on BSP_USING_UART6 && RT_SERIAL_USING_DMAdefault nconfig BSP_USING_UART7bool "Enable UART7"default yconfig BSP_UART7_RX_USING_DMAbool "Enable UART7 RX DMA"depends on BSP_USING_UART7 && RT_SERIAL_USING_DMAdefault n endifconfig BSP_USING_ON_CHIP_FLASHbool "Enable on-chip FLASH"default nmenuconfig BSP_USING_SOFT_SPIbool "Enable SOFT SPI BUS"default nselect RT_USING_SOFT_SPIif BSP_USING_SOFT_SPIconfig BSP_USING_SOFT_SPI1bool "Enable SOFT SPI1:CS(PG10) SCK(PG12) MISO(PF8) MOSI(PF9)"default nendifmenuconfig BSP_USING_SPIbool "Enable SPI BUS"default nselect RT_USING_SPIif BSP_USING_SPIconfig BSP_USING_SPI1bool "Enable SPI1 BUS(extended use!!!)"default n config BSP_SPI1_TX_USING_DMAbool "Enable SPI1 TX DMA"depends on BSP_USING_SPI1default nconfig BSP_SPI1_RX_USING_DMAbool "Enable SPI1 RX DMA"depends on BSP_USING_SPI1select BSP_SPI1_TX_USING_DMAdefault n config BSP_USING_SPI2bool "Enable SPI2 BUS(use to extend uart!!!)"default n config BSP_SPI2_TX_USING_DMAbool "Enable SPI2 TX DMA"depends on BSP_USING_SPI2default nconfig BSP_SPI2_RX_USING_DMAbool "Enable SPI2 RX DMA"depends on BSP_USING_SPI2select BSP_SPI2_TX_USING_DMAdefault n config BSP_USING_SPI4bool "Enable SPI4 BUS(extended use!!!)"default n config BSP_SPI4_TX_USING_DMAbool "Enable SPI4 TX DMA"depends on BSP_USING_SPI4default nconfig BSP_SPI4_RX_USING_DMAbool "Enable SPI4 RX DMA"depends on BSP_USING_SPI4select BSP_SPI4_TX_USING_DMAdefault nendif menuconfig BSP_USING_I2C1bool "Enable I2C1 BUS (software simulation,extended use!!!)"default nselect RT_USING_I2Cselect RT_USING_I2C_BITOPSselect RT_USING_PINif BSP_USING_I2C1comment "Notice: PB8(SCL) --> 167; PB9(SDA) --> 168"config BSP_I2C1_SCL_PINint "I2C1 scl pin number"range 1 176default 167config BSP_I2C1_SDA_PINint "I2C1 sda pin number"range 1 176default 168endifmenuconfig BSP_USING_I2C2bool "Enable I2C2 BUS (software simulation,use to RTC(DS1340))"default nselect RT_USING_I2Cselect RT_USING_I2C_BITOPSselect RT_USING_PINif BSP_USING_I2C2comment "Notice: PH4(SCL) --> 45; PH5(SDA) --> 46"config BSP_I2C2_SCL_PINint "I2C2 scl pin number"range 1 176default 45config BSP_I2C2_SDA_PINint "I2C2 sda pin number"range 1 176default 46endifmenuconfig BSP_USING_I2C3bool "Enable I2C3 BUS (software simulation,extended use!!!)"default nselect RT_USING_I2Cselect RT_USING_I2C_BITOPSselect RT_USING_PINif BSP_USING_I2C3comment "Notice: PA8(SCL) --> 119; PH8(SDA)--> 85"config BSP_I2C3_SCL_PINint "I2C3 scl pin number"range 1 176default 119config BSP_I2C3_SDA_PINint "I2C3 sda pin number"range 1 176default 85endifmenuconfig BSP_USING_TIMbool "Enable timer"default nselect RT_USING_HWTIMERif BSP_USING_TIMconfig BSP_USING_TIM11bool "Enable TIM11"default nconfig BSP_USING_TIM13bool "Enable TIM13"default nconfig BSP_USING_TIM14bool "Enable TIM14"default nendifmenuconfig BSP_USING_ADCbool "Enable ADC"default nselect RT_USING_ADCif BSP_USING_ADCconfig BSP_USING_ADC1bool "Enable ADC1"default nendifmenuconfig BSP_USING_ONCHIP_RTCbool "Enable RTC"select RT_USING_RTCselect RT_USING_LIBCdefault nif BSP_USING_ONCHIP_RTCchoiceprompt "Select clock source"default BSP_RTC_USING_LSEconfig BSP_RTC_USING_LSEbool "RTC USING LSE"config BSP_RTC_USING_LSIbool "RTC USING LSI"endchoiceendifconfig BSP_USING_WDTbool "Enable Watchdog Timer"select RT_USING_WDTdefault nmenuconfig BSP_USING_USBHbool "Enable USB Host"select RT_USING_USB_HOSTdefault nif BSP_USING_USBHmenuconfig RT_USBH_MSTORAGEbool "Enable Udisk Drivers"default nif RT_USBH_MSTORAGEconfig UDISK_MOUNTPOINTstring "Udisk mount dir"default "/"endifendifconfig BSP_USING_SDIObool "Enable SDIO"select RT_USING_SDIOselect RT_USING_DFSdefault nconfig BSP_USING_FMCbooldefault nconfig BSP_USING_LTDCbooldefault nsource "./libraries/HAL_Drivers/Kconfig"endmenumenu "Board extended module Drivers"menuconfig RT_STEMWINbool "Enable STemWin"default nif RT_STEMWINconfig RT_STEMWIN_DEMObool "Enable STemWin Demo"default nendifmenuconfig RT_TOUCHGFXbool "Enable TouchGFX"default nendmenuendmenu
3、添加ports文件,修改SConscript
使用CubeMX配置完工程后,只是完成了外设时钟使能和管脚配置。外设初始化,中断配置,DMA配置等等则由 RT-Thread 提供的驱动文件(\libraries\HAL_Drivers目录下)来完成的,这些驱动配置有的需要根据使用情况修改配置参数,这些配置参数文件就存放在\board\ports文件夹下。
添加完后,还需要根据menuconfig开启的外设来选择需要包含的配置文件,也就是还需要修改\board\SConscript 构建脚本,这样在编译的时候才会将相应的文件加入工程进行编译
import os
import rtconfig
from building import *Import('SDK_LIB')cwd = GetCurrentDir()# add general drivers
src = Split('''
board.c
CubeMX_Config/Src/stm32f4xx_hal_msp.c
''')if GetDepend(['BSP_USING_ETH']):src += Glob('ports/phy_reset.c')if GetDepend(['BSP_USING_SPI_FLASH']):src += Glob('ports/spi_flash_init.c')if GetDepend(['BSP_USING_SDCARD']):src += Glob('ports/sdcard_port.c')if GetDepend(['BSP_USING_AUDIO']):src += Glob('ports/audio/drv_wm8978.c')src += Glob('ports/audio/drv_sound.c')if GetDepend(['BSP_USING_AUDIO_RECORD']):src += Glob('ports/audio/drv_mic.c') path = [cwd]
path += [cwd + '/CubeMX_Config/Inc']
path += [cwd + '/ports']if GetDepend(['BSP_USING_AUDIO']):path += [cwd + '/ports/audio']startup_path_prefix = SDK_LIBif rtconfig.CROSS_TOOL == 'gcc':src += [startup_path_prefix + '/STM32F4xx_HAL/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f429xx.s']
elif rtconfig.CROSS_TOOL == 'keil':src += [startup_path_prefix + '/STM32F4xx_HAL/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f429xx.s']
elif rtconfig.CROSS_TOOL == 'iar':src += [startup_path_prefix + '/STM32F4xx_HAL/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f429xx.s']CPPDEFINES = ['STM32F429xx']
group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES)Return('group')
三、外设配置总结
想要在 BSP 中添加更多驱动时,需要使用 CubeMX 工具来配置这些外设。对于绝大多数驱动的配置,只需要在工具中使能相应的外设即可。但是对于一些复杂的外设,则需要更多的配置内容。下表展示了不同驱动在 CubeMX 工具配置步骤的总结:
序号 |
驱动 |
CubeMx 工程中的配置情况(加粗部分为必做步骤) |
1 |
GPIO |
无需任何操作 |
2 |
UART |
开启该外设 ,然后配置所需要的引脚(或者使用默认引脚) |
3 |
SPI |
开启该外设 ,然后配置所需要的引脚(或者使用默认引脚) |
4 |
I2C |
依赖于PIN 驱动,无需任何操作 |
5 |
TIMER |
使能 internal Clock 时钟 ,详细内容可参考5.3章节 |
7 |
PWM |
首先使能 internal Clock 时钟,然后为 channelx 选项选择PWM Generation CHx, 最后配置所需要的引脚(或者使用默认引脚) ,详细内容可参考5.3章节 |
8 |
ADC |
开启该外设,然后选择使用的通道 ,详细内容可参考5.3章节 |
9 |
RTC |
开启该外设,然后在时钟树状图里将 RTC 选择为 LSE 时钟 |
10 |
Watchdog |
开启该外设 |
11 |
EMAC |
配置 ETH 外设的工作模式(一般为 RMII 模式) |
12 |
SDRAM |
需要根据板载的 SDRAM 型号配置片选脚,地址线,数据线等 |
13 |
SDIO |
开启该外设,配置引脚(或者使用默认引脚),SDIO会改变时钟结构,故需重新配置时钟并修改board.c |
rt-thread驱动篇(02)---STM32F429板卡外设驱动添加相关推荐
- python实现sht驱动_【技术】外设驱动库开发笔记9:SHT1x系列温湿度传感器驱动
在我们的产品中,经常需要检测温湿度数据.有很多检测温湿度的方法和模块,其中SHT1x系列温湿度传感器就是一种成本较低使用方便的温湿度检测模块.下面我们就来说一说如何实现SHT1x系列温湿度传感器的驱动 ...
- rt-thread驱动篇(08)---STM32F429单片机NAND FLASH驱动
目录 参考资料 一.NAND FLASH 1.1.特性 1.2.存储单元结构 1.3.NAND FLASH寻址 1.4.坏块管理与磨损均衡 1.5.ECC校验 二.uffs 1.uffs配置相关宏 参 ...
- 【linux驱动】gpio外设驱动
本篇文章为gpio外设驱动,使用内核的gpio驱动框架来操作soc的gpio外设,首先介绍所有外设引脚配置都需要的pinctrl,再介绍本篇的重点-gpio外设驱动,最后给出三个标准的gpio外设 ...
- xpt 2046的触摸屏 rt thread设备驱动框架
1 基于rtt 开发触摸屏驱动 准备使用rtt 框架 , 驱动xpt 2046的触摸屏, 翻阅大量资料发现, 大部分文章强调的是时序图, 而且很多代码要么直接操作寄存器, 要么是io 口模拟, 只能用 ...
- 2440 6.0BSP 移植过程之显示驱动篇
2440 6.0BSP 移植过程之显示驱动篇 //--------------------------------------------------------------------------- ...
- Linux 设备驱动篇之I2c设备驱动
******************************************************************************************** 装载声明:希望 ...
- Linux设备驱动篇——[I2C设备驱动-1]
Linux 设备驱动篇之I2c设备驱动 fulinux 一.I2C驱动体系 虽然I2C硬件体系结构和协议都很容易理解,但是Linux I2C驱动体系结构却有相当的复杂度,它主要由3部分组成,即I2C设 ...
- ESP32学习笔记( VSCode + ESP-IDF环境) 3 ——GPIO相关的简单外设驱动
1.如何在VSCode和ESP-IDF的环境下创建工程 说实话,这是我用ESP-IDF在VSCode环境下最不喜欢的事情,在一顿CSDN和百度之后,很多大佬博主都推荐使用VSCode,通过官方示例来进 ...
- HwBinder驱动篇-Android10.0 HwBinder通信原理(十)
摘要:本节主要来讲解Android10.0 HwBinder驱动的流程 阅读本文大约需要花费24分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Android的平台设 ...
- i2c--ioctl--主机控制器驱动(i2c_adapter)--外设驱动(i2c_driver)
updating... i2c驱动目录 [root@localhost i2c]# pwd /opt/FriendlyArm/mini2440/linux-2.6.32.2/drivers/i2c [ ...
最新文章
- python对文件的读写正确操作方式
- flask中jinjia2模板引擎详解3
- P3358 最长k可重区间集问题(网络流:串联思想)
- SCCM2012系列之二,SCCM2012部署前的Active Directory准备
- Windows系统appium移动端自动化真机环境搭建
- VSCode下Pytorch无法自动补全的问题
- 智能家居形态逐步演进 机会与挑战并存
- deepTools对ChIP-seq数据可视化
- 深圳大学移动互联网应用期末大作业——垃圾分类app
- 微型计算机原理与接口技术 考题,微机原理与接口技术试题答案
- 【环境搭建】在Ubuntu16.04上搭建Nginx-rtmp流媒体服务器
- 阻抗分析仪(LCR表)与矢量网络分析仪
- 步进电机、伺服电机、舵机的原理和区别
- sip php 来电,php - 如何在Twilio上传递原来的来电显示? (Sip域语音URL配置) - SO中文参考 - www.soinside.com...
- 偷得浮生半日闲:手写数字的识别
- 解决Outlook打不开邮件里的链接的方法
- 几个招聘网站,智联的最垃圾
- 微信小程序中的页面文件和组件
- 【转】京东一元抢宝系统的数据库架构优化
- 统考英语和计算机可以插u盘吗,统考大学英语B考试技巧 精品