当前位置: 首页 > article >正文

【嵌入式学习笔记】STM32中断配置及相关知识

中断

中断配置

1、使能GPIO

2、使能系统时钟

3、配置引脚

4、配置映射关系

5、配置EXTI

6、启用并设置EXTI


#include "stm32f4xx.h"                  // Device header
#include "sys.h"
#include "delay.h"
#include "led.h"
​
void init_exti(void)
{   
    EXTI_InitTypeDef   EXTI_InitStructure;
    GPIO_InitTypeDef   GPIO_InitStructure;
    NVIC_InitTypeDef   NVIC_InitStructure;
    
    /* Enable GPIOE clock */
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
    /* Enable SYSCFG clock */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
    
    /* Configure PE2 pin as input floating */ /* 配置PE2引脚为输入浮动 */
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // 输入模式
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ; // 上拉电阻
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_Init(GPIOE, &GPIO_InitStructure);
    
    /* Connect EXTI Line2 to PE2 pin */ /* 配置映射关系 */
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource2);
    
    /* Configure EXTI Line2 */
    /* 配置 EXTI Line2 */
    EXTI_InitStructure.EXTI_Line = EXTI_Line2;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // 中断模式
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // 下降沿触发
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);
​
    /* Enable and set EXTI Line2 Interrupt to the lowest priority */
    /* 启用并设置EXTI Line2 Interrupt为最低优先级 */
    NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
​
}
​
void EXTI2_IRQHandler(void) // 中断服务函数
{
  if(EXTI_GetITStatus(EXTI_Line2) != RESET)
  {
   
    PFout(9) ^= 1; // 异或赋值,
    /* Clear the EXTI line 0 pending bit */
    EXTI_ClearITPendingBit(EXTI_Line2); // 清除中断标志位
  }
}
​
int main()
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    init_exti();
    init_led(); 
    while(1)
    {   
    }
    
}
​
描述一下中断的执行流程
答:CPU正在执行当前程序,由于某个事件的发生产生了中断请求,导致CPU暂停当前程序执行,中断请求会经过中断通道到达NVIC,NVIC去调用专门的中断服务函数执行,执行完毕返回当前程序继续执行。

中断服务函数应该注意的四大点

答:
1.中断服务函数不能传入参数;
​
​
2.中断服务函数不能有返回值;
​
​
3.中断服务函数应做到短小精悍;
​
​
4.不要在中断函数中使用printf函数,会带来重入和性能问题
为什么要在中断服务函数中清除中断标志位?
如果进入中断不清除标志位,那么这一中断服务程序结束后由于标志位还是置位的并且中断是允许的,那么还会再次进入该中断,就会发生一直在执行中断程序的情况。
为什么中断服务函数不能自定义函数名?
硬件要求:ISR名称需与中断向量表中的条目匹配,确保中断能正确路由到相应的处理函数。
自动生成的代码:编译器和工具链可能自动生成ISR的名称和相关代码,自定义名称可能导致不匹配。
编译器规范:编译器和链接器有特定规则来识别ISR名称,使用不匹配的名称会引发错误。
标准化:统一的ISR名称有助于代码的可维护性和一致性。
关于中断的知识点
1、当CPU正在执行某个程序时,由计算机内部或外部的原因引起的紧急事件向CPU发出请求处理的信号,CPU在允许的情况下响应请求处理信号,暂时停止正在执行的程序,保护好断点处的现场,转向执行一个用于处理该紧急事件的程序,处理完后又返回被中止的程序断点处,继续执行原程序,这一过程就称为中断。
2、在Cortex-M3内核中集成了中断控制器和中断优先级控制寄存器,Cortex-M3内核支持256个中断,其中包含16个内核中断(也称为系统异常)和240个外部中断,并具有256级可编程的中断优先级设置。其中,除个别异常的优先级被固定外,其他优先级都是可编程的。
3、STM32有84个中断,包括16个Cortex-M3内核中断线和68个可屏蔽中断通道,具有16级可编程中断优先级的设置(仅使用中断优先级设置8位中的高4位)。
4、STM32内核有两个中断优先级,分别是抢占优先级和响应优先级(也称为子优先级),每个中断源都需要指定这两种中断优先级。具有高抢占优先级的中断,可以在具有低抢占优先级的中断处理过程中被响应,即中断嵌套。
5、 STM32外部中断编程主要涉及外部中断/事件管理库函数、嵌套向量中断控制器NVIC库函数以及中断服务函数等。
​

http://www.kler.cn/a/287788.html

相关文章:

  • 《生成式 AI》课程 第3講 CODE TASK 任务3:自定义任务的机器人
  • 小白进!QMK 键盘新手入门指南
  • 一文3000字从0到1带你进行Mock测试(建议收藏)
  • Shell基础2
  • 【从零开始的LeetCode-算法】3270. 求出数字答案
  • C语言之MakeFile
  • Go语言学习(一)
  • SpringBoot链路追踪②:如何集成?
  • Fabric.js中fabric.Text的深入解析
  • linux下部署数据库总结
  • Kubernetes中三种探针的作用你真的知道吗?
  • C语言操作符的介绍
  • 51单片机-独立按键控制LED显示二进制
  • GoF 代理模式
  • 安泰功率放大器的特点及原理是什么
  • MyBatis【缓存击穿,缓存雪崩,缓存穿透】
  • Microsoft Word使用公式字体Latin Modern Math时导出pdf显示异常
  • jmeter 响应乱码
  • 有手就会之使用Dify构建RAG聊天应用(基于私有知识库和搜索引擎)
  • iOS 模拟器打不开:unable to boot the simulator
  • 解决Java中Long类型的序列化与JDK8时间的序列化
  • 前后端分离项目实战-通用管理系统搭建(前端Vue3+ElementPlus,后端Springboot+Mysql+Redis)第七篇:菜单和路由动态绑定
  • Andorid 如何查看某个.so库的依赖
  • Win10桌面出现Removable Storage Devices文件夹无法删除
  • Psychology 心理学
  • yolov8代码记录---(tasks.py中的c1、c2和args) / (断点续训)