STM32CubeMX学习三 之外部中断

文章目录

  • 前言
  • 一、本地环境
  • 二、开始
    • 1.外部中断配置
    • 2.时钟配置
    • 3.代码生成
    • 3.编译工程
    • 4.添加功能代码
    • 在这里插入图片描述


前言

记录一下STM32CubeMX的学习笔记,同时分享给初学的小白,希望一起进步。
如何使用STM32CubeMX以及工程创建在之前的博客有提到,这里就直接从外部中断讲起。


一、本地环境

编译环境:KEIL
代码生成:STM32CubeMX
库:HAL
MCU:STM32F072

二、开始

1.外部中断配置

假设你的cubeMX工程已经建好,这里我们配置KEY1、KEY2、KEY3三个按键输入引脚为EXIT(外部中断)功能。

选中“Pinout&Configuration”选项,点击左边的System Core选项,选中GPIO。
STM32CubeMX学习三 之外部中断_第1张图片
在 Pinout 界面配置 GPIO,这里我们设置PA0 、 PA1 、PA2为外部功能。
STM32CubeMX学习三 之外部中断_第2张图片
设置完成后可以看到引脚变绿了,切右键点击可以设置引脚的label名称,生成工程的时候该引脚就会命名为你设置的label名。
STM32CubeMX学习三 之外部中断_第3张图片

设置好过后我们会在中间看到gpio的初始配置,点击引脚,接下来我们根据自己的需求给GPIO配置成我们想要的模式。
STM32CubeMX学习三 之外部中断_第4张图片

1、配置gpio的上拉电阻
2、配置gpio的中断触发沿
2、配置gpio的中断触发模式

配置后如图:
STM32CubeMX学习三 之外部中断_第5张图片
选择对应的GPIO来进行配置,我这里是吧三个按键IO设置成了中断触发和上拉的模式。
这里还要讲一下,外部中断触发模式还有很多种:
1、上升沿中断触发
2、下降沿中断触发
3、上升/下降沿中断触发
4、外部事件上升沿触发
5、外部事件下降沿触发
6、外部事件上升/下降沿触发

以上六种中断触发模式都是我们可以设置的,大概意思就是这个GPIO在变高电平或者低电平的时候会触发中断,然后完成中断回调里面的功能函数。
STM32CubeMX学习三 之外部中断_第6张图片

NVIC中断使能配置:
STM32CubeMX学习三 之外部中断_第7张图片

2.时钟配置

配置完GPIO后开始配置时钟,这里讲的是没有外部时钟,用的是内部时钟,默认14Mhz的内部时钟。
STM32CubeMX学习三 之外部中断_第8张图片

3.代码生成

时钟配置完毕后,选择“Project Manager”到工程配置界面。
1、配置工程的名称
2、工程存储路径
3、IDE选择(如果是keil工具,选择MDK-ARM)
4、mcu依赖的cube包在哪个目录
在这里插入图片描述

接着到“Code Generator”下选择这几个选项来生成工程:

在这里插入图片描述

选择好过后我们就可以点击右上角的"GENERATE CODE"按键来生成代码了。
如果提示你的firmware package 缺少直接更新下载即可,如果没网状态,就需要去官网下载依赖包放在之前提到的目录下即可。

我是用一下依赖包生成得工程代码。
在这里插入图片描述

3.编译工程

点击编译按钮对工程进行编译。
在这里插入图片描述
在 CubeMX 生成的文件中添加用户代码的时候,必须是写在/* USER CODE BEGIN n*/和/* USER CODE
END n*/之间。这样如果需要改变 Cube 工程的配置,在重新生成代码时,在这两句注释之间的语 句不会被覆盖。而用户新建或添加的文件不会受到影响。

4.添加功能代码

我们这里工程就基本建好了,现在来实现功能代码部分。
我这里是通过发送串口消息来验证按键中断是否触发。要注意的是,我们按下一次按键,可能会发送多条信息,原因是按键存在抖动,我们还需要进行按键消抖。

我们要添加函数功能到回调函数内,那么怎么去找这个回调函数了?
1、我们可以打开对应的头文件,这里是stm32f0xx_hal_gpio.h,找到以callback结尾的函数(HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);)
STM32CubeMX学习三 之外部中断_第9张图片

通过点击右键,然后点击“go to Definition…”就可以定位到函数实现的地方:
STM32CubeMX学习三 之外部中断_第10张图片
这里我们看到这个函数是被 __weak修饰的函数,所以这个函数如果我们要使用的话直接把函数复制出来在用户端直接重写就行了。
在CubeMX生成的程序框架中,GPIO外部中断共用一个回调函数接口。要想知道是哪个中断源,就判断其输入参数GPIO_Pin。

在gpio.c中添加以下代码就可以识别对应的GPIO中断了。

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin & GPIO_PIN_0)
	{
		//功能实现
	}
	if(GPIO_Pin & GPIO_PIN_1)
	{
		//功能实现
	}
	if(GPIO_Pin & GPIO_PIN_2)
	{
		//功能实现
	}
}

STM32CubeMX学习三 之外部中断_第11张图片

创作不易,请大佬们点个赞!
有问题请留言讨论!

你可能感兴趣的:(STM32CubeMX,stm32,单片机,学习,嵌入式硬件,mcu)