历史上的今天
返回首页

历史上的今天

今天是: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时钟与外设时钟

推荐阅读

史海拾趣

Analog Modules Inc公司的发展小趣事

Analog Modules Inc. 是一家总部位于美国马萨诸塞州的公司,专注于设计和生产高性能模拟电子模块和系统,为军事、航空航天、医疗和工业等领域提供解决方案。以下是 Analog Modules Inc. 公司发展的相关故事:

  1. 创立与初期阶段:Analog Modules Inc. 成立于1970年,由一群电子工程师创办。公司最初的目标是满足军事和航天领域对高性能模拟电子模块的需求。在成立初期,公司致力于开发和生产高精度的模拟信号处理模块和系统,以满足客户对于高可靠性和高性能的要求。

  2. 技术创新与产品优化:Analog Modules Inc. 在技术方面不断进行创新,并持续优化其产品线。公司的产品涵盖了广泛的领域,包括模拟信号处理、数据采集、激光驱动、通信和雷达等。这些产品具有高精度、高可靠性和耐用性,得到了客户的广泛认可和信赖。

  3. 市场拓展与全球业务:随着业务的不断发展,Analog Modules Inc. 将市场重点逐渐扩展到了全球范围。公司与全球各地的客户建立了长期稳定的合作关系,拓展了产品的销售渠道和市场份额。同时,公司还积极参与国际展会和行业交流活动,提升了品牌知名度和影响力。

  4. 应用领域与客户合作:Analog Modules Inc. 的产品广泛应用于军事、航空航天、医疗和工业等多个领域。公司与各类客户进行紧密合作,包括政府军方、航空航天机构、医疗设备制造商和工业自动化企业等。通过与客户的合作,公司不断了解市场需求,提供定制化的解决方案,满足客户的特定需求。

  5. 持续发展与未来展望:Analog Modules Inc. 将继续致力于技术创新和产品研发,以满足不断变化的市场需求。公司将继续加强与客户和合作伙伴的合作关系,不断拓展业务领域,进一步提升产品性能和服务水平。在未来,Analog Modules Inc. 将继续保持行业领先地位,为客户提供更加优质和可靠的解决方案。

ELMEC Technology Of America Inc公司的发展小趣事

随着环保意识的不断提高,ELMEC开始关注企业的环保责任。他们采用环保材料替代传统材料,减少生产过程中的污染排放。同时,公司还积极开展绿色能源研发和应用,降低能耗和碳排放。这些措施不仅为公司赢得了良好的社会声誉,也为推动电子行业的可持续发展做出了积极贡献。

Chicago Miniature公司的发展小趣事

随着LED技术的兴起,CML敏锐地捕捉到了这一趋势,并成为第一家引进LED灯具的公司。这一决策为公司带来了巨大的发展机遇。CML不断投入研发资源,推出了一系列具有创新性的LED产品,不仅提高了照明效率,还降低了能耗。这使得CML在微型照明领域逐渐取得了领先地位,并赢得了广泛的客户基础。

Anderson Power公司的发展小趣事

在发展过程中,CML始终注重产品质量和品牌建设。公司建立了严格的质量管理体系,从原材料采购到生产流程再到产品出厂,都进行严格的质量控制。这使得CML的产品在市场上享有良好的声誉,并赢得了客户的信任。同时,公司还积极参与各种行业展会和交流活动,提升品牌知名度和影响力。

Excelics [Excelics Semiconductor, Inc.]公司的发展小趣事

为了进一步拓展国际市场,Excelics Semiconductor积极寻求与国际知名企业的合作。他们与欧洲一家领先的芯片制造商签订了战略合作协议,共同开发新一代的智能芯片。这一合作不仅提升了Excelics Semiconductor的技术实力,也为其在国际市场上赢得了更多的份额。

CQR SECURITY公司的发展小趣事

CQR SECURITY公司最初是一家专注于网络安全技术研发的小型创业公司。在创始人的带领下,公司团队攻克了一系列网络安全难题,开发出了具有高度创新性的安全协议。这一技术突破迅速吸引了业界关注,多家大型企业开始与CQR合作,共同推动产品的商业化应用。随着合作的深入,CQR逐渐在电子安全领域建立了自己的地位,最终发展成为一家业内知名的安全解决方案提供商。

问答坊 | AI 解惑

在VS2005+PB6.0的编译环境下调试HelloCE程序出错

提示 “WM_HIBERNATE”:未声明的标识符 代码如下: //====================================================================== // HelloCE - A simple application for Windows CE // // Written for the book Programming Windows CE // ...…

查看全部问答>

16f877 sim仿真 现金求助

pic16f877 通过编程仿真 由Sim-Emu 6.01 Configurator v2.1 写入手机号码的相关参数后得到: 一张十合一的可以自动切换imsi的sim卡 这个卡可以用于iphone 这个网址可以提供相应的知识准备 http://www.weiphone.com/viewthread.php?tid=4272& ...…

查看全部问答>

如何在EVC下使用CxImage

在VC6.0下,可以正常使用,然而在EVC4.0下,却总是编译不过...…

查看全部问答>

CE平台上的ISR!!!

那位写过CE平台上的中断服务程序! 请指点一二呀。我对这不懂,谢谢了…

查看全部问答>

发个好用的LCD1602最简程序

本帖最后由 paulhyde 于 2014-9-15 09:20 编辑 我的LCD1602是三个控制线的即:RS,RW,E 在论坛里本来有这个显示例程,但我下进我的LCD1602后不显,后来我从网上找到一个觉得不错特来分享   原地址:…

查看全部问答>

淘宝发现两个好东西,不知道其它地方可以买到吗?

msp430超值系列的单片机 达利尔官方只要6块钱。 然后它有28到32个引脚。资源也丰富 更重要的是,它支持两线仿真     我很想买几块,就是运费要20,舍不得。不知道别的地方有卖的吗?  …

查看全部问答>

防止驱动电源“掉链子”——LED照明测试技术分析

LED照明具有节能、环保、长寿命、易控制、免维护等特点。然而颇具讽刺意味的是,我们常常听闻由于LED驱动电源本身的寿命直接拖累LED照明灯具变得并不“长寿”,极大地增加了维护/使用成本;或者驱动电源的效率不高导致LED照明灯具的能效转换比并不 ...…

查看全部问答>

大家一起学习PIC单片机之二(独立键盘蜂鸣器提示)

 大家好,本人是PIC单片机新手,但是我很勤奋,我买的ND118-877APIC实验开发板,里面有实例,但是没有源代码,本人自己写代码大家一起交流,希望能陆续写下去,本人QQ476857290 希望大家学习指导。本节学习 8位独立按键蜂鸣器提示   ...…

查看全部问答>

cpld产生一定形式方波的问题

cpld时钟50M,怎么产生下图所示的周期性方波?还有采用什么方法产生周期为1s的方波信号占用硬件资源更少? …

查看全部问答>

stm32 串口通信地址唤醒问题

stm32串口通信支持地址唤醒,但是地址位只有4位,也就是说最多连接16个..在很多情况下都不够用。 除此以外还有其他问题,比如,对于1号地址,接收的数据必须以0x81开头,但是如果给2号地址发送: 82 05 05 81 02 02 那么一号机就会收到81 02 02. ...…

查看全部问答>