STM32CubeMX 实战教程:外部中断实验(LL 库)

1.资源的获取:关注博主并点赞对应博客,并在文章下留言邮箱索取;
2.资源的类型:获取资源仅限于免费公开文章或粉丝免费专享文章,不包括付费文章;

博主分享不易,请给三连哦(关注 + 点赞 + 收藏),你的鼓励是博主分享的动力。

1 前言

1.1 STM32CubeMX

2.1_1.STM32CubeMX_20200803

点击图片进入 ST 官网 STM32CubeMX 介绍页面

1.2 教程介绍

    STM32CubeMX 实战教程 基于正点原子 STM32F1 精英板(STM32F103ZET6)平台,旨在通过对板载资源的使用将各种外设的配置方法讲述清楚。更多教程请订阅 [专栏]STM32CubeMX
    本教程是 STM32CubeMX 实战教程中的第四篇,主要通过外部中断实验,将 STM32CubeMX EXTI & NVIC 的配置方法讲述清楚。

1.3 准备工作

    系统版本:Windows 10 专业版 64 位
    软件版本:STM32CubeMX V6.0.0 ( STM32CubeMX 下载及安装教程
    硬件平台:正点原子 STM32F1 精英板
    编译环境:MDK_ARM V5.29 ( MDK_ARM 下载及安装教程
    调试工具:ST-LINK/V2

1.4 硬件资源

    本节教程使用的硬件资源分配:

序号引脚引脚功能硬件连接备注
01PA0EXTI Line 0轻触按键(KEY_UP)上升/下降沿触发
02PE3EXTI Line 3轻触按键(KEY1)上升/下降沿触发
03PE4EXTI Line 4轻触按键(KEY0)上升/下降沿触发
04PB5OutputLED 灯(DS0)低电平亮
05PB8Output蜂鸣器(BEEP)高电平响
06PE5OutputLED 灯(DS1)低电平亮

2 配置项目

2.1 项目导入

    将上一节的 USART_Test 的项目另存作为 EXTI_Test 的项目初始模板。
    工程模板修改及项目导入,请参考:STM32CubeMX 实战教程:LED 灯、蜂鸣器、按键输入实验。这里就不重复了,项目目录如下:
2.1_1

2.2 EXTI & NVIC 配置

  1. PA0PE3PE4 配置成 GPIO_EXTI 模式;
    2.2_1
  2. 点击 GPIO,配置 PA0 下拉,PE3PE4 上拉;三个引脚全部配置成 上升/下降沿触发 模式;
    2.2_2
  3. 点击 NVIC,使能 EXTI Linex(x = 0,3,4) 中断,优先级设置为 6,0;
    2.2_3
  4. 点击 Code generation,勾选 Select for init sequence ordering 生成独立的中断使能回调函数,勾选 Generate IRQ handler 生成中断服务函数,勾选 Call HAL handler 生成清除标志位代码(HAL 库同时会生成回调函数);
    (关于 Code generation 窗口具体介绍,请参考:附录2 NVIC Code generation 配置窗口介绍
    2.2_4

2.3 Clock 配置

    Clock 不需要配置,可直接继续使用。可参考:STM32CubeMX 实战教程:新建项目和生成 MDK_ARM 工程STM32CubeMX 实战教程:SysTick 实验
2.3_1

2.4 生成代码

    项目管理配置及生成代码请参考:STM32CubeMX 实战教程:新建项目和生成 MDK_ARM 工程STM32CubeMX 项目配置窗口介绍(一)STM32CubeMX 项目配置窗口介绍(二)
    点击 GENERATE CODE 生成代码。
2.4_1

3 代码测试

  1. 打开 MDK_ARM 工程;
    3_1
  2. 查看 MX_GPIO_Init()MX_NVIC_Init() 函数源码;
    3_2
    3_3
    3_4
  3. gpio.c 文件用户代码区域加入中断回调函数及中断处理代码;(请自行在 gpio.h 文件中声明相关函数并在 main.h 文件中添加 gpio.h 头文件)
    3_5
    EXTI_IRQ() 函数源码:
/**
  * @brief  GPIO EXTI Callback.
  * @param  ExtiLine This parameter can be a combination of the following values:
  *         @arg @ref LL_EXTI_LINE_0
  *         @arg @ref LL_EXTI_LINE_3
  *         @arg @ref LL_EXTI_LINE_4
  * @retval None
  */
void EXTI_IRQ(uint32_t ExtiLine)
{
  switch(ExtiLine)
  {
    case LL_EXTI_LINE_0:
      if(LL_GPIO_IsInputPinSet(KEY_UP_GPIO_Port, KEY_UP_Pin) == 1 ) // KEY_UP Press
      {
        LL_GPIO_SetOutputPin(BEEP_GPIO_Port, BEEP_Pin);             // BEEP ON
      }
      else
      {
        LL_GPIO_ResetOutputPin(BEEP_GPIO_Port, BEEP_Pin);           // BEEP OFF
      }
      break;
      
    case LL_EXTI_LINE_3:
      if(LL_GPIO_IsInputPinSet(KEY1_GPIO_Port, KEY1_Pin) == 1 )     // KEY1 UnPress
      {
        LL_GPIO_SetOutputPin(DS1_GPIO_Port, DS1_Pin);               // DS1 OFF
      }
      else
      {
        LL_GPIO_ResetOutputPin(DS1_GPIO_Port, DS1_Pin);             // DS1 ON
      }
      break;
      
    case LL_EXTI_LINE_4:
      if(LL_GPIO_IsInputPinSet(KEY0_GPIO_Port, KEY0_Pin) == 1 )     // KEY0 UnPress
      {
        LL_GPIO_SetOutputPin(DS0_GPIO_Port, DS0_Pin);               // DS0 OFF
      }
      else
      {
        LL_GPIO_ResetOutputPin(DS0_GPIO_Port, DS0_Pin);             // DS0 ON
      }
      break;
  }
}
  1. stm32f1xx_it.c 文件 EXTIx_IRQHandler()(x = 0,3,4) 函数的用户代码区域调用中断处理函数 EXTI_IRQ()
    3_6
    3_7
  2. main 函数中加入 LED 和 蜂鸣器 电平初始化代码;
    3_8
        由于生成的代码 MX_GPIO_Init() 函数中,设置初始输出引脚的电平代码在引脚的初始化代码前面,这会导致设置电平的代码失效,需要自行在初始化后重新设置一下引脚电平。
        STM32CubeMX 实战教程:LED 灯、蜂鸣器、按键输入实验 中,由于 while 中有实时检测和设置输出电平代码,不会影响测试效果。
        本实验中,由于开启外部中断时,没有电平跳变,中断不会被触发,即引脚电平不会被配置;而输出引脚初始化后(不上拉和不下拉输出),默认输出低电平,这就会导致程序启动后,蜂鸣器不响,两个 LED 灯亮。

main 函数代码如下:

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */

  LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_AFIO);
  LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_PWR);

  NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);

  /* System interrupt init*/

  /** NONJTRST: Full SWJ (JTAG-DP + SW-DP) but without NJTRST
  */
  LL_GPIO_AF_Remap_SWJ_NONJTRST();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */
  SysTick->CTRL  = SysTick_CTRL_ENABLE_Msk |  // SysTick Timer clock source = HCLK_DIV8 (HCLK/8 = 9MHz)
                   SysTick_CTRL_TICKINT_Msk;  // SysTick Timer ENABLE | SysTick Timer Interrupt ENABLE
  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();

  /* Initialize interrupts */
  MX_NVIC_Init();
  /* USER CODE BEGIN 2 */
  LL_RCC_GetSystemClocksFreq(&get_rcc_clock);

  LL_GPIO_SetOutputPin(DS1_GPIO_Port, DS1_Pin);
  LL_GPIO_SetOutputPin(DS0_GPIO_Port, DS0_Pin);
  LL_GPIO_ResetOutputPin(BEEP_GPIO_Port, BEEP_Pin);

  LL_USART_EnableIT_RXNE(USART1);  // ENABLE USART1 RXNE Interrupt
  LL_USART_EnableIT_IDLE(USART1);  // ENABLE USART1 IDLE Interrupt
	
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}
  1. 编译工程;
    3_9
  2. 使用 ST-LINK/V2 下载程序,按下复位按键,若按照下面操作看到正常现象,则说明程序正常运行,外部中断配置成功。
