首页 > 其他分享 >最详细STM32,cubeMX外部中断

最详细STM32,cubeMX外部中断

时间:2023-10-21 22:05:23浏览次数:39  
标签:优先级 HAL 引脚 中断 STM32 cubeMX GPIO

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

@TOC


前言

  • 实验开发板: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个步骤,我再来讲解一下。

最详细STM32,cubeMX外部中断_优先级

  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 配置。

最详细STM32,cubeMX外部中断_外部中断_02

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

四、代码实现。

当触发中断时,会调用 中断回调函数来进行处理。 所以我们可以在 中断回调函数 中实现想要的功能即可。

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

注意: 我们在工程中编写代码时,尽量在 类似 BEGIN 0END 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 ,手动写一个外部中断的程序。

标签:优先级,HAL,引脚,中断,STM32,cubeMX,GPIO
From: https://blog.51cto.com/u_16159289/7969652

相关文章

  • esp32笔记[8]-rust的定时器中断点灯
    摘要使用rust开发esp32c3实现定时器中断点亮led灯.超链接esp32笔记[7]-使用rust+zig开发入门平台信息esp32c3rustMutex锁usecore::cell::RefCell;usecritical_section::Mutex;//no-std库专用的Mutex我们首先注意到的是静态变量BUTTON。我们需要它,因为在中断处理程......
  • 嵌入式(MCU)STM32L496QEI6/STM32L496QGI3基于ARM®Cortex®-M4内核
    一、简介STM32L432位MCU+FPU是超低功耗微控制器,基于高性能的ARM®Cortex®-M432位RISC内核,工作频率高达80MHz。Cortex-M4内核具有单浮点单元(SFPU)精度,支持所有ARM单精度数据处理指令与数据类型。同时执行全套DSP指令和存储保护单元(MPU),增强应用安全性。明佳达供求嵌入式(MC......
  • 3、中断服务
    中断服务历程中断处理是计算机系统中的一种重要机制,用于处理异步事件或请求,如硬件中断、软件异常等。中断处理的基本原理是通过一个中断向量表来确定中断源,并执行相应的中断处理程序。在操作系统层面,这通常是通过中断服务例程(ISR)来实现的。基本原理如下:中断源:计算机系统中的......
  • 2. STM32 HAL库结构的初步分析
    1.以串口为例,添加串口的HAL库源码我们使用的是异步通信的方式,因此将stm32f1xx_hal_uart.c添加进来。在本次学习中,串口我们使用3种方式去学习,轮询、中断、DMA方式。因此,我们也将DMA的HAL库源码添加进来。 ......
  • ardunio-stm32采集风速传感器
                波特率都是4800设备地址默认01广播FF #definemySerialSerial2byteMsg_getdata[8]={0x01,0x03,0x00,0x00,0x00,0x02,0xC4,0x0B};charRecData[9]={0};//==============校验==============uint16_tmodbus_crc16(char......
  • STM32 EEPROM_Emulation 保存数据使用注意事项
    1目的:stm32官方提供flash模拟eeprom的代码例子,为了能给产品添加数据保存功能,可以改造该例子迅速完成数据保存的功能。示例代码路径:C:\Users\rd-yhzhang\STM32Cube\Repository\STM32Cube_FW_F1_V1.8.5\Projects\STM32F103RB-Nucleo\Applications\EEPROM\EEPROM_Emulation。2......
  • STM32单片机实现Bootloader跳转的关键步骤(转载)
    STM32单片机实现Bootloader跳转的关键步骤-知乎(zhihu.com)STM32单片机实现Bootloader跳转的关键步骤(qq.com)现在越来越多的嵌入式设备支持远程自动升级,不需要再借助下载器。这样对于设备的维护非常方便。当然若使设备支持远程升级,需要编写支持升级的程序代码,可以称之为B......
  • linux 内核 --- 关抢占/关中断,临界区
     preempt_disable()local_irq_disable()/local_irq_save(flags)spin_lock()spin_lock_irq()/spin_lock_irqsave(lock,flags)spin_lock()会调用preempt_disable()导致本核的抢占调度被关闭(preempt_disable函数实际增加preempt_count来达到此效果),spin_lock_irq()是local_i......
  • STM32 ADC基础知识讲解
    (文章目录)前言在正式的学习如何编写ADC代码时我们先来学习一下ADC的基础知识部分,只有掌握好了这些基础知识才能顺利的进行后面的代码编写。一、ADC的基本介绍ADC指的是模数转换器(Analog-to-DigitalConverter),它是一种用于将模拟信号转换为数字信号的电子设备或电路。模拟信......
  • STM32——GPIO输出
    一、结构二、8种模式三、对推挽输出、开漏输出的理解1、推挽输出:推:将电流推出去    挽:将电流挽回来 上图的前两种情况组合,就是推挽输出模式。情况1时即“推”,情况2时即“挽”。2、开漏输出:漏:漏极啥也没接。情况2与3组合构成开漏模式。(常配一个外接上拉电阻)......