STM32外设:通用输入输出 GPIO、EXIT
主要外设:
- GPIO:General Purpose I/O 一般用途IO
- EXIT:External Interrupt/Event Controller 外部中断/事件控制器(STM32)
辅助外设:
- SYSCFG:System configuration controller系统配置控制器(STM32)
- NVIC:Nested Vectored Interrupt Controller嵌套向量中断控制器(ARM)
- SCB:System Control Block系统控制块(ARM)
IO引脚:
- 默认作为一般用途的引脚,引脚GPIOCPU
- 用代码设为专用功能引脚,引脚GPIO片上外设的某个外部引脚(复用)(利用GPIO的输入电路、输出电路、增加少量控制单元)
GPIO中的基本电路
输出电路
选择输出速度OSPEEDR→选择推挽/开漏OTYPER→选择上下拉电阻PUPDR→保护二极管→引脚
- 保护二极管:当输入电压过高或过低时,二极管导通,输入电压拉到VDD或GND,保护STM32 MCU
- 上下拉电阻 pull-up/pull-down:内部带有很弱的上下拉电阻绝大多数情况不使用
- 输出类型-推挽Push-Pull:绝大多数情况,可输出VDD或GND
- 输出类型-开漏Open Drain:很少情况,可输出GND或浮空(输出高电平需要外接电源和上拉电阻,用于输出电平转换、多个OD输出并联实现“线与”、I2C)
- 输出速度:输出驱动电路的响应速度,跟应用相匹配,速度配置越高,噪声越大,功耗越大。
| GPIO寄存器 | 作用 | 数量x位宽 | 值 |
|---|---|---|---|
| OSPEEDR | 输出速度 | 16x2bit | 0-低速2MHz、1-中速25MHz、2-快速50MHz、3-高速80MHz~100MHz |
| OTYPER | 输出类型 | 16x1bit | 0-输出推挽、1-输出开漏 |
| PUPDR | 上下拉电阻 | 16x2bit | 0-无(浮空)、1-上拉、2-下拉 |
输入电路
TTL施密特触发器←选择上下拉电阻PUPDR←保护二极管←引脚
| GPIO寄存器 | 作用 | 数量x位宽 | 值 |
|---|---|---|---|
| PUPDR | 上下拉电阻 | 16x2bit | 0-无(浮空)、1-上拉、2-下拉 |
- TTL施密特触发器:信号进行数字采样
一、GPIO_Output:通用输出模式
主要功能:CPU写入BSRR或ODR寄存器,控制引脚输出高低电平
数据通路:
CPU→...→[选择置位/复位BSSR]→选择输出电平ODR→输出电路→引脚GPIO_Output
| GPIO寄存器 | 作用 | 数量x位宽 | 值 |
|---|---|---|---|
| MODER | 模式 | 16x2bit | 0-输入、1-通用输出、2-复用功能、3-模拟 |
| BSRR | 置位/复位 | 16x2bit | BitReset:0-无操作、1-复位 BitSet:0-无操作、1-置位 |
| ODR | 输出数据 | 16x1bit | 0-低电平、1-高电平 |
User Label(可选):用来给引脚起别名,提高代码可读性、移植性(更换引脚时只修改宏),对GPIO端口和引脚定义宏
//在main.h中
#define XXX_GPIO_Port GPIOx
#define XXX_Pin GPIO_PIN_y
硬件设计
PA5外接高电平驱动方式的指示灯电路(驱动指示灯:高电平)
CubeMX的配置
- 引脚分配Pinout View
- 搜索PA5 设置为GPIO_Output
- 外设配置
- System Core-GPIO-引脚清单(单击) → PA5配置 → 用户标签=LED2、(工作)模式=Output Push Pull、(初始)输出电平=low、最大输出(翻转)速度=low、上下拉电阻=No
用户代码
//USER CODE3:后台程序(无限循环)
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);//输出高电平
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);//输出低电平
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);//输出电平翻转
HAL_Delay(1000);
二、GPIO_input:输入模式(轮询)
主要功能:CPU读取IDR寄存器,读取引脚电平
- 轮询、CPU忙等、效率低
- 作为复位后的默认工作模式
数据通路:
CPU←...←APB外设总线←存储输入电平IDR←输入电路←引脚GPIO_input
| GPIO寄存器 | 作用 | 数量x位宽 | 值 |
|---|---|---|---|
| MODER | 模式 | 16x2bit | 0-输入、1-通用输出、2-复用功能、3-模拟 |
| IDR | 输入数据 | 16x1bit | 0-低电平、1-高电平 |
硬件设计
PC13外接上拉式按键(按键控制:按下为低电平)
CubeMX的配置
- 引脚分配Pinout View
- 搜索PC13 设置为GPIO_Input
- 外设配置
- System Core-GPIO-引脚清单(单击) → PC13配置 →用户标签=KEY1、(工作)模式=input mode、上下拉电阻=No
用户代码
//USER CODE3:后台程序(无限循环)
if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13)==GPIO_PIN_RESET){//按键按下
HAL_Delay(10);//延迟去抖动
if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13)==GPIO_PIN_RESET){//按键仍然按下
//TODO 执行按键按下后的操作
}
}
//等待释放:知道引脚变为高电平
while(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13)==GPIO_PIN_RESET);
三、GPIO_Exit:输入模式(中断)
主要功能:先将GPIO和EXIT建立连接,再由EXIT、NVIC的配置,决定CPU何时调用中断回调函数(外部中断External Interrupte)
数据通路:
中断回调函数←...←CPU←...←NVIC←...←APB外设总线←挂起请求PR←中断屏蔽IMR←[软件触发SWIER]←边沿监测RTSR和FTSR←Exit输入线(0~15号)←SYSCFG_EXTICR(引脚分组)←输入电路←引脚GPIO_Exit
- GPIO在GPIO_Input模式下:接收外部输入
- SYSCFG的EXTICR位:负责将GPIO的输入电路和EXIT的输入线连接
- EXIT:设置触发条件(上升沿RTSR、下降沿FTSR、双边沿、软件触发SWIER)、中断屏蔽IMR、保存中断标记PR(是否触发的状态)、发送给NVIC
- PR寄存器的注意事项:软件写1清0,方便对其他bit写0不变 (若写0清0的话,会导致其他状态位的挂起状态也被清空)
| GPIO寄存器 | 作用 | 数量x位宽 | 值 |
|---|---|---|---|
| MODER | 模式 | 16x2bit | 0-输入、1-通用输出、2-复用功能、3-模拟 |
| SYSCFG寄存器 | 作用 | 数量x位宽 | 值 |
|---|---|---|---|
| EXTICR1~4 | 外部中断配置 | 16x4bit | IO引脚→(9-1 MUX)→EXIT输入线 0-PA口 1-PB口 2-PC口 3-PD口 4-PE口 5-PF口 6-PG口 7-PH口 8-PI口 |
| EXIT寄存器 | 作用 | 数量x位宽 | 值 |
|---|---|---|---|
| RTSR | 上升沿触发选择(中断触发条件) | 0-禁止、1-允许 | |
| FTSR | 下降沿触发器选择(中断触发条件) | 0-禁止、1-允许 | |
| SWIER | 软件中断/事件(中断触发条件) | 0-无操作、1-软件触发 | |
| IMR | 输入线的中断请求(中断屏蔽) | 23x1 | 0-禁止、1-允许 |
| PR | 挂起请求(中断标志位) | 0-没有触发或有触发且被CPU处理、1-有触发且尚未被CPU处理(挂起状态)、 软件写1清0或更改RTSR、FTSR时清0 |
16个输入线→EXIT→NVIC(7个中断通道)
EXIT 0~4分别具有独立的中断通道
- EXIT 0→EXTI0_IRQHandler
- EXIT 1→EXTI1_IRQHandler
- EXIT 2→EXTI2_IRQHandler
- EXIT 3→EXTI3_IRQHandler
- EXIT 4→EXTI4_IRQHandler
EXTI5~EXIT9共享同一个中断通道
- EXIT 5~9→EXTI9_5_IRQHandler
EXTI10~EXIT15共享同一个中断通道
EXIT 10~15→EXTI15_10_IRQHandler
NVIC:中断优先级分组、中断优先级设置、中断使能(判定优先级、中断屏蔽、决定是否发给CPU)
CPU:并进行中断响应、调用中断函数
CPU调用中断服务程序:先判断EXIT的PR是否有挂起中断,若有挂起中断、则先清中断(EXIT的PR写1清0)、再调用用户自定义的中断回调函数
EXTIx_IRQHandler:重写了汇编启动文件中EXTIx_IRQHandler(在stm32f4xx_it.c中CubeMX自动生成)
HAL_GPIO_EXTI_IRQHandler(GPIO_Pin):定义中断回调函数的统一入口,包含EXIT中断的不同外设相同处理的部分(在stm32f4xx_hal_gpio.c中HAL库定义)
- __HAL_GPIO_EXTI_GET_IT(GPIO_Pin):获取EXIT的PR状态(在stm32f4xx_hal_gpio.h中HAL库定义)
- __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin):清中断(EXIT的PR写1清0)(在stm32f4xx_hal_gpio.h中HAL库定义)
HAL_GPIO_EXTI_Callback(GPIO_Pin):EXIT中断的不同外设不同处理的部分,中断回调函数的业务逻辑(在main.c中用户自定义)
硬件设计
PC13外接上拉式按键(按键控制:按下为低电平)
在按下时产生下降沿,PC13的外部中断功能→外部中断线EXTI1
CubeMX的配置
- 引脚分配Pinout View:搜索PC13 设置为GPIO_EXTI13
- 外设配置
- System Core-GPIO-引脚清单(单击) → PC13配置 → 用户标签=KEY1、(工作)模式=外部中断模式 with 下降沿触发、上下拉电阻=No
- System Core-NVIC-NVIC中断表 → EXTI Line[15:10] interrupts → 勾选使能、抢占优先级=15,子优先级=0
用户代码
//USER CODE4:定义中断回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
if( GPIO_Pin == GPIO_PIN_13 ){ // 判断外部中断源
//TODO 执行按键按下后的操作
}
}
四、GPIO_Exit:输入模式(事件)
主要功能:使用事件屏蔽,产生事件脉冲,发送给片上外设的某个外部引脚 (外部事件External Event)
数据通路:
片上外设的某个外部引脚←产生事件脉冲←事件屏蔽EMR←[软件触发SWIER]←边沿监测RTSR和FTSR←Exit输入线(0~15号)←SYSCFG_EXTICR(引脚分组)←输入电路←引脚GPIO_Exit
| EXIT寄存器 | 作用 | 数量x位宽 | 值 |
|---|---|---|---|
| EMR | 输入线的事件请求(屏蔽) | 23x1 | 0-禁止、1-允许 |
五、GPIO_Analog:模拟模式
主要功能:引脚作为模拟IO引脚、功率最低(ADC或DAC“导线”引脚)
数据通路:
ADC或DAC上下拉电阻(无)保护二极管引脚GPIO_Analog
| GPIO寄存器 | 作用 | 数量x位宽 | 值 |
|---|---|---|---|
| MODER | 模式 | 16x2bit | 0-输入、1-通用输出、2-复用功能、3-模拟 |
- 模拟IO引脚无须上下拉电阻
六、GPIO_AF:复用功能模式
主要功能:将引脚设为某个外设的专用功能引脚
数据通路:
片上外设的某个外部引脚16选1的复用器AF输入电路/输出电路引脚GPIO_AF
| GPIO寄存器 | 作用 | 数量x位宽 | 值 |
|---|---|---|---|
| MODER | 模式 | 16x2bit | 0-输入、1-通用输出、2-复用功能、3-模拟 |
| AFR[2] | 复用功能 | 16x4bit | 引脚分配一个复用功能,连接到指定外设,作为(16选1的MUX) |
16选1的复用器:负责将GPIO和外设的某个外部引脚连接
- 1根线端:GPIO引脚
- 16根线端:AF0为系统默认的GPIO功能、AF1~AF13作为其他外设的专用功能的数字IO引脚、AF15为EVENTOUT
- 选择端:AFR中的4bit
七、HAL库
GPIO_InitTypeDef
- GPIO_init->Pin:用于在寄存器内部定位bit
- GPIO_Init->Mode:是否为GPIO_input的中断模式(SYSGFG:外部中断映射配置、EXIT:中断屏蔽、事件屏蔽、是否上升沿触发、是否下降沿触发)、GPIO模式(GPIO:工作模式、输出模式)
- GPIO_Init->Speed 设置GPIO的输出速度
- GPIO_Init->Pull 设置GPIO的上下拉电阻
- GPIO_Init->Alternate 设置GPIO的AFR
HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init):外设初始化函数
- 检查参数
- 遍历GPIO所有引脚:根据GPIO_init->Pin定位,是否进行配置
- 若GPIO工作模式为输出模式或复用功能模式:根据GPIO_Init->Mode、Speed,设置GPIO的OSPEEDR、OTYPE
- 若GPIO工作模式非模拟模式:根据GPIO_Init->Pull,设置GPIO的PUPDR
- 若GPIO工作模式为复用模式:根据GPIO_Init->Alternate,设置GPIO的AFR
- 设置GPIO的MODER
- 若为GPIO_input的中断模式:清理EXIT的IMR、EMR、RTSR、FTSR的配置、根据GPIO_Init->Mode,设置SYSGFG的EXITCR、设置EXIT的IMR、EMR、RTSR、FTSR
STM32外设:通用输入输出 GPIO、EXIT的更多相关文章
- stm32学习笔记之GPIO功能框图分析
GPIO 是通用输入输出端口的简称,简单来说就是STM32 可控制的引脚,STM32 芯片的GPIO 引脚与外部设备连接起来,从而实现与外部通讯.控制以及数据采集的功能.STM32 芯片的GPIO被分 ...
- STM32入门系列-STM32外设地址映射
片上外设区分为四条总线,根据外设速度的不同,不同总线挂载着不同的外设,APB1挂载低速外设,APB2和AHB挂载高速外设.相应总线的最低地址我们称为该总线的基地址,总线基地址也是挂载在该总线上的首个外 ...
- (stm32学习总结)—GPIO位带操作
本章参考资料:<STM32F10X-中文参考手册>存储器和总线构架章节.GPIO 章节,<CM3 权威指南 CnR2>存储器系统章节. 位带简介 位操作就是可以单独的对一个比特 ...
- 实验记录三 通用输入输出(GPIO)
之前把全部程序都跑了一次后,得到了导师下一步的安排. 例如以下: 1.编写一个程序.实如今LCD上显示一个万年历,包含年月日 星期 还有室内的温度.2.编写一个程序,将原来的交通灯改为跑马灯. 期限是 ...
- [stm32] STM32的通用定时器TIMx系统了解
通用定时器(TIMx) 一.TIMx简介 二.TIMx主要功能 三.TIMx功能描述 3.1 时基单元 3.2 计数器模式 3.3 时钟选择 3.4 捕获/比较通道 3.5 输入捕获模式 3.6 PW ...
- STM32F4 输入输出(GPIO)模式理解
stm32的GPIO的配置模式有好几种,包括: 1. 模拟输入: 2. 浮空输入: 3. 上拉输入: 4. 下拉输入: 5. 开漏输出: 6. 推挽输出: 7. 复用开漏输出: 8. 复用推挽输出 ...
- Stm32之通用定时器复习
因为毕业设计要用到PWM调光很久都没用到Stm32的定时器,有些内容已经遗忘,为了回顾复习相关内容今天开下通用定时器这一章节的数据手册. 1.时钟 通用定时器一般是TIM2~TIM5,TIM1.TIM ...
- STM32(2)——GPIO
对于初学者而言,最简单的是对芯片上的IO进行操作,我们学习ARM时候,第一个工程就是点亮LED,STM32F103ZET6通用输入输出接口(General-Purpose Inputs/Outputs ...
- 一文打尽PWM协议、PPM协议、PCM协议、SBUS协议、XBUS协议、DSM协议 | STM32的通用定时器TIM3实现PPM信号输出
PWM.PPM.PCM.SBUS.XBUS.DSM都是接收机与其他设备通信的协议. 请注意这里不要将遥控器和接收机之间的协议混淆.遥控器和接收机之间会采用某种协议来互相沟通,这些协议往往各个厂牌各自有 ...
- LPC1768基本输入输出GPIO使用
LPC1788通用IO口的控制包含了一些基本的组件,比如设置推挽输出,开漏输出,上拉电阻等,我们今天来看看. 首先使用GPIO要打开GPIO的系统时钟 LPC_SC->PCONP |= (1 ...
随机推荐
- Dokcer学习之旅(1)——运行一个简单的容器
基本概念 镜像 我们都知道,操作系统分为 内核 和 用户空间.对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持.而 Docker 镜像(Image),就相当于是一个 ...
- ZS Shuffles Cards 题解
ZS Shuffles Cards 题解 我们把每一次抽一些数字牌再抽到 joker 视作一局游戏. 每局期望轮数 首先考虑 \(f_i\) 表示每一局游戏抽出 \(i\) 张牌的概率. 那么就是先抽 ...
- MIT6.s081/6.828 lectrue5/6:System call entry/exit 以及 Lab4 心得
这篇博客主要复习 lecture05:GDB calling conentions 和 lecture06:System call entry/exit 的内容,外加 Lab4:traps 的心得 前 ...
- 第一个程序PingPong
功能需求 如图所示,开启两个ping类型的服务ping1和ping2,ping1给ping2发消息,ping2收到回应ping1,ping1收到再回应ping2,不断循环. 服务模块 Skynet提供 ...
- GrapeCity Documents V6.0 Update 2发布,新增支持SpreadJS的.sjs文件格式
近日,GrapeCity Documents 正式迎来其V6.2 的发布更新,能够支持 SpreadJS 中 .sjs 类型的文件.这一重大更新将为用户带来更多地惊喜. .sjs文件有两个关键优势:空 ...
- WPF学习 - 动画基础(2)
上一篇文章粗略的介绍了一下Animation类.本篇介绍一下Storyboard. Storyboard,姑且翻译成"故事板"吧.实际上它是一个Animation对象的容器,可以容 ...
- 聊透 GPU 通信技术——GPU Direct、NVLink、RDMA 审核中
最近人工智能大火,AI 应用所涉及的技术能力包括语音.图像.视频.NLP 等多方面,而这些都需要强大的计算资源支持.AI 技术对算力的需求是非常庞大的,虽然 GPU 的计算能力在持续提升,但是对于 A ...
- 【ChatGPT-应用篇】基于chatGPT覆盖测试过程的初步探索
1.前言 22年底ChatGPT就已风靡行业内外,简单来说,它是基于自然语言生成式 AI 模型,打造的一款聊天机器人.是 OpenAI 于 11 月 30 日推出的最新作品,供公众免费测试.他可以根据 ...
- Springboot简单功能示例-5 使用JWT进行授权认证
springboot-sample 介绍 springboot简单示例 跳转到发行版 查看发行版说明 软件架构(当前发行版使用) springboot hutool-all 非常好的常用java工具库 ...
- 关于Word转PDF的几种实现方案
在.NET中,你可以使用Microsoft.Office.Interop.Word库来进行Word到PDF的转换.这是一个示例代码,但请注意这需要在你的系统上安装Microsoft Office. 在 ...