stm32中断的基础知识

这篇具有很好参考价值的文章主要介绍了stm32中断的基础知识。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

中断

某些事件可能需要CPU暂停目前的程序优先处理

实现CPU暂停当前的程序并优先处理某一事件的机制称作中断

处理这一事件的程序叫做中断服务程序(Interrupt Handler)

中断的硬件实现

内部或外部信号产生中断

—>程序跳转到某一特定地址(中断向量)

//不同的中断可能会对应同一地址,此后在程序中需要进行判定

—>程序从中断向量跳转到对应的中断服务程序

//此时会将原来正在使用的重要数据压入堆栈(某一特定的内存空间)

—>执行完毕后返回原来被打断的位置

//堆栈中的数据被还原,保证原来的程序正常执行

stm32的外部中断

  • 外部中断可由GPIO输入上升沿(0->1跳变)和/或下降沿(1->0跳变)触发
  • 最多16个外部中断
    • 每组GPIO相同编号的pin共享一个外部中断
    • 每个GPIO都可以被配置为外部中断

HAL库的中断实现

首先Cube会生成一个stm32xx_it.c(即中断服务程序入口,中断向量处跳转指向的地址)

HAL库会预先处理中断,判断中断类型

//在中断服务程序入口处,HAL库会调用自己的一个函数
//在判定完中断类型后会调用对应的回调函数(即Callback)
//Callback用_week定义,可以被用户改写

外部中断的回调函数

void HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin)

stm32中断的基础知识

可以在任意程序文件中重新定义这个函数

外部中断产生时,HAL库处理完中断会调用这个函数

//传入参数是具体产生中断的引脚,需要使用GPIO_Pin宏定义判定
//若需判定中断由上升沿还是下降沿产生,可以读取当前GPIO电平

使用外部中断检测按键(示例)

设置Cube外设

打开Cube,把基本外设以及时钟树设置完后

把PA0设置为GPIO_EXTI0,因为这是 A组GPIO 的第 0 号引脚所以其所属的中断向量为 EXTI0

在旁边外设设置中的NVIC中的EXTI line0 interrupt勾上,这样才会产生中断

在GPIO选项中PA0引脚被激活后可以在GPIO mode中选择上升沿触发还是下降沿触发

这次改成由上升沿和下降沿触发

中断的代码理解

用keil5打开代码后打开stm32f4xx_it.c文件,

里面有Cube自动生成的void xxFault_Handler(void)函数,

这些函数代表芯片出错后会进入这些中断,

这些函数里面都有一个while(1)循环,这样在出错后可以直接把程序卡死停止执行

在文件最下面有 EXTI0_IRQHandler

void EXTI0_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI0_IRQn 0 */

  /* USER CODE END EXTI0_IRQn 0 */
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
  /* USER CODE BEGIN EXTI0_IRQn 1 */

  /* USER CODE END EXTI0_IRQn 1 */
}

在产生外部中断后,程序就会跳转到这个地方

其中有一个hal库函数

 HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);

在stm32f4xx_hal_gpio.c中可以找到这个函数

void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
  /* EXTI line interrupt detected */
  if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET)
  {
    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
    HAL_GPIO_EXTI_Callback(GPIO_Pin);
  }
}

这个函数就代表如果它读到低电平,即按键按下后产生中断

__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);

这个函数会把中断的标志物清除

HAL_GPIO_EXTI_Callback(GPIO_Pin);

接着就会调用回调函数

在后面会有一个__weak函数

__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(GPIO_Pin);
  /* NOTE: This function Should not be modified, when the callback is needed,
           the HAL_GPIO_EXTI_Callback could be implemented in the user file
   */
}

即该回调函数可以被再次声明,即会覆盖掉自动生成的函数

在中断回调函数中编写在此次中断中需要执行的功能即可。

代码编写

在main.c

在/* USER CODE BEGIN 4 */

/* USER CODE END 4 */中写入我们重定义的函数

即我们可以在这里添加我们的中断回调函数

/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
		if(GPIO_Pin==GPIO_PIN_0)//判断是否为外部中断0的回调
			{
				if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_SET)
					{
						HAL_GPIO_WritePin(GPIOH,GPIO_PIN_12,GPIO_PIN_RESET);	
					}
				else if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET)
					{
						HAL_GPIO_WritePin(GPIOH,GPIO_PIN_12,GPIO_PIN_SET);
					}	//移植的电灯代码
			}
};
/* USER CODE END 4 */

然后就可以进行编译烧录。

参考资料

CH1.3 GPIO 第3讲 中断与EXTI【南工骁鹰嵌入式软件培训】文章来源地址https://www.toymoban.com/news/detail-423984.html

