STM32CubeMX学习系列:外部中断

文章目录

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

  • 前言

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


    一、本地环境

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

    二、开始

    1.外部中断配置

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

    选中“Pinout&Configuration”选项,点击左边的System Core选项,选中GPIO。

    在 Pinout 界面配置 GPIO,这里我们设置PA0 、 PA1 、PA2为外部功能。

    设置完成后可以看到引脚变绿了,切右键点击可以设置引脚的label名称,生成工程的时候该引脚就会命名为你设置的label名。

    设置好过后我们会在中间看到gpio的初始配置,点击引脚,接下来我们根据自己的需求给GPIO配置成我们想要的模式。

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

    配置后如图:

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

    以上六种中断触发模式都是我们可以设置的,大概意思就是这个GPIO在变高电平或者低电平的时候会触发中断,然后完成中断回调里面的功能函数。

    NVIC中断使能配置:

    2.时钟配置

    配置完GPIO后开始配置时钟,这里讲的是没有外部时钟,用的是内部时钟,默认14Mhz的内部时钟。

    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);)

    通过点击右键,然后点击“go to Definition…”就可以定位到函数实现的地方:

    这里我们看到这个函数是被 __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)
    	{
    		//功能实现
    	}
    }
    

    创作不易,请大佬们点个赞!

    有问题请留言讨论!

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32CubeMX学习系列:外部中断

    发表评论