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

STM32芯片EXIT外部中断的配置与原理以及模板代码(标准库)

 配置EXIT外部中断其实就是把GPIO刀NVIC的各个外设配置好

第一步:配置RCC,把我们涉及到的外设的时钟都打开

(此处EXTI是默认打开的,而NVIC是内核外设无需配置)

第二步:配置GPIO,选择端口为输入模式

第三步:配置AFIO,一共有16个引脚可以选择,每个引脚只能配一个GPIO端口

第四步:配置EXTI,选择边沿触发方式,比如上升沿,下降沿,双边沿,

选择触发响应方式(中断响应,事件响应)

中断响应:CPU处理

事件响应:对应某个外设处理,CPU正常工作

第五步:配置NVIC,给中断设置响应优先级和抢占优先级

响应优先级:当中断队列中有多个请求时,响应优先级高的(数字越小越高)将会优先执行

抢占优先级:当已有中断在运行时,此时再来一中断请求若其抢占优先级比正在运行的中断事件的抢占优先级高的话会在原中断事件上再嵌套一个中断事件

原理图:

 模板代码:

uint16_t Key_Count = 0;//中断计数位
void KeyIt_Init(void)//按键中断初始化函数
{
    GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO初始化传参结构体
    EXTI_InitTypeDef EXTI_InitStructure;//定义EXTI初始化传参结构体
    NVIC_InitTypeDef NVIC_InitStructure;//定义NVIC初始化传参结构体
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//打开GPIOA时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//打开AFIO时钟
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//设置为上拉输入模式
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;//选择1号引脚
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//设置IO口速度为50MHz
    GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化GPIO,传入结构体参数
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource1);
    //在AFIO里将1号引脚的中断线路分配给GPIOA端口
    EXTI_InitStructure.EXTI_Line = EXTI_Line1;
    //选择外部中断线路为1号线路(1号引脚对应的线路)
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能对应外部中断线路
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    //设置为中断模式(有中断模式和事件模式)
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//设置为低电平触发中断
    EXTI_Init(&EXTI_InitStructure);//初始化EXTI,传入结构体参数
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    //将优先级设置为分组2的配置,即抢占优先级为2位(0~3),响应优先级为2位(0~3),数字越小优                        
    先级越高
    NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;//选择为EXTI1通道
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能对应通道
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//设置抢占优先级为1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//设置响应优先级为1
    NVIC_Init(&NVIC_InitStructure);//初始化NVIC,传入结构体参数
}
uint16_t Key_Count_Get(void)//返回中断计数位函数
{
    return Key_Count;//返回中断计数位
}
void EXTI1_IRQHandler(void)//每个中断的中断处理函数都是固定的,在启动文件里找
{
    if (EXTI_GetITStatus(EXTI_Line1) == SET//如果该中断线路状态寄存器值为SET)
    {
        Key_Count++;//中断计数位自增
        EXTI_ClearITPendingBit(EXTI_Line1);//清除中断标志位
    }
}


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

相关文章:

  • 输出第二个整数
  • MySQL数据库-索引的介绍和使用
  • C# 中的属性:安全且灵活的数据访问
  • 图像增强夜视仪行业全面而深入的分析
  • .net6 使用 FreeSpire.XLS 实现 excel 转 pdf - docker 部署
  • 主要用于图像的颜色提取、替换以及区域修改
  • C语言-11-18笔记
  • 利用开源的低代码表单设计器FcDesigner高效管理和渲染复杂表单结构
  • 网络层8——IP多播
  • 论文复现_How Machine Learning Is Solving the Binary Function Similarity Problem
  • mapStruct详解
  • docker部署redis7
  • 说一说JS伪数组和数组的区别?
  • 云原生基础-云计算概览
  • 算法-二分查找2(代码笔记)
  • 在 Ubuntu 上配置防火墙以开放特定端口
  • 【Redis_Day5】String类型
  • Python Matplotlib 数据可视化全面解析:选择它的七大理由与入门简介
  • SQL面试题——交叉窗口计算
  • es执行_update_by_query要注意
  • Mac系统下配置 Tomcat 运行环境
  • 基于边缘计算技术的机器状态监测系统
  • 2024年11月17日Github流行趋势
  • 数据库视图-多表
  • 力扣题解(新增道路查询后的最短距离II)
  • 自适应安全框架(ASA)在网络安全2.0新防御体系中的应用