STM32之GPIO口
GPIO定义
通用输入输出接口GPIO是嵌入式系统、单片机开发过程中最常用的接口,用户可以通过编程灵活的对接口进行控制,实现对电路板上LED、数码管、按键等常用设备控制驱动,也可以作为串口的数据收发管脚,或AD的接口等复用功能使用。因此其作用和功能是非常重要的,STM32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。
芯片引脚
STM32芯片上的引脚类型被分为了:电源引脚、晶振引脚、GPIO引脚等。GPIO引脚类的所有引脚又通过编号分为了:PA类、PB类、等,根据芯片类型不同类数也不同,但每类引脚最多只有16个,例如:PA0~PA15。STM32-G030C8T6的部分引脚功能如下图:(注:所有实验均是基于STM32-G030C8T6型号核心板进行开发测试)
GPIO工作模式
GPIO引脚的工作模式分为两种:输入模式和输出模式,这两种模式也有不同的类型。
输入模式:浮空输入、上拉输入、下拉输入、模拟输入
输出模式:开漏输出、复用开漏输出、推挽输出、复用推挽输出
GPIO相关寄存器介绍
GPIO寄存器MODER(端口模式寄存器)
GPIO寄存器OTYPER(端口输出类型寄存器)
GPIO寄存器OSPEEDR(输出速度寄存器)
GPIO寄存器PUPDR(上拉 / 下拉寄存器)
GPIO寄存器IDR(输入数据寄存器)
GPIO寄存器ODR(输出数据寄存器)
GPIO寄存器BSRR(置位 / 复位寄存器)
使用GPIO口点亮LED灯
可以看出,LED灯通过PB0、1、2三个引脚和核心板相连接。
进入CbueMX,选中对于的STM32型号,然后配置引脚,配置完成如下图
此外,我们将这三个GPIO引脚设置成输出模式后,还可以进一步进行配置,例如选择是否上拉电阻,是否位推挽模式、传输速度、优先级等等
然后就可以生成代码工程,并导入到keil5中,下面对关键的代码进行分析。
GPIO的初始化,生成工程时,自动完成(CubeMX的好处....???)
在main文件中,就可以使用GPIO口对引脚进行操作,复位PB0, PB1, PB2 既点亮LED,反之至位则是关闭LED,如果加上Delay延迟函数,也就可以实现流水灯的效果。
使用按键控制LED的开关
可以看出,按键与核心板的PA8引脚相连
CubeMX的配置如上图,设置LED灯的引脚位输出模式,将按键设置成GPIO中断模式,按下按键能够产生中断,中断配置如下:
使能按键中断,按键产生的中断编号是EXTI8,处于4到15之间,另外还使能了串口USART1中断,让串口传输、接收数据时能够产生中断。使用到了串口,那么还要对它进行一个配置,如下图
基本配置:波特率、数据位、校验位、停止位。具体在串口再将,一般设置为115200和8 N 1
进入工程,分析代码
如上图,当中断源(按键、串口)产生了中断信号后,就会通过以上函数进行处理,CubxMX特别贴心的初始化好了产生中断的引脚以及对象,继续追踪代码
对于按键,在本核心板中是GPIO8的引脚产生的中断,对于按键的中断处理函数中,可以看见里面包含了两个函数(按键按下以及按下抬起产生),然后追踪其内部的回调函数进一步实现我们需要的功能(这两个函数其实是ARM里的虚函数,可以进行重写,不知道为什么这次追不到........)
以上代码实现的就是,按键改变LED的状态,以及当按键按下时,通过串口发送一个字符串Key Press,这里没有使用串口产生中断,串口产生中断的函数为HAL_UART_Transmit_IT
更为详细的GPIO介绍和原理的学习的博客地址:
【STM32】标准库与HAL库对照学习教程特别篇--GPIO详讲_stm32 hal库 电源设置_修成真的博客-优快云博客
STM32之UART串口
通信定义
同步通信:一般情况下同步通信指的是通信双方根据同步信号进行通信的方式。比如通信双方有一个共同的时钟信号,大家根据时钟信号的变化进行通信(如下图的SPI)
异步通信:是指数据传输速度匹配依赖于通信双方有自己独立的系统时钟,大家约定好通信的速度。异步通信不需要同步信号,但是并不是说通信的过程不同步(如下图的UART)
串行通信:指的是同一时刻只能收或发一个bit位信息。因此只用1根信号线即可
并行通信:指的是同一时刻可以收或发多个bit位的信息,因此需要多根信号线才行
单工:要么收,要么发,只能做接收设备或者发送设备。比如收音机
半双工:可以收,可以发,但是不能同时收发, 比如对讲机
全双工:可以在同一时刻既接收,又发送。 手机
串口通信一般流程
USART寄存器介绍






HAL库中串口的收发函数
Stm32f0xx_hal_uart.c 文件中
串口的发送函数:HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
串口的接收函数:HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
int fputc(int ch,FILE *f){
while((USART1->ISR&(1<<7)) == 0);
USART1->TDR=(uint8_t)ch;
return ch;
}