很多单片机都是高电平弱驱动,低电平强驱动,所以这里是低电平有效
点亮一个LED灯
操作STM32的GPIO需要三个操作:
第一个使用RCC开启GPIO的时钟
第二步使用GPIO_Init函数初始化GPIO
第三步使用输出或输入函数控制GPIO
1.使用RCC开启GPIO的时钟
1.1.RCC的库函数
点击
主要用到这三个函数
1126这个函数:第一个参数选择外设,第二个参数使能或失能
示例 开启GPIOA的时钟
1.2.GPIO库函数:
还是Librayry里面
GPIO全部函数
349行函数调用之后,所指定的GPIO函数外设就会被复位,这个就是这个函数的用途
350行函数,作用:复位AFIO外设
351行函数,非常重要,这个函数的作用是用结构体的参数来初始化GPIO口,我们需要先定义一个结构体变量,再给结构体赋值,最后调用这个函数,这个函数内部就会自动读取结构体的值,然哈自动把外设的各个参数配置好
352行函数,这个函数可以把结构体变量赋给一个默认值
353-356这四个函数就是GPIO的读取函数
357-360这四个就是GPIO的写入函数
353-360这些函数就可以实现读写GPIO口的功能
361-366目前不用
这里面最重要的函数是:351,353-360
LED灯程序编写:
2.1.首先调用RCC里面的APB2外设时钟控制函数
因为要点亮PA0口的LED,所以选择RCC_APB2Periph GPIOA这一项
第二个参数选择ENABLE,放到第二个参数
这样时钟就开启了
2.2.然后调用GPIO_Init函数
第一个参数选择GPIOA,第二个参数是一个结构体
把结构体定义出来
然后用点把结构体的成员都定义出来
然后从8开始到10都是一个套路,右键跳转,看说明,复制粘贴一下参数
选择这个,Ctrl+F搜索一下,然后跳转下图
这里就是GPIO的八种工作模式
AIN是模拟输入,IN_FLOATING是浮空输入,IPD是下拉输入,IPU是上拉输入
OUT_PD是开漏输出,OUT_PP是推挽输出,AF_OD是复用开漏,AF_PP是复用推挽
点灯是推挽输出,所以复制OUT_PP
推挽输出:可以高电平也可以低电平
接下来GPIO_Pin选择引脚,然后继续右键跳转
选择menber
然后选择这个,Ctrl+F然后跳转下图
这里因为用的是GPIOA外设的0号引脚,所以选择GPIO_Pin_0
这样就设置好引脚了
然后设置第三个,还是右键跳转
Ctil+F搜索,跳转下面页面
输出速度选50HZ就行
最后把GPIO初始化结构体的地址放到GPIO_Init的第二个参数就行了,这样GPIO初始化就完成了
当这个GPIO_Inlt函数执行完,这个GPIO外设的0号引脚就自动被配置为推挽输出,50HZ的速度了
它内部的主要执行逻辑就是读取结构体的参数,执行一堆判断和运算,最后写入到GPIO的配置寄存器
上面步骤已经把GPIO初始化完成,下面就可以使用输入输出函数了
2.3.这次试验就用这四个输出函数
GPIO_Setbits:
第一个参数是GPIOx,也就是设置IO口,例如如果是PA那就是GPIOA,第二个参数是GPIO_Pin,这个函数可以把指定的端口设置为高电平
GPIO_ResetBits:
第一个参数是GPIOx,也就是设置IO口,例如如果是PA那就是GPIOA,第二个参数是GPIO_Pin,这个函数可以把指定的端口设置为低电平
GPIO_Writebit:
这个函数有三个参数,前两个跟上面一样,第三个是BitValue,这个是根据第三个参数的值来设置指定的端口
GPIO_Write
第一个参数是GPIOx,也就是设置IO口,第二个参数是PortVal,这个函数可以同时对16个端口进行写入操作
开始实践
用一下第一个函数
看注释
第一个GPIOx,x可以是A到G
第二个GPIO_Pin_x,x可以是0到15
这样就是控制了PA0
这个函数是把指定端口设置低电平,所以灯亮了
再来试试这个函数
这个函数是把指定端口设置高电平,所以灯灭了
然后再来试试第三个函数
第三个参数介绍的是指定写入的数据值,这个参数可以是BitAction这个枚举中的一个值
Bit_RESET是清除端口值,也就是置低电平
Bit_SET是设置端口值,也就是置高电平
写Bit_RESET
灯又亮了
写Bit_SET
灯又灭了
这就是这三个函数的用法
流水灯实验
还是之前LED的文件,复制粘贴一下
流水灯是用GPIOA的0-7号端口,所以这里要加端口1-7,在GPIO_Pin_0后面或运算GPIO_Pin_1或运算GPIO_Pin_2,这样就可以一次性把三个端口一次性都初始化了
为什么可以这样呢,我们看这个,这里可以看到,Pin0对应的是0x0001
这个是二进制形式
以此类推,每个端口对应一个位,如果把它们进行按位或的操作,这就是按位或的操作逻辑
比如Pin0,Pin1,Pin2按位或,结果就是0111,这样就相当于同时选中了三个端口
这里还有一个这个函数,GPIO_Pin_All,它对应的数据就是0xFFFF,也就是所有位都为1,这样就相当于选中了所有的引脚
时钟控制这一项,也是可以利用按位或的操作方式来选择多个外设的,数据规律是每一位对应一个外设
这个也可以利用按位或选择多个引脚,所以Setbit+了个s
这个函数也是一样的意思
这里的话就直接用GPIO_Pin_Alll了,这样就把16个端口全部配置为了推挽输出模式
为了现在同时控制16个端口,我们就可以使用GPIO_Write这个函数了
GPIO_Write
第一个参数是GPIOx
跳转看看,这里写的是,指定写到输出数据寄存器的值
可以看到,这第二个参数就是直接写道GPIO的ODR寄存器里面的
所以直接写0x0001,因为c语言不支持写二进制,所以这里只能写十六进制
最低位对应PA0,然后往上依次是PA1,PA2
一直到PA15
因为是低电平点亮,所以要在前面再加按位取反的符号