STM32F4学习笔记3——通用IO
扫描二维码
随时随地手机看文章
STM32F4每个GPIO端口有四个32位配置寄存器(GPIOx_MOER,GPIOx_OTYPER,GPIOx_OSPEEDR和GPIOx_PUPDR),两个32位数据寄存器(GPIO_IDR和GPIO_ODR),一个32为置位/复位寄存器(GPIOx_BSRR),一个32为GPIO锁寄存器(GPIOx_LCKR),两个32为复用功能寄存器(GPIOx_AFRH和GPIOx_AFRL)。主要特性如下
·每个端口支持16个IO引脚控制
·推挽或者开漏+带上拉电阻或者下拉电阻
·从数据输出寄存器(GPIOx_ODR)或者外设(复用功能引脚)输出数据
·每个IO支持速度选择
·输入状态:浮动,上拉/下拉,模拟
·输入数据到输入数据寄存器(GPIOx_IDR)或者外设(复用功能输入)
·置位和复位寄存器(GPIOx_BSRR)
·GPIO锁机制,用于冻结IO配置
·模拟输入
·复用功能输入输出选择寄存器
·每两个时钟周期的快速IO切换
·高灵活度的复用功能使得IO可以作为通用IO使用或者外设使用
根据数据手册中列出的每个 I/O 端口的特定硬件特征,GPIO 端口的每个位可以由软件分别配置成多
种模式。
·输入浮空
·输入上拉
·输入下拉
·模拟输入
·具有上拉下拉功能的开漏输出
·具有上拉下拉功能的推挽输出
·具有上拉下拉功能的推挽复用功能
·具有上拉下拉功能的开漏复用功能
每个IO口可以自由编程,端口寄存器必须按32位字被访问。GPIOx_BSRR跟GPIOx_BRR允许对热河GPIO的读/写的独立访问;这样在读和写之间访问之间产生IRQ(中断请求)时不会发生危险。 关于引脚耐压5V可以参考数据手册的引脚说明。
复位期间跟刚复位后,复用功能未开启,IO端口被配置成浮空输入模式,复位后JTAG引脚被置于输入上拉或下拉模式。
PA15:JTDI置于上拉模式
PA14:JTCK/SWCLK置于下拉模式
PA13:JTMS/SWDAT置于上拉模式
PB4:JNTRST置于上拉模式
PB3:JTDO浮空状态
微控制器通过多路选择器将 IO 引脚与相应的片上外设相连接,这里要注意一点,每一次只能与一个片上外设相连接,防止多个外设使用这个引脚造成冲突。
每个引脚都有一个多路选择器,每个多路选择器有 16 路输入(AF0 到AF15) ,通过寄存器 GPIOx_AFRL(从 0 到 7)和 GPIOx_AFRH(从 8 到 15)进行配置。
·复位后 IO 引脚默认连接到系统复用功能 0(AF0)
·片上外设的复用功能映射从 AF1 到 AF13
·M4 的 FPU EVENTOUT 映射到 AF15
不能将EVENTOUT映射到一下引脚:PC13,PC14,PC15,PH0,PH1和PI8
置位和复位寄存器(GPIOx_BSRR)是一个 32 位寄存器,允许用户程序置位或者复位输出数据寄存器 GPIOx_ODR 的每个位。置位和复位寄存器GPIOx_BSRR 的位数是 GPIOx_ODR 的两倍。寄存器 GPIOx_BSRR 就是对寄存器 GPIOx_ODR 的位操作,GPIOx_BSRR 的高 16 位用于
复位操作,低 16 位用置位操作,只有对寄存器 GPIOx_BSRR 相应的位置 1 才对寄存器 GPIOx_ODR 有效,置 0 是无效的。如果对于寄存器GPIOx_ODR 的同一位同时进行置位和复位操作,那么置位操作的优先级要高。当对 GPIOx_ODR 的个别位编程时,软件不需要禁止中断:在单次AHB1 写操作里,可以只更改一个或多个位。GPIO锁允许冻结IO配置。在一个端口位上执行了LOCK程序,下一次复位前将不能再更改端口位配置。
所有端口都有外部中断能力,在使用外部中断先端口必须配置成输入模式。
模拟输入配置时,输出换从其被禁止,禁止施密特触发器输入,弱上拉下拉被电阻禁止,读输入寄存器时数值为0。
外设的GPIO设置模式在F1参考手册上有,但是在F4上这个说明没有了具体大家在使用的时候可以参考f1,也可以参考官方外设例子。
STM32F4的GPIO库
初始化配置函数
void GPIO_DeInit(GPIO_TypeDef*GPIOx)初始化GPIO寄存器到默认值
void GPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef*GPIO_InitStruct)GPIO初始化
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct)将GPIO_InitStruct组员设置到默认值
void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)GPIO寄存器锁
GPIO的读和写
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)读某一引脚的输入数据寄存器IDR
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx)读某一端口的输入数据寄存器IDR
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx)读某一端口的输出数据寄存器ODR
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)读某一引脚的输出数据寄存器ODR
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)GPIO置高
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)GPIO置低
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin,BitAction BitVal)根据BitVal写ODR寄存器
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal)设置输出寄存器ODR数值
void GPIO_ToggleBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)通过GPIO->ODR^=GPIO_Pin;实现GPIO翻转
GPIO复用功能配置函数
void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF)使用前要先使能GPIO时钟与外设时钟