最详细STM32,cubeMX外部中断

慈云数据 2024-05-14 技术支持 35 0

这篇文章将详细介绍 cubeMX外部中断的配置,实现过程。

文章目录

  • 前言
  • 一、外部中断的基础知识。
  • 二、cubeMX 配置外部中断
  • 三、自动生成的代码解析
  • 四、代码实现。
  • 总结

    前言

    • 实验开发板:STM32F103C8T6。
    • 所需软件:keil5 , cubeMX 。
    • 实验目的:外部中断的意义,cubeMX配置和实现 等 。

      一、外部中断的基础知识。

      对于外部中断的基础知识,可以参考我之前的文章:STM32 EXTI外部中断

      二、cubeMX 配置外部中断

      1. 选择芯片

        在这里插入图片描述

      2. 配置仿真。(如果不配置,程序将无法下载到板子上)

        在这里插入图片描述

      3. 配置系统时钟,选择 HSE , 高速时钟。

        在这里插入图片描述

      4. 设置时钟树,这里直接填写最大频率 72MHZ,然后 enter 双击即可。(系统自动生成相应时钟)

        在这里插入图片描述

      5. 设置工程的名字,路径,以及工具链。

        在这里插入图片描述

      6. 设置自动生成 .c/.h 文件

        在这里插入图片描述

      7. 选择引脚设置成中断模式。(PA0 接的是按键)

        在这里插入图片描述

      8. 设置上升/下降/双边沿触发,选择是否上拉/下拉 电阻。

        (上拉/下拉 根据具体电路图确定。当电平发生变化时,触发中断,会调用中断回调函数。)

        在这里插入图片描述

      9. 使能中断。在这里插入图片描述
      10. 生成工程。

        在这里插入图片描述

      三、自动生成的代码解析

      看过我之前文章的应该一眼就能看懂 cubeMX 自动生成的代码。5个步骤,我再来讲解一下。

      在这里插入图片描述

      1. 首先定义一个 GPIO_InitTypeDef 的结构体对象

        可以看到该结构包含了 引脚,工作模式,是否 上拉/下拉 电阻,速度 。通过这个结构体就可以对各个外设进行初始化设置。

        在这里插入图片描述

      2. 第二步 是使能 gpio 端口

        根据外设的GPIO端口来分别使能。(这里按键对应的是 PA0 , 所以使能 GPIOA )

      __HAL_RCC_GPIOA_CLK_ENABLE();
      
      1. 配置引脚。

        就是对我们第一步 创建的结构体进行初始化。

        分别 配置引脚端口号 GPIO_PIN_0 , 设置上升沿触发中断 , 下拉电阻。最后调用 HAL_GPIO_Init( ) 函数初始化 GPIO 。

        GPIO_InitStruct.Pin = GPIO_PIN_0;
        GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
        GPIO_InitStruct.Pull = GPIO_PULLDOWN;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
      
      1. 设置 优先级。

        优先级分为:抢占优先级,子优先级。都是 值越小,优先级越大。即 为0 时,优先级最大。

      HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);
      

      也可以通过 cubeMX 配置。

      在这里插入图片描述

      1. 使能中断。
      HAL_NVIC_EnableIRQ(EXTI0_IRQn);
      

      四、代码实现。

      当触发中断时,会调用 中断回调函数来进行处理。

      所以我们可以在 中断回调函数 中实现想要的功能即可。

      /* 中断回调函数  */
      void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
      {
      }
      

      注意:

      我们在工程中编写代码时,尽量在 类似 BEGIN 0 和 END 0 之间写,这样当我们修改 cubeMX 中的配置,再次生成代码时,就不会将之前我们编写的代码清除。

      /* USER CODE BEGIN 0 */
      int count = 0;
      /*  每按下按键,触发一次中断,count 增加一次 */
      void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
      {
      	if(GPIO_Pin == GPIO_PIN_0)
      	{
      		count++;
      	}
      }
      /* USER CODE END 0 */
      

      这里的 函数参数是某个引脚,当相应引脚的按键按下时,即执行里面的函数。


      总结

      下一篇文章为大家介绍如何不使用 cubeMX ,手动写一个外部中断的程序。

微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon