嵌入式系统学习——STM32之GPIO

发布者:码梦狂人最新更新时间:2020-09-03 来源: eefocus关键字:嵌入式系统  STM32  GPIO 手机看文章 扫描二维码
随时随地手机看文章

----第一篇:GPIO库

文档说明和约定:

该文档主要是对STM32F4各个模块的库进行翻译和说明。文档中加入了作者的一些理解,建议和小贴士。并且在文档最后,加入了一些使用该库模块的案例。希望大家通过对该文档的阅读,可以更好的使用STM32的库函数进行学习和项目开发。之所以选用1.4.0版本进行翻译和说明,因为该版本群众基础较好,有大量的使用者和相关资料。后续也会推出新版本库和CubeMX库的翻译和说明,希望大家喜欢和支持。如果大家觉得文档有什么问题,麻烦请提出,如果确认问题存在,作者会及时修改。


相关术语说明:

gpio:通用输入输出接口

gpio管脚:一个io管脚,这个管脚可以有多个配置。在库函数中用GPIO_Pin_1这样的宏定义表示

gpio端口(gpio分组):一组gpio管脚的信息。在库函数中用宏定义GPIOA GPIOB等表示


1 gpio库说明

库文件名:stm32f4xx_gpio.c

文档提示翻译:

如何使用这个驱动

(1) 使用RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOx, ENABLE)函数使能GPIO的AHB总线时钟。

(2)使用GPIO_Init()函数对每个引脚进行四种可能的配置

《1》输入状态:Floating(浮空), Pull-up(上拉), Pull-down(下拉)

《2》输出状态:Push-Pull (上拉下拉)(Pull-up(上拉), Pull-down(下拉) or no Pull(不上拉也不下拉)),Open Drain(开漏) (Pull-up(上拉), Pull-down(下拉) or no Pull(不上拉也不下拉)),在输出模式,速度配置成2MHZ,25MHZ,50MHZ和100MHZ.

《3》第二功能:上拉下拉和开漏

《4》模拟:当一个管脚被用作ADC通道或者DAC输出的时候,需要配置成此模式

(3)外设的第二功能:

《1》在ADC和DAC模式,使用GPIO_InitStruct->GPIO_Mode = GPIO_Mode_AN把需要的管脚配置成模拟模式

《2》对于其它的管脚(定时器,串口等):

l  使用GPIO_PinAFConfig()函数把管脚和需要的第二功能进行连接

l  使用GPIO_InitStruct->GPIO_Mode = GPIO_Mode_AF把需要的管脚配置成第二功能模式

l  通过成员变量GPIO_PuPd, GPIO_OType and GPIO_Speed选择类型,上拉下拉和输出速度

l  调用函数GPIO_Init()

(4)在输入模式,使用函数GPIO_ReadInputDataBit()得到配置好管脚的电平

(5)在输出模式,使用函数GPIO_SetBits()/GPIO_ResetBits()设置配置好IO的高低电平

(6)在复位过程和刚刚复位后,第二功能是无效的,GPIO被配置成了输入浮空模式(JTAG管脚除外)

(7)当LSE振荡器关闭的时候,LSE振荡器管脚OSC32_IN和OSC32_OUT可以作为通过IO来使用(分别用PC14和PC15表示)。LSE的优先级高于GPIO函数

(8)当HSE振荡器关闭的时候,HSE振荡器管脚OSC_IN和OSC_OUT可以作为通用IO(PH0,PH1)来使用。HSE的优先级高于GPIO函数。


2 具体函数说明

初始化和配置相关函数

1.void GPIO_DeInit(GPIO_TypeDef* GPIOx)

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

函数参数说明:GPIOx:gpio的分组,如GPIOA  GPIOB  GPIOC等的宏定义(这些宏定义在头文件stm32f4xx.h中,由厂家写好,我们直接使用即可)


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

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

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

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

l  GPIO_Pin:指定具体的IO脚,如GPIO_Pin_0   GPIO_Pin_1这样的宏定义,这些宏由厂家写好,我们直接使用即可。

l  GPIO_Mode:指定gpio的模式,有以下四种模式:

