简单操作STM32的GPIO输出方法笔记
注1:时钟如同心脏一般,在使用任何外设之前,都需要启动其时钟。
注2:STM32的引脚上电后,如果不初始化,默认是浮空输入模式,引脚不会输出电平,且A15,B3,B4先不要用,这三个端口是JTAG的调试端口,要用作普通端口,需要进行一些配置。
1.使用RCC开启GPIO的时钟。
2.使用GPIO_Init函数初始化GPIO。
3.使用输出或输入的函数控制GPIO口。
涉及RCC和GPIO两个外设。
对于RCC的库函数,在Library中找到rcc.h,打开后在.h文件最下面,一般都是库函数所有函数的声明,最常用的主要是三个:RCC_AHB外设时钟控制,RCC_APB2外设时钟控制,RCC_APB1外设时钟控制。
右键点击,跳转到.c文件里的函数定义
通过函数介绍,AHB外设时钟控制函数负责使能或失能AHB外设时钟,第一个参数选择外设
STM32互联网型的设备可以在这个列表选择外设
其他设备在下面这个列表选择外设
第二个参数就是ENABLE或DISABLE
APB2和APB1外设时钟控制都是一样的操作方法,第一个参数选择外设,第二个参数选择使能或失能。哪个外设是连接在哪个总线上,可以在第一个参数列表上找。
对于GPIO的库函数,打开gpio.h文件,直接查看声明。
第一个是GPIO_DeInit(GPIO_TypeDef* GPIOx),参数可以写GPIOA,GPIOB等,调用这个函数后,所指定的GPIO外设复位。
第二个是GPIO_AFIODeInit(void),复位AFIO外设。
第三个是最重要的GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct),用结构体参数来初始化GPIO口,需要先定义一个结构体变量,再给结构体赋值,最后调用这个函数,这个函数内部会自动读取结构体的值,然后自动把外设的各个参数配置,一般初始化外设都是使用这个函数。
第四个是GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct),把结构体变量赋一个默认值。
接下来四个是GPIO的读取函数:
跟着四个是GPIO的写入函数:
最重要的是GPIO_Init及8个读写函数。
开始成为点灯大师
点亮PA0口的LED:调用RCC_APB2PeriphClockCmd,第一个参数RCC_APB2Periph_GPIOA,
第二个参数ENABLE,开启时钟。
接着调用GPIO_Init函数,第一个参数GPIOA,第二个参数是一个结构体,先跳转到GPIO_Init函数定义:
将结构体类型复制粘贴到GPIO_Init函数上方,之后给结构体取名(建议为官方推荐GPIO_InitStruct),这里的结构体实际上也是一种局部变量,在一些旧的编译器,要求所有的局部变量定义必须放在函数的最前面。之后复制结构体名,用结构体成员运算符(.)引用结构体三个成员(Mode,Pin,Speed)
选中成员GPIO_Mode右键跳转到说明,
选中GPIOMode_TypeDef ,Ctrl+F搜索,可以看到GPIO的8种工作模式:
AIN(Analog IN)模拟输入,
IN_FLOATING浮空输入,
IPD(In Pull Down)下拉输入,
IPU(In Pull Up)上拉输入,
Out_OD(Out Open Drain)开漏输出,
Out_PP(Out Push Pull)推挽输出,
AF_OD(Atl Open Drain)复用开漏,
AF_PP(Atl Push Pull)复用推挽。
这里使用推挽输出,则复制GPIO_Mode_Out_PP粘贴到GPIO_Mode。
GPIO_Pin配置方法同上,跳转时在下方选择member这一项
选择GPIO_pins_define搜索,因为用的是GPIOA外设的0号引脚,所以选择GPIO_Pin_0 ,
GPIO_Speed配置同上,选择50MHz。
最后,用‘&’取地址符将GPIO初始化结构体的地址作为GPIO_Init函数的第二个参数。
当执行GPIO_Init函数后,GPIOA外设的0号引脚就自动被配置为推挽输出,50MHz的速度。GPIO初始化完毕。
GPIO四个输出函数的使用:
第一个GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin),这个函数可以把指定的端口设置为高电平。
第二个GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin),这个函数可以把指定的端口设置为低电平。
第三个GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal),函数根据第三个参数的值来设置指定的端口。
第四个GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal),这个函数可以同时对16个端口进行写入操作。
对于GPIO_ResetBits,右键跳转至函数定义:
第一个参数GPIO(A…G),第二个参数GPIO_Pin_x(x=0…15)
对于GPIO_SetBits函数用法同GPIO_ResetBits。
对于GPIO_WriteBit,前两个参数相同,第三个参数可由定义知是一个枚举类型BitAction值, Bit_RESET为清除端口值(置低电平),Bit_SET为设置端口值(高电平)。
对于GPIO_Write,GPIOA外设情况下,第二个参数可以同时控制PA15~PA0(0000 0000 0000 0000),从左到右规定为从最高位到最低位,最低位对应PA0;当为(0000 0000 0000 0001)时,即十六进制为0x0001,PA0置高电平,当为(0000 0000 0000 1000)时,即十六进制为0x0008时,PA3置高电平,如果要同时使PA0和PA3置为高电平,则将第二个参数设为(0000 0000 0000 1001),即为0x0009。
推挽输出模式下,高低电平都有驱动能力,开漏输出模式下,高电平相当于高阻态,无驱动能力。一般使用推挽输出就行,但是推挽输出模式下,IO口不能并联。
作者:一旁莫笑