STM32CUBEMX配置教程(三)通用GPIO配置

基于STM32H743VI
使用STM32CUBEMX两年了,始终觉得这个工具非常的方便,但因为不是经常使用,导致有些要点总是会有些遗忘,因此写下这一系列教程以供记忆,顺便让我这个大萌新给广大小萌新提供一些学习帮助。

本次配置的工程链接在最下方,有需要自取。
0基础可以从第一个教程开始阅读
STM32CUBEMX配置教程(一)基础配置
STM32CUBEMX配置教程(二)时钟等内部参数配置

1 新建工程

参考STM32CUBEMX配置教程(一)基础配置

2 修改时钟树

参考STM32CUBEMX配置教程(二)时钟等内部参数配置

3 GPIO输出配置

点击CUBEMX左侧你想要配置的引脚,以配置PA0为例,即可出现GPIO的配置界面,在此只介绍通用的GPIO配置,即模拟的GPIO,再简单来说只配置GPIO为输入或者输出,对应GPIO_Input和GPIO_Output。在这里插入图片描述
若想要配置PA0为输出模式,则在上图界面中点击GPIO_Output即可配置引脚为输出,同时在界面上也会有相应的显示:
在这里插入图片描述
此时只是仅仅配置了GPIO口为输出模式,STM32CUBEMX还提供许多其他参数以供配置。点击System Core下的GPIO选项,从右侧窗口找到PA0这个IO口并点击一下。在这里插入图片描述
点击之后窗口界面会显示PA0的详细配置参数(输出),如下图所示:
在这里插入图片描述其中:

GPIO output leve
表示上电的默认电平,可配置高或者低
GPIO mode
表示输出模式,可配置为Output Push Pull(推挽输出)或Output Open Drain(开漏输出)
GPIO Pull-up/Pull-down
表示是否上下拉,可配置为上拉或者下拉
Maximum output speed
表示输出速度,对于高速接口需要配置为Very High
User Label
可修改IO口名称,比如可写入LED,把IO口名称变为LED

对于输出速度,某些型号可能会写2M,20M,50M等字样,但是对于通用IO口来说不可能达到50M的翻转速率。详见番外篇:STM32之GPIO口速率配置究竟代表什么
对于驱动LED,一般配置IO口为推挽输出,上下拉非必要,IO速度低速即可。

配置完成生成工程,下面介绍调用的函数,首先是GPIO控制函数:

HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)

例如我想要控制PA0为高电平:

HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);

我想要控制PA0为低电平:

HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET);

下面是GPIO的自动翻转的函数:

void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)

例如控制PA0自动翻转

HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0);

4 GPIO输入配置

上述介绍了输出的一些功能配置以及调用的函数,下面介绍输入的配置即调用的函数。
以配置PA1为输入为例,现在右侧ui界面选中PA1并配置为输入模式:
在这里插入图片描述
点击System Core下的GPIO选项,从右侧窗口找到PA1这个IO口并点击一下,此时会出现关于这个IO口的更多的配置。但是当配置为输入时,可配置的参数相对于输出时少了不少,唯一的配置选项为配置上下拉,注意,最后一行User Label只是对GPIO命名,不少对IO进行寄存器配置。
在这里插入图片描述
参数配置相对简单,下面是调用IO口读取的hal库函数:

unsigned char pin_val;
pin_val=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);

由此可见,GPIO的电平数值回读取到pin_val中,注意,此处读取到的值为0或1,即为高低电平。
下面给出最为基础的HAL库下的按键消抖方式(读取PA1引脚),这种方式调用了延时和while循环,效率非常低,但是逻辑相对简单。

if(!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1))
{
	HAL_Delay(20);
	if(!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1))
	{
		key_val=1;
	}
	while(!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1));
}

还有其他更多的按键扫描方式,较为常用的是状态机矩阵按键扫描法,但是这种方法需要不断的扫描IO口,尽管没有延时但依旧占用大量的CPU资源,如果系统较复杂可能回影响系统的实时性能。

在高度复杂的系统中最好采用矩阵基于中断的矩阵键盘扫描法,即在普通状态下无需扫描,只当按键被按下触发了中断才进行一次按键扫描。

基于中断的矩阵键盘扫描法对于4x4矩阵键盘会占用8个IO口,这与普通状态机方式无异,但中断方式需要额外占用外部中断资源,但优点是减少了CPU的占用。中断方法网上相关资料较少,有时间我会专门出番外篇介绍。

工程链接:
https://download.csdn.net/download/weixin_44584198/20462112

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