图片来自 成电应电科协
一. GPIO定义
GPIO是通用输入/输出(General Purpose l/O)的简称,主要用于工业现场需要用到数字量输入/输出的场合,例如:
- 输出功能:继电器、LED、蜂鸣器等的控制
- 输入功能:传感器状态、高低电平等信息的读取
- 复用功能:片内外设的对外接口
- 时序模拟:模拟SPI、12C和UART等常用接口的时序
二. GPIO的特性
- 多种工作模式: 输出/输入/复用/模拟
- 灵活的复用模式
- 5V电压容限
- 外部中断功能
三. 端口和引脚
两个概念
端口(PORT)
独立的外设子模块,包括多个引脚,通过多个硬件寄存器控制引脚GPIO模块由端口GPIOA、GPIOB、GPIOC等多个独立的子模块构成 例如:端口GPIOA包括PAO~PA15这16个引脚,通过10个硬件寄存器控制引脚工作
引脚(PIN)
对应微控制器的一个管脚,归属于端口,由端口寄存器的对应位控制 PAO对应STM32F411RET6芯片的14脚,属于端口GPIOA,输出电平由端口GPIOA的输出数据寄存器GPIOA_ODR的第0位决定 总结:一个端口默认包含16个引脚,但是不同型号的STM32微控制器所包含的端口数量及各端口包含的引脚数量各不相同,具体信息可以查询芯片的数据手册
![在这里插入图片描述](https://img-blog.csdnimg.cn/4a5a779cd80d46008fb40bc398edd507.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKh5pyJ5L2Z5Zyw5rKh5pyJ5L2Z5Zyw,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
四. GPIO模块的电路结构
![在这里插入图片描述](https://img-blog.csdnimg.cn/e414e60e9c464e30bddf1403661108a5.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKh5pyJ5L2Z5Zyw5rKh5pyJ5L2Z5Zyw,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
五. GPIO工作模式
![在这里插入图片描述](https://img-blog.csdnimg.cn/ea6b69b1fc3444b785350812d97e7e03.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKh5pyJ5L2Z5Zyw5rKh5pyJ5L2Z5Zyw,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
1. GPIO工作模式——输入模式
![请添加图片描述](https://img-blog.csdnimg.cn/3b32ff83c72148ed9d7897177bea4cb0.jpg?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKh5pyJ5L2Z5Zyw5rKh5pyJ5L2Z5Zyw,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center) ①输出驱动器关闭
②施密特触发器打开,
③可以获取引脚状态通过寄存器使能上/下拉电阻:浮空/上拉/下拉输入
④引脚电平状态将存入输入数据寄存器
2. GPIO工作模式——输出模式
①输出驱动器打开
②施密特触发器打开
③通过寄存器使能上拉/下拉电阻
④通过输入数据寄存器获取引脚状态
GPIO工作模式——输出模式——推挽输出
![在这里插入图片描述](https://img-blog.csdnimg.cn/cfd7a9f7b0a0443fab33edf599bb722b.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKh5pyJ5L2Z5Zyw5rKh5pyJ5L2Z5Zyw,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
GPIO工作模式——输出模式——开漏输出
![在这里插入图片描述](https://img-blog.csdnimg.cn/6d1f5d3ec3734022b2f4c31e8c5528fc.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKh5pyJ5L2Z5Zyw5rKh5pyJ5L2Z5Zyw,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
3. GPIO工作模式——模拟模式
![在这里插入图片描述](https://img-blog.csdnimg.cn/b1c6fec45cf14650a1d89aa9ce8b9d8b.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKh5pyJ5L2Z5Zyw5rKh5pyJ5L2Z5Zyw,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center) ![在这里插入图片描述](https://img-blog.csdnimg.cn/30ec84d0c16645c5ae55018140a254f3.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKh5pyJ5L2Z5Zyw5rKh5pyJ5L2Z5Zyw,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
4. GPIO工作模式——复用模式
![在这里插入图片描述](https://img-blog.csdnimg.cn/a60eacbd1fee4425b5b59c4139f7ddbe.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKh5pyJ5L2Z5Zyw5rKh5pyJ5L2Z5Zyw,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
①输出驱动器打开
②施密特触发器打开
③通过寄存器使能上拉/下拉电阻
④通过输入数据寄存器获取引脚状态
六. 端口寄存器
![请添加图片描述](https://img-blog.csdnimg.cn/77f4d6659634492a926b76de7c29b1f1.jpg?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKh5pyJ5L2Z5Zyw5rKh5pyJ5L2Z5Zyw,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center) 每一个端口都包括这10个寄存器,其中x表示端口号,取值从A~K
模式寄存器GPIOx_MODER
![请添加图片描述](https://img-blog.csdnimg.cn/7fc7df2d55084535847ba342e80834c8.jpg?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKh5pyJ5L2Z5Zyw5rKh5pyJ5L2Z5Zyw,size_20,color_FFFFFF,t_70,g_se,x_1#pic_center)
输出类型寄存器GPIOx_OTYPER
![请添加图片描述](https://img-blog.csdnimg.cn/d4c22025254541f294ee834d58cc161f.jpg?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKh5pyJ5L2Z5Zyw5rKh5pyJ5L2Z5Zyw,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
输出速度寄存器GPIOx_OSPEEDR
![在这里插入图片描述](https://img-blog.csdnimg.cn/92236525cee94e9294596d631e01f21e.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKh5pyJ5L2Z5Zyw5rKh5pyJ5L2Z5Zyw,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
上拉/下拉寄存器GPIOx_PUPDR
![在这里插入图片描述](https://img-blog.csdnimg.cn/acfb19a33ce241e58b8739921b30667e.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKh5pyJ5L2Z5Zyw5rKh5pyJ5L2Z5Zyw,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
输入数据寄存器GPIOx_IDR
![在这里插入图片描述](https://img-blog.csdnimg.cn/98a7c56941f64c78a7e1da3041ce46fe.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKh5pyJ5L2Z5Zyw5rKh5pyJ5L2Z5Zyw,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
输出数据寄存器GPIOx_ODR
![在这里插入图片描述](https://img-blog.csdnimg.cn/4eb911ed93084a23830c4b35caccdcfa.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKh5pyJ5L2Z5Zyw5rKh5pyJ5L2Z5Zyw,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
注意事项: 输出数据寄存器GPIOx_ODR
- 设置某一个引脚的输出电平时,只修改该引脚对应的位,而不要修改其他的位
- 设置输出数据寄存器的某一个位为1,并不代表该位对应的引脚一定输出高电平。 有可能该引脚在外围电路的作用下拉到了低电平。 因此应该通过读取输入数据寄存器GPIOx_IDR来获取引脚的真实电平情况
置位/复位寄存器GPIOx_BSRR
![在这里插入图片描述](https://img-blog.csdnimg.cn/4b819d1b1d644e909383fa7fb7b7bfdb.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKh5pyJ5L2Z5Zyw5rKh5pyJ5L2Z5Zyw,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
使用举例
![在这里插入图片描述](https://img-blog.csdnimg.cn/d3d84859fcbd4a6aa9c50654a0c3f8a6.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKh5pyJ5L2Z5Zyw5rKh5pyJ5L2Z5Zyw,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
结论: 设置多个引脚输出高/低电平时,使用置位/复位寄存器更加简单
七. 利用指针访问单个寄存器
寄存器地址
![在这里插入图片描述](https://img-blog.csdnimg.cn/197b9ae612b04120b27623d07095f2de.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKh5pyJ5L2Z5Zyw5rKh5pyJ5L2Z5Zyw,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
地址转换方法
![在这里插入图片描述](https://img-blog.csdnimg.cn/e877dfb3fcf340ac9e073dba1a1ddcb2.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKh5pyJ5L2Z5Zyw5rKh5pyJ5L2Z5Zyw,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
地址转换过程
![在这里插入图片描述](https://img-blog.csdnimg.cn/bcd682f764b34d89bebc529933aa71d4.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKh5pyJ5L2Z5Zyw5rKh5pyJ5L2Z5Zyw,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
指针基类型
![请添加图片描述](https://img-blog.csdnimg.cn/ba7cde424e0947389260db810a4f973d.jpg?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKh5pyJ5L2Z5Zyw5rKh5pyJ5L2Z5Zyw,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
演示例程
驱动指示灯
- 例程目标
基于寄存器的程序开发方式 - 例程内容
控制开发板的用户指示灯LD2连续闪烁
新建工程
![在这里插入图片描述](https://img-blog.csdnimg.cn/524f27f0279f413da75bb7af53545b46.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKh5pyJ5L2Z5Zyw5rKh5pyJ5L2Z5Zyw,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
注: 选择自己使用的芯片型号
![在这里插入图片描述](https://img-blog.csdnimg.cn/b0cbf6abed434b3a8ebcce1cbde17e12.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKh5pyJ5L2Z5Zyw5rKh5pyJ5L2Z5Zyw,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
编程代码
![在这里插入图片描述](https://img-blog.csdnimg.cn/b18985d93a5547d6aca3ffef55c9e798.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKh5pyJ5L2Z5Zyw5rKh5pyJ5L2Z5Zyw,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
程序编译,下载
![在这里插入图片描述](https://img-blog.csdnimg.cn/8b6c59e4c2184369a28f9035a8eac04e.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKh5pyJ5L2Z5Zyw5rKh5pyJ5L2Z5Zyw,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
八. 利用结构体指针访问寄存器组
寄存器组
![请添加图片描述](https://img-blog.csdnimg.cn/4d600175841d49898f35ca8267ffc686.jpg?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKh5pyJ5L2Z5Zyw5rKh5pyJ5L2Z5Zyw,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
tepedef 定义别名
![在这里插入图片描述](https://img-blog.csdnimg.cn/89fee9e1703942b2a2a32e731c3ef6a5.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKh5pyJ5L2Z5Zyw5rKh5pyJ5L2Z5Zyw,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
__IO | unint32_t | GPIO_TypeDef |
---|
更能突出变量的硬件特性 | 更能表明数据类型所占的位数 | 代替结构体模板 |
区别
![在这里插入图片描述](https://img-blog.csdnimg.cn/8a0b895f6ad940bf873ebbfeceed6844.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKh5pyJ5L2Z5Zyw5rKh5pyJ5L2Z5Zyw,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
寄存器组定义
![在这里插入图片描述](https://img-blog.csdnimg.cn/31ee50a475aa4e909380f5fa3565911f.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKh5pyJ5L2Z5Zyw5rKh5pyJ5L2Z5Zyw,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
芯片头文件
![在这里插入图片描述](https://img-blog.csdnimg.cn/59ffcd3a10b64f618bfa0af6b9cecfc0.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKh5pyJ5L2Z5Zyw5rKh5pyJ5L2Z5Zyw,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
编程代码
![在这里插入图片描述](https://img-blog.csdnimg.cn/74440982c3944d4d96d05bc567d8583e.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKh5pyJ5L2Z5Zyw5rKh5pyJ5L2Z5Zyw,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center) ![在这里插入图片描述](https://img-blog.csdnimg.cn/2a595fd169aa4a8db338b37b85c76794.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKh5pyJ5L2Z5Zyw5rKh5pyJ5L2Z5Zyw,size_16,color_FFFFFF,t_70,g_se,x_16) ![在这里插入图片描述](https://img-blog.csdnimg.cn/067c82e50b6048d893c7bb6ab7de992e.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKh5pyJ5L2Z5Zyw5rKh5pyJ5L2Z5Zyw,size_16,color_FFFFFF,t_70,g_se,x_16)
GPIOx->BSRR|=1<<5; // 01 左移 5 位,即低16位控制对应5引脚写入1;此次操作实现配置端口5输出高电平
GPIOC->MODER|=1<<(5*2); // 01 左移 5 * 2=10位,即配置位11、10置为01;此次操作实现配置端口5为输出模式
while(delay–) //就是Delay 这个数不断的递减。当Delay==0 时,循环结束。
![在这里插入图片描述](https://img-blog.csdnimg.cn/72a0fe44671e4824a7658ab51583ff55.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKh5pyJ5L2Z5Zyw5rKh5pyJ5L2Z5Zyw,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
简化寄存器配置过程
![在这里插入图片描述](https://img-blog.csdnimg.cn/c9e1a658c58f47f08f965e1f5b4f46ec.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKh5pyJ5L2Z5Zyw5rKh5pyJ5L2Z5Zyw,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/02d63ef21b184395be908eb48a2dce01.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKh5pyJ5L2Z5Zyw5rKh5pyJ5L2Z5Zyw,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
|