历史上的今天
返回首页

历史上的今天

今天是:2025年08月07日(星期四)

正在发生

2019年08月07日 | STM32库函数详解----(通用输入/输出GPIO)

2019-08-07 来源:eefocus

初始化和配置相关函数


1.void  GPIO_DeInit  (GPIO_TypeDef* GPIOx)


函数解释:gpio的反初始化函数,该函数的作用是把GPIO相关的寄存器配置成上电复位后的默认状态,在第一次初始化前或者不在使用某一接口后,可以调用该函数。


参数:GPIOx,GPIO的分组,如 GPIOA,GPIOB,GPIOC等的宏定义。


 


2.void  GPIO_Init  (GPIO_TypeDef* GPIOx,GPIO_InitTypeDef* GPIO_InitStruct)


函数解释:GPIO的初始化函数,该函数的作用是对io进行初始化。


参数:(1)GPIOx,GPIO的分组,如 GPIOA,GPIOB,GPIOC等的宏定义。


            (2)GPIO_InitStruct,GPIO的初始化相关结构体。该结构体里的成员变量决定了我们具体的初始化参数。以下进行说明:


              GPIO_Pin:指定具体的io脚,如GPIO_Pin_0,GPIO_Pin_1这样的宏定义。


              GPIO_Mode:指定GPIO的模式,有四种模式:


  GPIO_Mode_IN(输入), GPIO_Mode_OUT(输出), GPIO_Mode_AF(第二功能), GPIO_Mode_AN(模拟)


              GPIO_Speed:指定IO最快翻转速度,也就是当使用IO产生频率(如PWM)的最大速度。有四种模式:


 GPIO_Low_Speed(低速), GPIO_Medium_Speed(中等速度), GPIO_Fast_Speed(快速), GPIO_High_Speed(低速)


               GPIO_OType:指定选择管脚的输出类型,有以下两种配置:


GPIO_OType_PP(推挽方式输出),GPIO_OType_OD(开漏方式输出)


温馨提示:


推挽输出:推挽输出就是单片机引脚可以直接输出高电平电压。低电平时接地,高电平时输出单片机电源电压。这种方式可以不接上拉电阻。但如果输出端可能会接地的话,这个时候输出高电平可能引发单片机运行不稳定,甚至可能烧坏引脚。推挽方式的驱动力更大。


开漏输出:开漏输出就是不输出电压,低电平时接地,高电平时不接地。如果外接上拉电阻,则在输出高电平时,电压会拉到上拉电阻的电源电压。这种方式适合在连接的外设电压比单片机低的时候。


               GPIO_PuPd:指定选择管脚的上拉和下拉模式。有三种配置:


GPIO_PuPd_NOPULL(不上拉也不下拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)


温馨提示:


这些都是io内部的内部上拉或者下拉模式,也可以接上拉或下拉电阻,通过硬件连接,实现外部上拉或外部下拉。


 


3.void  GPIO_StructInit  (GPIO_InitTypeDef* GPIO_InitStruct)


函数解释:GPIO结构体的初始化。对GPIO_InitStruct结构体进行默认配置。


参数:GPIO_InitStruct,直接传入该结构体的指针。在该函数内会对结构体进行初始化。


 


4.void  GPIO_PinLockConfig (GPIO_TypeDef* GPIOx,uint16_t  GPIO_Pin)


函数解释:锁定GPIO寄存器,锁定的寄存器是GPIOx_MODER,   GPIOx_OTYPER,    GPIOx_OSPEEDR,   GPIOx_PUPDR,    GPIOx_AFRL    and    GPIOx_AFRH。在下一次复位前,被锁定的管脚不能被修改。


参数:(1)GPIOx,GPIO的分组,如 GPIOA,GPIOB,GPIOC等的宏定义。


            (2)  GPIO_Pin:指定具体的io脚,如GPIO_Pin_0,GPIO_Pin_1这样的宏定义。


 


 


GPIO的读写函数


1.uint8_t  GPIO_ReadInputDataBit  (GPIO_TypeDef* GPIOx , uint16_t GPIO_Pin)


函数解释:读取io输入管脚的值


参数:(1)GPIOx,GPIO的分组,如 GPIOA,GPIOB,GPIOC等的宏定义。


            (2)  GPIO_Pin:指定具体的io脚,如GPIO_Pin_0,GPIO_Pin_1这样的宏定义。


返回值:输入管脚的值 Bit_SET(高电平),Bit_RESET(低电平)


 


2.uint16_t  GPIO_ReadInputData (GPIO_TypeDef* GPIOx )


函数解释:读取输入io数据,该函数用于读取一个io分组的所有数据


参数:GPIOx,GPIO的分组,如 GPIOA,GPIOB,GPIOC等的宏定义。


返回值:一个io端口的所有数据(输入状态)


 


3.uint8_t  GPIO_ReadOutputDataBit  (GPIO_TypeDef* GPIOx , uint16_t GPIO_Pin)


函数解释:读取io输出管脚的值


参数:(1)GPIOx,GPIO的分组,如 GPIOA,GPIOB,GPIOC等的宏定义。


            (2)  GPIO_Pin:指定具体的io脚,如GPIO_Pin_0,GPIO_Pin_1这样的宏定义。


返回值:输出管脚的值 Bit_SET(高电平),Bit_RESET(低电平)


 


4.uint16_t  GPIO_ReadOutputData (GPIO_TypeDef* GPIOx )


函数解释:读取输出io数据,该函数用于读取一个io分组的所有数据


参数:GPIOx,GPIO的分组,如 GPIOA,GPIOB,GPIOC等的宏定义。


返回值:一个io端口的所有数据(输出状态)


 


5.void  GPIO_SetBits(GPIO_TypeDef* GPIOx,uint16_t  GPIO_Pin)


函数解释:对io管脚进行置位(输出高电平)。这个函数使用GPIOx_BSRR寄存器来实现原子读或者修改操作。在这种情况下,在读和修改访问时发生一个IRQ中断是没有危险的。


参数:(1)GPIOx,GPIO的分组,如 GPIOA,GPIOB,GPIOC等的宏定义。


            (2)  GPIO_Pin:指定具体的io脚,如GPIO_Pin_0,GPIO_Pin_1这样的宏定义。


 


6.void  GPIO_ResetBits(GPIO_TypeDef* GPIOx,uint16_t  GPIO_Pin)


函数解释:对io管脚进行复位(输出低电平)。这个函数使用GPIOx_BSRR寄存器来实现原子读或者修改操作。在这种情况下,在读和修改访问时发生一个IRQ中断是没有危险的。


参数:(1)GPIOx,GPIO的分组,如 GPIOA,GPIOB,GPIOC等的宏定义。


            (2)  GPIO_Pin:指定具体的io脚,如GPIO_Pin_0,GPIO_Pin_1这样的宏定义。


 


7.void  GPIO_WriteBit(GPIO_TypeDef* GPIOx,uint16_t  GPIO_Pin,BitActionBitVal)


函数解释:对某一位进行写入操作。


参数:(1)GPIOx,GPIO的分组,如 GPIOA,GPIOB,GPIOC等的宏定义。


            (2)GPIO_Pin:指定具体的io脚,如GPIO_Pin_0,GPIO_Pin_1这样的宏定义。


            (3)BitVal:写入高电平或者低电平(Bit_RESET:写入低电平 Bit_SET:写入高电平)


 


8.void  GPIO_Write(GPIO_TypeDef* GPIOx,uint16_t  PortVal)


函数解释:对GPIO端口进行写入操作,适用于对统一端口的多个管脚的写入。


参数:(1)GPIOx,GPIO的分组,如 GPIOA,GPIOB,GPIOC等的宏定义。


            (2)BitVal:写入高电平或者低电平(Bit_RESET:写入低电平 Bit_SET:写入高电平)


 


9.void  GPIO_ToggleBits(GPIO_TypeDef* GPIOx,uint16_t  GPIO_Pin)


函数解释:翻转指定的GPIO口,如果当前io是高电平,则变为低电平。如果当前io是低电平,则变为高电平。


参数:(1)GPIOx,GPIO的分组,如 GPIOA,GPIOB,GPIOC等的宏定义。


            (2)GPIO_Pin:指定具体的io脚,如GPIO_Pin_0,GPIO_Pin_1这样的宏定义。


 


GPIO复用功能配置函数


1.void  GPIO_PinAFConfig(GPIO_TypeDef* GPIOx,uint16_t  GPIO_PinSource,uint8_t  GPIO_AF)


函数解释:改变指定管脚的映射关系,即配置指定管脚的复用功能。


参数:(1)GPIOx,GPIO的分组,如 GPIOA,GPIOB,GPIOC等的宏定义。


            (2)GPIO_PinSource,具体要配置成复用功能的管脚(如GPIO_Pin_0,GPIO_Pin_1这样的宏定义)。


            (3)GPIO_AF:选择该管脚要使用的复用功能,有以下配置,


                     


GPIO_AF_RTC_50Hz: Connect RTC_50Hz pin toAF0 (default after reset)


GPIO_AF_MCO: Connect MCO pin (MCO1 and MCO2)to AF0 (default after reset)


GPIO_AF_TAMPER: Connect TAMPER pins(TAMPER_1 and TAMPER_2) to AF0 (default after reset)


GPIO_AF_SWJ: Connect SWJ pins (SWD andJTAG)to AF0 (default after reset)


GPIO_AF_TRACE: Connect TRACE pins to AF0(default after reset)


GPIO_AF_TIM1: Connect TIM1 pins to AF1


GPIO_AF_TIM2: Connect TIM2 pins to AF1


GPIO_AF_TIM3: Connect TIM3 pins to AF2


GPIO_AF_TIM4: Connect TIM4 pins to AF2


GPIO_AF_TIM5: Connect TIM5 pins to AF2


GPIO_AF_TIM8: Connect TIM8 pins to AF3


GPIO_AF_TIM9: Connect TIM9 pins to AF3


GPIO_AF_TIM10: Connect TIM10 pins to AF3


GPIO_AF_TIM11: Connect TIM11 pins to AF3


GPIO_AF_I2C1: Connect I2C1 pins to AF4


GPIO_AF_I2C2: Connect I2C2 pins to AF4


GPIO_AF_I2C3: Connect I2C3 pins to AF4


GPIO_AF_SPI1: Connect SPI1 pins to AF5


GPIO_AF_SPI2: Connect SPI2/I2S2 pins to AF5


GPIO_AF_SPI4: Connect SPI4 pins to AF5


GPIO_AF_SPI5: Connect SPI5 pins to AF5


GPIO_AF_SPI6: Connect SPI6 pins to AF5


GPIO_AF_SAI1: Connect SAI1 pins to AF6 forSTM32F42xxx/43xxx devices.      


GPIO_AF_SPI3: Connect SPI3/I2S3 pins to AF6


GPIO_AF_I2S3ext: Connect I2S3ext pins toAF7


GPIO_AF_USART1: Connect USART1 pins to AF7


GPIO_AF_USART2: Connect USART2 pins to AF7


GPIO_AF_USART3: Connect USART3 pins to AF7


GPIO_AF_UART4: Connect UART4 pins to AF8


GPIO_AF_UART5: Connect UART5 pins to AF8


GPIO_AF_USART6: Connect USART6 pins to AF8


GPIO_AF_UART7: Connect UART7 pins to AF8


GPIO_AF_UART8: Connect UART8 pins to AF8


GPIO_AF_CAN1: Connect CAN1 pins to AF9


GPIO_AF_CAN2: Connect CAN2 pins to AF9


GPIO_AF_TIM12: Connect TIM12 pins to AF9


GPIO_AF_TIM13: Connect TIM13 pins to AF9


GPIO_AF_TIM14: Connect TIM14 pins to AF9


GPIO_AF_OTG_FS: Connect OTG_FS pins to AF10


GPIO_AF_OTG_HS: Connect OTG_HS pins to AF10


GPIO_AF_ETH: Connect ETHERNET pins to AF11


GPIO_AF_FSMC: Connect FSMC pins to AF12


GPIO_AF_FMC: Connect FMC pins to AF12 forSTM32F42xxx/43xxx devices.   


GPIO_AF_OTG_HS_FS: Connect OTG HS(configured in FS) pins to AF12


GPIO_AF_SDIO: Connect SDIO pins to AF12


GPIO_AF_DCMI: Connect DCMI pins to AF13


GPIO_AF_LTDC: Connect LTDC pins to AF14 forSTM32F429xx/439xx devices.


GPIO_AF_EVENTOUT: Connect EVENTOUT pins toAF15


 


代码示例:


示例一:把GPIO6配置成输出管脚,并置高电平。


         GPIO_InitTypeDefGPIO_InitStruct;


         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);


         GPIO_InitStruct.GPIO_Pin= GPIO_Pin_6;


         GPIO_InitStruct.GPIO_Mode= GPIO_Mode_OUT;


         GPIO_InitStruct.GPIO_PuPd= GPIO_PuPd_UP;


 


         GPIO_Init(GPIOA,&GPIO_InitStruct);


 


         GPIO_SetBits(GPIOA,GPIO_Pin_6);


 


