3.STM32基础_中断

  1. 中断
    1. 中断:暂停当前程序的运行,转而去处理更为要紧的程序,事后完好地恢复当前程序的运行,这个过程叫做中断。
    2. 中断的意义:
      1. 提高实时性
      2. 支持多任务处理
      3. 提高CPU利用率,降低功耗
  2. 中断控制器(NVIC)
    1. NVIC是ARM Cortex-M内核中的一个组件,用于管理中断和异常。
    2. NVIC作用是设置中断优先级分组,设置某个中断的中断优先级,使能或者失能某个中断
  3. 中断向量表
    1. 中断向量表是内存中的一个区域,包含了中断服务程序(ISR)的入口地址和中断优先级等。当中断发生时,处理器通过这个表跳转到相应的中断服务程序。
  4. 中断优先级
    1. 优先级
      1. 抢占优先级(pre):高抢占优先级可以打断正在执行的低抢占优先级中断
      2. 响应优先级(sub):当抢占优先级相同时,响应优先级高的先执行,但是不能相互打断
      3. 抢占优先级和响应优先级都相同的情况下,自然优先级(中断向量表内的优先级)越高的先执行;
      4. 优先级数字越小越高;
    2. 优先级分组
      1. 0 抢占0bit 响应4bit(2^4 = 16级)
      2. 1 抢占1bit 响应3bit
      3. 2 抢占2bit 响应2bit
      4. 3 抢占3bit 响应1bit
      5. 4 抢占4bit 响应0bit
  5. 中断服务函数
    1. 中断服务函数无参无返回值
    2. 所有中断源的中断服务函数都有定的弱定义,如果使用需要在程序中按照弱定义的函数名重新定义编写中断服务函数
    3. 中断服务函数应当尽量短小且保证可重入性
    4. 可重入:
      1. 可以被打断
      2. 可以被恢复
      3. 被恢复后完全从上次被打断处运行且数据不发生改变
    5. 可重入化处理:
      1. 尽量使用局部变量
      2. 如果一定要用,使用互斥信号量保护的全局变量
      3. 只使用可重入的系统调用
      4. 只使用可重入的其他函数
      5. 谨慎使用堆区内存
      6. 避免使用浮点运算
  6. 中断使用流程
    1. 在一个项目中进行一次中断优先级分组
    2. 在需要开启中断的函数中配置中断优先级
    3. 在需要开启中断的函数中使能对应中断
    4. 编写中断源对应的中断服务函数
  7. EXTI(外部中断)使用流程
    1. 工程中配置中断优先级分组
    2. 函数中配置中断优先级
    3. 函数中使能对应的EXIT中断
    4. 编写EXIT为中断源的中断服务函数
    5. 通过AFIO配置GPIO引脚与中断线之间的映射关系,使用GPIO_EXTILineConfig()函数配置GPIO为中断源。
    6. 配置EXTI线,包括触发方式(上升沿、下降沿或双边沿),使用EXTI_InitTypeDef结构体进行配置,并调用EXTI_Init()函数初始化。
    7. 例程:
// 初始化外部中断
void EXTI_Key_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    EXTI_InitTypeDef EXTI_InitStructure;
    
    // 开启按键GPIO口的时钟
    KEY1_INT_GPIO_CLK_ENABLE();
    
    // 选择按键1的引脚
    GPIO_InitStructure.Pin = KEY1_INT_GPIO_PIN;
    // 设置引脚为输入模式
    GPIO_InitStructure.Mode = GPIO_MODE_IT_RISING;
    // 设置引脚不上拉也不下拉
    GPIO_InitStructure.Pull = GPIO_NOPULL;
    // 使用上面的结构体初始化按键
    HAL_GPIO_Init(KEY1_INT_GPIO_PORT, &GPIO_InitStructure);
    
    // 配置 EXTI 中断源 到key1 引脚、配置中断优先级
    HAL_NVIC_SetPriority(KEY1_INT_EXTI_IRQ, 0, 0);
    // 使能中断
    HAL_NVIC_EnableIRQ(KEY1_INT_EXTI_IRQ);
}

// 中断服务函数
void EXTI1_IRQHandler(void)
{
    if(EXTI_GetITStatus(EXTI_Line1) != RESET)
    {
        // 执行中断服务函数 即具体要干什么
        // 例如:翻转LED状态
        LED_TOGGLE();
        
        // 清除中断标志位
        EXTI_ClearITPendingBit(EXTI_Line1);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值