Steps操作正常现象备注
1按下 KEY_UP 按键,不放蜂鸣器响松开按键默认不响
2按下 KEY0 按键,不放DS0 LED 亮松开按键默认不亮
3按下 KEY1 按键,不放DS1 LED 亮松开按键默认不亮

4 结束

    本教程由 Brendon Tan 原创发布,版权所有。该文档仅供个人学习交流使用,不得用于其他用途, 禁止商用, 转载或公开使用请联系作者授权。
    此教程由本人独立整理,如有不当之处,欢迎指正。

附录

附录1 相关教程

    STM32Cube 系列软件教程总目录请参考文章:STM32Cube 生态系统之网站、视频、文档及教程汇总
    该文章还提供:

  • STM32Cube 生态系统相关文章
  • STM32Cube 生态系统相关软件更新介绍
  • STM32Cube 生态系统相关教程汇总
  • STM32Cube 生态系统相关网站汇总
  • 该文章会不定期修改更新,更多信息请进入文章查看

附录2 NVIC Code generation 配置窗口介绍

    NVIC Code generation 相关配置对比及代码生成效果对比,见下图。
0.2_1

图1 NVIC Code generation > Call HAL handler 配置对比

0.2_2

图2 NVIC Code generation > Call HAL handler 代码效果对比

0.2_3

图3 NVIC Code generation > Select for init sequence ordering 配置对比

0.2_4

图4.1 NVIC Code generation > Select for init sequence ordering 代码效果对比

0.2_5

图4.2 NVIC Code generation > Select for init sequence ordering 代码效果对比
  • 8
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值