示例二:把gpioe4配置成输入


         GPIO_InitTypeDefGPIO_InitStruct;


         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);


         GPIO_InitStruct.GPIO_Pin= GPIO_Pin_4;


         GPIO_InitStruct.GPIO_Mode= GPIO_Mode_IN;


         GPIO_InitStruct.GPIO_PuPd= GPIO_PuPd_UP;


         GPIO_Init(GPIOE,&GPIO_InitStruct);


 


示例三:配置复用功能 PA9 PA10 配置成串口1的收发接口


GPIO_InitTypeDef GPIO_InitStructure;


         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//使能GPIOA时钟


         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1时钟


         //串口1对应引脚复用映射


         GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);//GPIOA9复用为USART1


         GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);//GPIOA10复用为USART1


         //USART1端口配置


         GPIO_InitStructure.GPIO_Pin= GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9与GPIOA10


         GPIO_InitStructure.GPIO_Mode= GPIO_Mode_AF;//复用功能


         GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;      //速度50MHz


         GPIO_InitStructure.GPIO_OType= GPIO_OType_PP; //推挽复用输出


         GPIO_InitStructure.GPIO_PuPd= GPIO_PuPd_UP; //上拉


         GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化PA9,PA10



推荐阅读

史海拾趣

鸿展光电(GPO)公司的发展小趣事

在电子行业中,鑫雁公司(这里主要指鑫雁电子科技(上海)有限公司及其后续发展形态,如上海鑫雁微电子股份有限公司)的崛起与发展,伴随着一系列重要的里程碑和战略决策。以下是五个与鑫雁公司发展相关的故事:

1. 初创与立足上海

鑫雁公司始建于2004年(另有说法为2009年或2010年,以最新信息为准,这里采用2010年作为起点),选址于中国之魔都——上海。公司自成立之初便专注于集成电路及相关产品的研发与销售,并迅速在竞争激烈的电子行业中站稳脚跟。得益于上海作为国际大都市的地理位置优势和丰富的产业链资源,鑫雁公司逐渐吸引了一批具有丰富经验的研发和管理人才,为公司后续的发展奠定了坚实的基础。

2. 研发实力积累与技术创新

鑫雁公司的主要研发和管理人员均来自国内知名集成电路设计企业,他们拥有十五年乃至二十年以上的集成电路产品研发经验。公司在多个工艺平台上成功开发了包括霍尔磁传感器电路、电源管理电路等在内的一系列拥有自主知识产权的数模混合集成电路产品,并获得了多项发明专利、实用新型专利和集成电路版图保护专利。这些技术成果不仅提升了公司的核心竞争力,也为公司在市场上赢得了良好的口碑。

3. 全国布局与国际化拓展

随着业务的不断扩展,鑫雁公司开始在全国范围内布局,先后在杭州、西安等地设立了研发机构或技术合作团队,并在江苏、广东等国内主要发达经济区域设立了客户服务的办事处。此外,公司还将目光投向了国际市场,在美国硅谷等地建立了研发合作团队,进一步提升了公司的国际影响力。这种全国乃至全球的布局策略,为公司带来了更多的市场机会和合作伙伴。

4. “无工厂化”模式与品质保障

鑫雁公司采用“无工厂化”(Fabless)的设计公司模式,通过委外加工方式进行生产。公司精心挑选了具有世界先进制造设备和技术的晶圆代工和封装合作伙伴,以确保产品品质的可靠性和充足的市场供应能力。这种灵活的生产模式不仅降低了公司的运营成本,还使公司能够专注于产品研发和市场拓展等核心业务。

5. 持续创新与多元化发展

秉承“提升自我、超越期待”的核心理念,鑫雁公司始终坚持技术创新和多元化发展。公司不断加大技术研发投入,积极探索新产品的开发和推广,逐步形成了以汽车电子为主赛道,并在新能源、工业自动化、消费电子等多个领域深入发展的格局。这些努力不仅丰富了公司的产品线,也进一步提升了公司的市场竞争力。同时,公司还积极与国内外知名企业建立合作关系,共同推动电子行业的发展和进步。

Advanced Optoelectronic Technology Corp公司的发展小趣事

AOTC公司起源于一个由几位电子工程专家组成的小团队,他们共同研发出了一种新型的光电转换器,具有更高的转换效率和更小的体积。这一技术突破迅速吸引了风险投资家的注意,公司得到了初始的资金支持,并开始了正式的商业化进程。

Global Connector Technology公司的发展小趣事
按照厂家提供的安装说明,检查继电器的安装位置和连接线路是否正确。
BOPLA公司的发展小趣事

在国内市场取得一定成绩后,BOPLA开始将目光投向海外市场。通过参加国际电子展会、与海外客户建立合作关系等方式,公司成功将产品打入国际市场。同时,BOPLA还积极调整产品策略,根据不同国家和地区的市场需求,推出定制化的电子元件产品,进一步扩大了市场份额。

Astron Wireless Technologies Inc公司的发展小趣事

随着公司的发展,Astron Wireless Technologies Inc开始寻求与其他行业的领军企业建立战略合作关系。通过与一家知名通信设备制造商的合作,公司成功将其无线通信技术集成到了对方的产品中,从而进一步扩大了市场份额。这一合作不仅提升了公司的知名度,还为公司带来了稳定的收入来源。

Custom LeatherCraft Manufacturing Co Inc公司的发展小趣事

CLC非常重视客户服务。他们设立了专门的客户服务部门,为客户提供咨询、售后支持和定制服务。无论客户遇到什么问题或需求,CLC都会尽全力解决和满足。这种贴心的服务赢得了客户的信任和忠诚,也促进了品牌的持续发展。

问答坊 | AI 解惑

只要用金属做箱子,然后将箱子接地,是错误的

屏蔽就是对两个空间区域之间进行金属的隔离,以控制电场、磁场和电磁波由一个区域对另一个区域的感应和辐射。具体讲,就是用屏蔽体将元部件、电路、组合件、电缆或整个系统的干扰源包围起来,防止干扰电磁场向外扩散;用屏蔽体将接收电路、设备或系 ...…

查看全部问答>

【转】说实话:模拟设计可以老但不可以朽

安静的生活不需再起什么波澜,即将进入四十岁不再进入研发黄金时间段,想把自己做过的想过的都留下来,没有什么名利场的事情了,说出来格外轻松。面对目前大部分国内杂志近乎清一色的嵌入系统,单片机和软件的文章,硬件电路尤其是模拟电路设计似乎 ...…

查看全部问答>

wince6用什么开发驱动?

除了写makefile,然后build之外还有吗? 以前5.0可以用evc,pb等工会开发。 vs2005好像没有支持建立驱动的项目选项啊。…

查看全部问答>

有没有谁做嵌入式开发的,大虾给俺指导一下?谁有WIN CE的模拟器?

我现在准备开发WIN CE5.0应用程序,现在按照网上指导的方法VS2005不能与目标机相联(目标机是WIN CE5.0系统),从开发机上拷的那5个文件不能在目标机器上运行,执行后报如下错误提示: \'ConmanClient2\'is not a valid Windows CE application ...…

查看全部问答>

关于在WINCE下模拟MOUSE的动作

现有一个软件需求如题所述,现在的做法是在TOUCH PANEL驱动层加上一些代码,也就是说把传给GWES的值复制一份保留下来.这样的做法缺陷很大,如果一旦在动作序列里有一个动作没有被有效的执行,那本次模拟的所有操作就会被认为无效.大家有没有其它的办法 ...…

查看全部问答>

猎头职位:赴美国工程师!月薪五万,咨询13381085719 13381085771刘先生

猎头职位:赴美国工程师!月薪五万,咨询13381085719 13381085771刘先生…

查看全部问答>

软仿与硬仿的差距?

本帖最后由 dontium 于 2015-1-23 13:33 编辑 一段算法 软仿真时间大约160us, JTAG硬件仿真一下子降到3ms 这个差距会由哪些方面引起?谢谢! …

查看全部问答>

ARM+LINUX 中断一定要用驱动在内核完成吗

最近在折腾LINUX 的GPIO中断。用驱程实现了的情形是:1 在驱程里,借用copy_to_user函数,在中断发生时,让一个数值发生变化写回用户态,使得应用程序可以读出这个变化。问题是:这样看起来,好像跟查询没什么区别。以前玩51的时候,情况不是这样的 ...…

查看全部问答>

晒WEBENCH设计的过程+3.3VDSP供电

本帖最后由 nwx8899 于 2014-8-17 13:22 编辑 利用易电源软件工具设计的一个DSP的一个供电系统,,输入电压是直流14-22V,输出3.3V给DSP供电,电源选择3安输出,选择环境温度27摄氏度。轻轻输入几个数据然后点击开始设计了。 不是,还要等待一会 ...…

查看全部问答>