版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
WordSTM32GPIO的API函数配置和使用技巧
一、前言
本篇开始对(STM32)的GPIO在实际开发设计中的使用配置和技巧进行探讨,可以先去回顾下之前介绍的GPIO的相关理论基础知识包括基本结构,工作模式和(寄存器)原理。
了解过STM32的GPIO相关的理论知识,这样在应用GPIO开发过程中,能更好的理解GPIO的特点,应用起来会更加的得心应手。
后续将从以下图1中所示的几个方面对G(PI)O应用设计中的步骤展开介绍。本篇先介绍GPIO的基本API函数定义,配置初始化的流程,以及使用技巧;针对将GPIO的引脚用于外部中断的功能将作为单独的一篇进行详细的讨论介绍。
图1GPIO应用设计
二、API函数
STM32有多种类型的库,本节所介绍的STM32的GPIO函数接口是STM32标准库的函数接口,接口总共分为4种类型,如图2所示。
图2GPIO库函数接口分类
1、关键参数
在详细介绍各个API函数接口功能之前,我们需要对函数接口中使用到的关键的几个参数进行分析。
(1)、GPIO_TypeDefGPIOx*
这个参数是用于指定需要具体的GPIO端口号定义,参数的范围为GPIOA~GPIOK。
(2)、GPIO_InitTypeDefGPIO_InitStruct*
这个参数是GPIO端口需要初始化的功能参数的结构体指针,下面我们看看这个结构体的定义。
typedefstruct{uint32_tGPIO_Pin;//GPIO端口的引脚GPIOMode_TypeDefGPIO_Mode;//GPIO的端口模式GPIOSpeed_TypeDefGPIO_Speed;//GPIO的输出速度频率GPIOOType_TypeDefGPIO_OType;//GPIO输出时的类型GPIOPuPd_TypeDefGPIO_PuPd;//GPIO上下拉电阻设置}GPIO_InitTypeDef;(a)、GPIO端口的引脚:可选范围为GPIO_Pin_0~GPIO_Pin_15,也可以选所有引脚GPIO_Pin_All。
(b)、GPIO的端口模式:用于设置GPIO的端口模式,可选的端口模式如下。
typedefenum{GPIO_Mode_IN=0x00,//普通IO口输入GPIO_Mode_OUT=0x01,//普通IO口输出GPIO_Mode_AF=0x02,//管脚复用功能GPIO_Mode_AN=0x03//(模拟)输入,用于(ADC)功能}GPIOMode_TypeDef;(c)、GPIO的输出速度频率:当GPIO引脚用于普通功能输出或复用功能输出时,GPIO的输出速度频率,可选的输出速率如下。
typedefenum{GPIO_Low_Speed=0x00,//GPIO_Speed_2MHzGPIO_Medium_Speed=0x01,//GPIO_Speed_25MHzGPIO_Fast_Speed=0x02,//GPIO_Speed_50MHzGPIO_High_Speed=0x03//GPIO_Speed_100MHz}GPIOSpeed_TypeDef;速度高的IO耗电大、噪声也大,速度低的IO耗电小、噪声也小。使用合适的速度可以降低功耗和噪声。高频的(驱动电路),噪声也高,当不需要高的输出频率时,请选用低频驱动电路,这样非常有利于提高系统的EMI性能,也可以降低功耗。当然如果要输出较高频率的(信号),但却选用了较低频率的速度,很可能会得到失真的输出信号。关键是GPIO的引脚速度跟应用匹配。
(d)、GPIO输出时的类型:当GPIO引脚用于普通功能输出或复用功能输出时,可选择设置的GPIO的输出结构类型有如下。
typedefenum{GPIO_OType_PP=0x00,//推挽结构GPIO_OType_OD=0x01//开漏结构}GPIOOType_TypeDef;推挽输出时,可以输出高或者低电平;开漏输出时,如果要输出高电平,则需要在(芯片)内部配置上拉电阻(弱上拉)或者在芯片IO外部连接上拉电阻。
(e)、GPIO上下拉电阻设置:可以为GPIO端口的引脚选择设置是否具备带上拉或下拉电阻功能。
typedefenum{GPIO_PuPd_NOPULL=0x00,//无上拉或者下拉GPIO_PuPd_UP=0x01,//带上拉电阻GPIO_PuPd_DOWN=0x02//带下拉电阻}GPIOPuPd_TypeDef;STM32芯片GPIO的上拉电阻和下拉电阻最小值,典型值和最大值如下:
(3)、uint16_tGPIO_PinSource和uint8_tGPIO_AF
这两个参数都是GPIO端口引脚需要配置成复用功能引脚用到的参数。
GPIO_PinSource:指需配置的复用功能引脚源,可选范围GPIO_PinSource0
~GPIO_PinSource15。
GPIO_AF:指该引脚具体需要配置的功能,具体配置功能要看实际应用需求,例如需要配置成SPI1功能的引脚,那么就选GPIO_AF_SPI1。
2、函数接口
下面就对具体的函数接口进行逐个的介绍。由于使用的是STM32的标准库,GPIO相关的函数及配置定义和可以调用的接口放置在官方提供的标准库文件stm32fxx_gpio.c和头文件stm32fxx_gpio.h文件中。
(1)、无效GPIO_DeInit(GPIO_TypeDefGPIOx);*
作用:将GPIO端口设置成初始的默认状态,相当于复位GPIO端口,默认的状态为输入浮空的状态。
举例:GPIO_DeInit(GPIOA),将GPIOA端口所有引脚复位到默认状态。
(2)、无效GPIO_Init(GPIO_TypeDefGPIOx,GPIO_InitTypeDefGPIO_InitStruct);**
作用:将GPIO端口引脚进行功能状态初始化。
举例:将GPIOA的pin1引脚设为普通输出功能,IO驱动速率可达50MHz,推挽模式,带上拉电阻。
gpio_InitStruct.GPIO_Pin=GPIO_Pin_1;gpio_InitStruct.GPIO_Mode=GPIO_Mode_OUT;gpio_InitStruct.GPIO_Speed=GPIO_Fast_Speed;gpio_InitStruct.GPIO_OType=GPIO_OType_PP;gpio_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;GPIO_Init(GPIOA,(3)、无效GPIO_Struc(tI)nit(GPIO_InitTypeDefGPIO_InitStruct);*
作用:获取GPIO端口的所有引脚的一个默认状态,可应用于某个GPIO端口上。该函数内部默认的引脚默认状态如下。
GPIO_InitStruct->GPIO_Pin=GPIO_Pin_All;GPIO_InitStruct->GPIO_Mode=GPIO_Mode_IN;GPIO_InitStruct->GPIO_Speed=GPIO_Speed_2MHz;GPIO_InitStruct->GPIO_OType=GPIO_OType_PP;GPIO_InitStruct->GPIO_PuPd=GPIO_PuPd_NOPULL;举例:使用gpio_InitStruct快速获取到了引脚的默认状态值。
GPIO_StructInit((4)、无效GPIO_PinLockConfig(GPIO_TypeDefGPIOx,uint16_tGPIO_Pin);*
作用:将指定GPIO端口引脚当前的配置进行锁定,锁定后该引脚配置不能被修改,只有等下次(MCU)复位锁定才能释放。
举例:锁定GPIOA的管脚pin1配置不被修改。
GPIO_PinLockConfig(GPIOA,GPIO_Pin_1);(5)、uint8_tGPIO_Re(adI)nputDataBit(GPIO_TypeDefGPIOx,uint16_tGPIO_Pin);*
作用:为当GPIO的相应管脚配置成输入时,读取该GPIO端口下的相应引脚输入电平值。
举例:读取GPIOA的pin1引脚输入电平值。
status=GPIO_Re(ad)InputDataBit(GPIOA,GPIO_Pin_1);(6)、uint16_tGPIO_ReadInputData(GPIO_TypeDefGPIOx);*
作用:为当GPIO配置成输入时,读取该GPIO端口下的所有引脚输入电平值。
举例:读取GPIOA端口所有引脚的输入电平值。
status=GPIO_ReadInputData(GPIOA);(7)、uint8_tGPIO_ReadOutputDataBit(GPIO_TypeDefGPIOx,uint16_tGPIO_Pin);*
作用:为当GPIO的相应管脚配置成输出时,读取该GPIO端口下的相应引脚输出电平值。
举例:读取GPIOA的pin1引脚输出电平值。
status=GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1);(8)、uint16_tGPIO_ReadOutputData(GPIO_TypeDefGPIOx);*
作用:为当GPIO配置成输出时,读取该GPIO端口下的所有引脚输出电平值。
举例:读取GPIOA端口所有引脚的输出电平值。
status=GPIO_ReadOutputData(GPIOA);(9)、无效GPIO_SetBits(GPIO_TypeDefGPIOx,uint16_tGPIO_Pin);*
作用:置位相应GPIO端口引脚的电平值。
举例:将GPIOA的pin1管脚电平置为1。
GPIO_SetBits(GPIOA,GPIO_Pin_1);也可以用于多个引脚电平的置位,
GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);(10)、无效GPIO_ResetBits(GPIO_TypeDefGPIOx,uint16_tGPIO_Pin);*
作用:清零相应GPIO端口引脚的电平值。
举例:将GPIOA的pin1管脚电平置为0,
GPIO_ResetBits(GPIOA,GPIO_Pin_1);也可以用于多个引脚电平的清零。
GPIO_ResetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);(11)、无效GPIO_Wri(te)Bit(GPIO_TypeDefGPIOx,uint16_tGPIO_Pin,BitActionBitVal);*
作用:将GPIO端口的指定管脚电平置1或置0。
举例:将GPIOA的pin1管脚电平置为1。
GPIO_WriteBit(GPIOA,GPIO_Pin_1,1);也可以用于多个引脚电平操作。
GPIO_WriteBit(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3,1)(12)、无效GPIO_Write(GPIO_TypeDefGPIOx,uint16_tPortVal);*
作用:将GPIO端口的所有管脚电平置1或置0。
举例:将GPIOA端口的所有管脚电平置为1。
GPIO_Write(GPIOA,1);(13)、无效GPIO_ToggleBits(GPIO_TypeDefGPIOx,uint16_tGPIO_Pin);*
作用:翻转指定GPIO引脚的输出电平,即0变为1,1变为0。
举例:翻转GPIOA的pin1管脚电平值。
GPIO_ToggleBits(GPIOA,GPIO_Pin_1);(14)、无效GPIO_PinAFConfig(GPIO_TypeDefGPIOx,uint16_tGPIO_PinSource,uint8_tGPIO_AF);*
作用:将GPIO的指定管脚配置成复用功能管脚。
举例:将GPIOA的pin9管脚配置成串口USART1的功能管脚。
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);三、配置流程
配置流程主要在实际的驱动配置中对GPIO进行初始化的操作,根据实际项目应用开发中的芯片GPIO引脚的定义,进行合理的配置。图3所示为GPIO的基本配置操作流程。
图3GPIO配置流程
(1)、使能对应GPIO的(时钟)
在配置GPIO的开始,首先需要将对应的GPIO模块的时钟打开,这样才能为GPIO工作提供动力源,因此只有先将GPIO的时钟打开才能使GPIO正常的工作。
关于STM32芯片内部整体的时钟系统,可以回顾之前明解STM32时钟系统的文章介绍。STM32的GPIO模块是挂载在芯片内部AHB1总线(AHB:高级高性能总线)上的外设,因此就需要打开GPIO在AHB1总线上对应的时钟。AHB1总线上的外设时钟开关在STM32提供的标准库函数中通过函数RCC_AHB1PeriphClockCmd()来实现的。例如调用:
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);这样就将GPIOA的时钟打开,也可以同时打开多个GPIO端口的时钟:
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB,ENABLE);(2)、引脚功能配置
接下来对GPIO引脚的配置是需要根据实际的项目应用要求,根据各个芯片管脚的定义来对引脚的功能进行合理的配置,主要是根据引脚是使用成普通IO输出还是输入,复用功能还是模拟管脚来调用GPIO_Init()函数进行配置。举例说明:
用于普通IO输出时:
GPIO_WriteBit(GPIOA,GPIO_Pin_1,1);//向引脚输出0或1电平,在GPIO_Init前调用GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;//设置使用引脚GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;//普通IO输出GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//根据实际应用配置输出结构类型GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;//根据实际应用配置输出速度GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//根据实际应用配置上拉或下拉电阻GPIO_Init(GPIOA,//初始化PA1引脚需要注意的是,初始化输出电平时,需要先调用写引脚电平接口,再做初始化操作,这是因为GPIO_WriteBit是将输出的值写入寄存器输出置位/复位寄存器BSRR,BSRR寄存器复位值是0,GPIO_Init相当于将GPIO引脚初始化完打开输出开关。如果需要输出的是高电平,GPIO_WriteBit在前,GPIO_Init在后相当于在没打开开关之前就将1在BSRR中放置好,GPIO_Init将开关一打开就可以输出高电平;如果GPIO_Init在前,GPIO_WriteBit在后,GPIO_Init完会将BSRR中的0先输出,过了一个函数指令周期后调用GPIO_WriteBit才输出高电平,因此若驱动时序对函数指令周期敏感的外围器件时,可能带来驱动时序问题!
用于普通IO输入时:
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;//设置使用引脚GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;//普通IO输入GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;//根据实际应用配置输出速度GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//根据实际应用配置上拉或下拉电阻GPIO_Init(GPIOA,//初始化PA1引脚用于复用功能时:
在管脚应用于复用功能时,需要调用GPIO_PinAFConfig()接口来将管脚配置成具体的外设管脚。
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);//PA9复用为USART1GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);//PA10复用为USART1GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_10;//设置使用引脚GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;//复用功能GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//根据实际应用配置输出速度GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//根据实际应用配置输出结构类型GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//根据实际应用配置上拉或下拉电阻GPIO_Init(GPIOA,//初始化PA9和PA10引脚用于模拟管脚时:
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;//PA5通道5GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AN;//模拟输入GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;//不带上下拉GPIO_Init(GPIOA,//初始化PA5引脚当STM32需要进行AD(模数)转换采样时,需要把引脚设置为模拟输入模式,模拟输入模式下,不需要连接上拉和下拉电阻,因为GPIO用于模拟功能时,引脚的上、下拉电阻是不起作用的。这个时候即使在配置了上拉或下拉电阻,也不会影响到模拟信号的输入。
(3)、对GPIO引脚进行操作
在初始化完GPIO引脚的具体配置后,就可以对GPIO引脚进行具体的操作使用了。
用于普通IO输出时:
可以调用相关GPIO相关写操作接口对引脚进行输出0或者1的操作:GPIO_SetBits、GPIO_ResetBits、GPIO_WriteBit、GPIO_ToggleBits。
也可以调用相关GPIO读接口对输出类型的GPIO进行读取引脚电平的操作GPIO_ReadOutputDataBit。
用于普通IO输入时:
可以调用相关GPIO读接口对输入类型的GPIO进行读取引脚电平的操作:GPIO_ReadInputDataBit。
用于复用功能时:
需要根据实际使用时的具体外设配置,接着初始化相应的片上外设后,调用具体的外设信号读或者写接口进行信号的读写操作。
用于模拟管脚时:
由于模拟管脚功能是用芯片上的ADC对芯片外部的模拟信号进行采样,因此还需要初始化完ADC外设后,调用ADC外设采样的接口进行信号读取。
四、使用技巧
在日常程序开发调试的过程中,可以简单有效的利用GPIO驱动输出高低电平来进行辅助的测试及验证工
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小学交通安全整治的工作总结范文(5篇)
- 医生个人主要事迹500字(5篇)
- 《客户群体和消费心》课件
- 《临床麻醉学英》课件
- 物联网(IoT)安全策略-洞察分析
- 艺术电商平台物流配送优化研究-洞察分析
- 细胞凋亡分子机制-洞察分析
- 疑病症跨文化研究-洞察分析
- 医院医保人员工作总结(7篇)
- 药物干预与运动功能恢复-洞察分析
- 12SG121-1 施工图结构设计总说明
- DL∕T 2447-2021 水电站防水淹厂房安全检查技术规程
- AQ 1097-2014 井工煤矿安全设施设计编制导则(正式版)
- 2024装修补贴协议书
- 四川省对外文化交流中心2024年公开招聘工作人员历年【重点基础提升】模拟试题(共500题)附带答案详解
- 许昌市2022-2023学年七年级上学期期末语文试题
- 小学语文学习任务群的设计与实施研究
- 2024年中考物理微专题练习热学计算1含答案
- 祠堂管理规章制度
- 2024风电光伏组合箱变技术规范
- 2023工业热泵发展白皮书
评论
0/150
提交评论