到了这里,关于stm32中断的基础知识的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【STM32】基础知识 第二课 初识 STM32

    ARM 公司: 只做内核设计和 IP 授权, 不参与芯片设计. 对比项 Cortex-A (Application) Cortex-R (Real-time) Cortex-M (Microcontroller) 特点 高时钟频率, 长流水线, 高性能 较高时钟频率, 较长的流水线, 实时性强 时钟频率较低, 通常较短的流水线, 超低功耗 应用场景 移动计算, 智能手机, 平板电脑

    2024年02月02日
    浏览(32)
  • 【STM32】基础知识 第五课 C 语言基础知识

    stdint.h 是从 C99 中引进的一个标准 C 库的文件. 路径: “D:MDK5.34ARMARMCCinclude” 运算符 含义 运算符 含义 按位与 ~ 按位取反 | 按位或 左移 ^ 按位异或 右移 按位与: num1 运算符 num2 结果 0 0 0 1 0 0 0 1 0 1 1 1 按位或: num1 运算符 num2 结果 0 | 0 0 1 | 0 1 0 | 1 1 1 | 1 1 按位异或: num1 运算符

    2024年02月13日
    浏览(57)
  • STM32 串口基础知识学习

    串行通信:数据逐位按顺序依次传输。 并行通信:数据各位通过多条线同时传输。 对比 传输速率:串行通信较低,并行通信较高。 抗干扰能力:串行通信较强,并行通信较弱。 通信距离:串行通信较长,并行通信较短。 IO资源占用:串行通信较少,并行通信较多。 成本:

    2024年02月15日
    浏览(37)
  • STM32 ADC基础知识讲解

    在正式的学习如何编写ADC代码时我们先来学习一下ADC的基础知识部分,只有掌握好了这些基础知识才能顺利的进行后面的代码编写。 ADC 指的是模数转换器(Analog-to-Digital Converter),它是一种用于将模拟信号转换为数字信号的电子设备或电路。 模拟信号是连续变化的信号,可

    2024年02月09日
    浏览(31)
  • STM32 基础知识入门 (C语言基础巩固)

    1、在不改变其他位的值的状况下,对某几个位进行设值 这个场景在单片机开发中经常使用,方法就是先对需要设置的位用操作符进行清零操作, 然后用|操作符设值。 比如我要改变 GPIOA 的 CRL 寄存器 bit6(第 6 位)的值为 1,可以先对寄 存器的值进行清零操作:  然后再与需

    2024年02月01日
    浏览(39)
  • 【STM32】基础知识 第六课 内核 & 架构

    4 个主动单元 + 4 个被动单元 主动单元 被动单元 Cortex M3 内核 DCode 总线 (D-Bus) 内部 FLASH Cortex M3 内核系统总线 (S-Bus) 内部 SRAM 通用 DMA1 FSMC 通用 DMA2 AHB 到 APB 的桥, 它连接的所有 APB 外设 AHB (Advance High-performance Bus): 高级高性能总线 APB (Advance Peripheral Bus): 高级外围总线 ICode 总线

    2023年04月24日
    浏览(53)
  • 【STM32】基础知识 第十课 CubeMx

    CubeMX (全称 STM32CubeMX) 是 ST 公司推出的一款用于 STM32 微控制器配置的图形化工具. 它能帮助开发者通过直观的图像界面快速完成 STM32 微控制器的硬件配置, 外设初始化以及中间件设置等工作. 通过 CubeMX, 开发者可以大幅提高开发效率, 降低开发难度, 尤其是对于刚接触 STM32 的新

    2024年02月05日
    浏览(39)
  • STM32-OTA升级-基于STM32CubeMX+STM32F103(一)基础知识

    0 引言 对于一个项目而言,往往将远程升级作为程序的最后一步(基本所有功能都开发完成之后再考虑)。但是在我看来,我们在写单片机的程序之前,就要规划好FLASH的使用情况,因为code、全局变量等重要信息都是放在FLASH(常说的闪存)中的,SRAM是程序运行时的存放位置

    2024年02月04日
    浏览(42)
  • 【STM32标准库】【基础知识】程序烧录

    文章基于适用于STM32F4系列,作者使用STM32F401CCU6开发板。 本文章基于此系列和开发板展开讨论。 我使用的开发板是某宝购买的,型号是STM32F401CCU6 请点这里 烧录器为同家店铺制作的STLINK-V2 请点这里 开发板外观 烧录器外观 请去官网下载,传送门 全部默认安装即可,注意选择

    2024年02月09日
    浏览(78)
  • 嵌入式学习stm32基础知识(期末复习)

    1. 计算机的体系架构 冯诺依曼架构 ​ 在完整的计算机系统中,包含五个部分,储存器,运算器,控制器输入设备和输出设备。 改进的冯诺依曼架构 改进型架构的各模块的高速数据交换中心利用储存器这个大容量,极大的提高了效率。 哈佛架构 ​ 哈佛结构数据空间和地址

    2024年02月07日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包