GPIO_Mode_IN(输入),GPIO_Mode_OUT(输出),GPIO_Mode_AF(第二功能),GPIO_Mode_AN(模拟),可以直接使用这四种宏定义。

l  GPIO_Speed:指定IO的最快翻转速度,也就是当使用IO产生频率(如PWM)的最快速度。有以下四种速度的配置:

GPIO_Low_Speed (低速),GPIO_Medium_Speed(中等速度),GPIO_Fast_Speed(快速),GPIO_High_Speed(高速),可以直接使用这四种宏定义。

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

GPIO_OType_PP (推挽方式输出),GPIO_OType_OD(开漏方式输出),可以直接使用这两种宏定义。


Tips:

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


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


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

GPIO_PuPd_NOPULL(不上拉也不下拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)。Tips:这些都是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。在下一次复位前,被锁定的管脚不能被修改。


函数参数说明:GPIOx:gpio的分组(如GPIOA,GPIOB等)。GPIO_Pin:具体的gpio管脚(如GPIO_Pin_0   GPIO_Pin_1这样的宏定义)


GPIO的读写函数

1.uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_tGPIO_Pin)

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

函数参数说明:GPIOx:gpio的分组/gpio端口;GPIO_Pin:具体的gpio管脚

函数返回值说明:输入管脚的值Bit_SET(高电平) Bit_RESET(低电平)


2.uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx)

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

函数参数说明:GPIOx:gpio的分组/gpio端口

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


3.uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_tGPIO_Pin)

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

函数参数说明:GPIOx:gpio的分组/gpio端口;GPIO_Pin:具体的gpio管脚

函数返回值说明:输出管脚的值Bit_SET(高电平) Bit_RESET(低电平)


4.uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx)

函数解释:读取输出io分组/端口的值

函数参数说明:GPIOx:gpio的分组/gpio端口

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


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

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

函数参数说明:GPIOx:gpio的分组/gpio端口;GPIO_Pin:具体的gpio管脚或者是io管脚的组合


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

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


函数参数说明:GPIOx:gpio的分组/gpio端口;GPIO_Pin:具体的gpio管脚或者是io管脚的组合


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

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

函数参数说明:GPIOx:gpio的分组/gpio端口;GPIO_Pin:具体的gpio管脚;BitVal:写入高电平或者低电平(Bit_RESET:写入低电平 Bit_SET:写入高电平)


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

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

函数参数说明:GPIOx:gpio的分组/gpio端口; BitVal:写入高电平或者低电平(Bit_RESET:写入低电平Bit_SET:写入高电平)


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

函数解释:翻转指定的gpio口,也就是说,如果当前的io是低电平,则变成高电平,如果当前io是高电平,则变成低电平

函数参数说明:GPIOx:gpio的分组/gpio端口;GPIO_Pin:具体的gpio管脚。


Gpio复用功能配置函数

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

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

函数参数说明:GPIOx:gpio的分组/gpio端口;GPIO_PinSource:具体要配置成复用功能的管脚(如GPIO_Pin_0   GPIO_Pin_1这样的宏定义);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


代码示例:

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

         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


关键字:嵌入式系统  STM32  GPIO 引用地址:嵌入式系统学习——STM32之GPIO

上一篇:stm32F051系列教程 1.点灯
下一篇:STM32F4外设驱动系列之GPIO

推荐阅读最新更新时间:2024-11-07 19:12

STM32 串口通讯 发送 接收
STM32的使用有利有弊,种类多---但是种类有太多,资料也是比较乱的,还有就是库的调用,经常忘记一些函数的使用------比如最常用的串口------ ------------------------------------------------------------------------------USART ----设置------------------------------- void USART1_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC
[单片机]
Stm32串口发送字符串数据
ps:把字符串分成字节循环发送 /* *说明: *PA0:KEY1;PA1:KEY2; *PA2:LED1;PA3:LED2; *PA9:USART1_TX;PA10:USART1_RX */ #include stm32f10x.h #include stm32f10x_rcc.h #include stm32f10x_gpio.h #include stm32f10x_usart.h #include stm32f10x_crc.h #include system_stm32f10x.h #include stdio.h #define PUTCHAR_PROTOTYPE int __io_putchar(in
[单片机]
STM32-systick系统定时器
systick系统定时器 系统定时器存在内核中,是24位的定时器,只能向下递减,嵌套在NVIC中 counter 在时钟的驱动下 在reload的初值开始向下递减计时到0,产生中断置位标志然后又从reload值开始重新递减计数,循环定时时间计算 t=reload*(1/clk) clk=72M时,t=72*(1/72m)=1us clk=72M时,t=72000*(1/72m)=1ms clk=72M时,t=72000000*(1/72m)=1s 1s=1000MS =1000 000US=1000 000 000NS sysTick属于内核中的外设,他的中断优先级和外设的中断优先级相比,哪个高?
[单片机]
STM32-systick系统定时器
STM32堆栈设置
1.堆和栈大小 定义大小在startup_stm32f2xx.s Stack_Size EQU 0x00000400 AREA STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem SPACE Stack_Size __initial_sp ; h Heap Configuration ; o Heap Size (in Bytes) 0x0-0xFFFFFFFF:8 ; /h Heap_Size EQU 0x00000200 AREA HEAP, NOINIT, READWRITE, ALIGN=3 __heap_base
[单片机]
<font color='red'>STM32</font>堆栈设置
STM32串口的部分映射与完全映射
以stm32的USART1来举例 默认使用的是PA9为TX,PA10为RX,当需要开启复用功能时,需要注意修改以下几个地方的代码 1 时钟的开启 当使用复用功能后,就需要开启复用时钟RCC_APB2Periph_AFIO 2 初始化引脚的不同,原来的是PA9,PA10,但是现在要初始化PB6,PB7,这一部分就不贴代码了。 3 调用GPIO_PinRemapConfig()函数 GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE); USART1的重映射开启 注意:GPIO_PinRemapConfig()函数的参数是不能随便写的
[单片机]
<font color='red'>STM32</font>串口的部分映射与完全映射
基于STM32和CPLD的等精度测频设计
在电子工程、资源勘探、仪器仪表等相关应用中,频率测量是电子测量技术中最基本最常见的测量之一,频率计也是工程技术人员必不可少的测量工具。但是,传统的频率测量方法在实际应用中有较大的局限性,基于传统测频原理的频率计的测量精度将随被测信号频率的变化而变化,传统的直接测频法其测量精度将随被测信号频率的降低而降低,测周法的测量精度将随被测信号频率的升高而降低。本文中提出一种基于ARM与CPLD宽频带的数字频率计的设计,以微控器STM32作为核心控制芯片,利用CPLD可编程逻辑器件,实现闸门测量技术的等精度测频。 本设计的技术指标: 测频范围:1Hz~200MHz,分辨率为0.1Hz,测频相对误差百万分之一。 周期测量:信号测量范围与精
[单片机]
基于<font color='red'>STM32</font>和CPLD的等精度测频设计
STM32 编译后不能运行的几个原因
一、编译和链接都可以通过,但uVision MDK不能全速运行,一运行就停止了,原因在于Option- Target- Code Generation- Use MicroLIB 复选框没有打钩,一般来说,针对一运行就停止的情况,将Use MicroLIB勾选之后,重新编译,运行就可以通过了。 二、仿真调试时没有问题,但通过JLink调试时出现如下提示: Flash Download Failed- Cortex-M3 ,则可能的原因是:Option- Debug- Use Driver for Flash Programming- Setting- Flash Download- Programming Algotithm
[单片机]
<font color='red'>STM32</font> 编译后不能运行的几个原因
STM32学习之ADC
对于STM32,在使用ADC的时候需要配置几个参数。 (1) 第一个参数是ADC_Mode,这里设置为独立模式: ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; 在这个模式下,双ADC不能同步,每个ADC接口独立工作。所以如果不需要ADC同步或者只是用了一个ADC的时候,就应该设成独立模式了。 (2) 第二个参数是ADC_ScanConvMode,这里设置为DISABLE。 ADC_InitStructure.ADC_ScanConvMode = DISABLE; 如果只是用了一个通道的话,DISABLE就可以了,如果使用了多个通道的话,则必须将其设置
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved