历史上的今天
今天是:2024年12月07日(星期六)
2021年12月07日 | STM32F4学习笔记3——通用IO
2021-12-07 来源:eefocus
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时钟与外设时钟
史海拾趣
|
在VS2005+PB6.0的编译环境下调试HelloCE程序出错 提示 “WM_HIBERNATE”:未声明的标识符 代码如下: //====================================================================== // HelloCE - A simple application for Windows CE // // Written for the book Programming Windows CE // ...… 查看全部问答> |
|
pic16f877 通过编程仿真 由Sim-Emu 6.01 Configurator v2.1 写入手机号码的相关参数后得到: 一张十合一的可以自动切换imsi的sim卡 这个卡可以用于iphone 这个网址可以提供相应的知识准备 http://www.weiphone.com/viewthread.php?tid=4272& ...… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 09:20 编辑 我的LCD1602是三个控制线的即:RS,RW,E 在论坛里本来有这个显示例程,但我下进我的LCD1602后不显,后来我从网上找到一个觉得不错特来分享 原地址:… 查看全部问答> |
|
msp430超值系列的单片机 达利尔官方只要6块钱。 然后它有28到32个引脚。资源也丰富 更重要的是,它支持两线仿真 我很想买几块,就是运费要20,舍不得。不知道别的地方有卖的吗? … 查看全部问答> |
|
LED照明具有节能、环保、长寿命、易控制、免维护等特点。然而颇具讽刺意味的是,我们常常听闻由于LED驱动电源本身的寿命直接拖累LED照明灯具变得并不“长寿”,极大地增加了维护/使用成本;或者驱动电源的效率不高导致LED照明灯具的能效转换比并不 ...… 查看全部问答> |
|
大家好,本人是PIC单片机新手,但是我很勤奋,我买的ND118-877APIC实验开发板,里面有实例,但是没有源代码,本人自己写代码大家一起交流,希望能陆续写下去,本人QQ476857290 希望大家学习指导。本节学习 8位独立按键蜂鸣器提示 ...… 查看全部问答> |
|
stm32串口通信支持地址唤醒,但是地址位只有4位,也就是说最多连接16个..在很多情况下都不够用。 除此以外还有其他问题,比如,对于1号地址,接收的数据必须以0x81开头,但是如果给2号地址发送: 82 05 05 81 02 02 那么一号机就会收到81 02 02. ...… 查看全部问答> |




