野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11206|回复: 2

关于中断分组的问题

[复制链接]
发表于 2020-1-22 20:55:16 | 显示全部楼层 |阅读模式
**
  ******************************************************************************
  * @file    bsp_exti.c
  * @author  fire
  * @version V1.0
  * @date    2013-xx-xx
  * @brief   I/O线中断应用bsp
  ******************************************************************************
  * @attention
  *
  * 实验平台:野火 F103-霸道 STM32 开发板
  * 论坛    :http://www.firebbs.cn
  * 淘宝    :https://fire-stm32.taobao.com
  *
  ******************************************************************************
  */

#include "bsp_exti.h"

/**
  * @brief  配置嵌套向量中断控制器NVIC
  * @param  无
  * @retval 无
  */
static void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;

  /* 配置NVIC为优先级组1 */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

  /* 配置中断源:按键1 */
  NVIC_InitStructure.NVIC_IRQChannel = KEY1_INT_EXTI_IRQ;
  /* 配置抢占优先级 */
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  /* 配置子优先级 */
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  /* 使能中断通道 */
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  /* 配置中断源:按键2,其他使用上面相关配置 */  
  NVIC_InitStructure.NVIC_IRQChannel = KEY2_INT_EXTI_IRQ;
  NVIC_Init(&NVIC_InitStructure);
}

/**
  * @brief  配置 IO为EXTI中断口,并设置中断优先级
  * @param  无
  * @retval 无
  */
void EXTI_Key_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        EXTI_InitTypeDef EXTI_InitStructure;

        /*开启按键GPIO口的时钟*/
        RCC_APB2PeriphClockCmd(KEY1_INT_GPIO_CLK,ENABLE);
                                                                                               
        /* 配置 NVIC 中断*/
        NVIC_Configuration();
       
/*--------------------------KEY1配置-----------------------------*/
        /* 选择按键用到的GPIO */       
  GPIO_InitStructure.GPIO_Pin = KEY1_INT_GPIO_PIN;
  /* 配置为浮空输入 */       
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(KEY1_INT_GPIO_PORT, &GPIO_InitStructure);

        /* 选择EXTI的信号源 */
  GPIO_EXTILineConfig(KEY1_INT_EXTI_PORTSOURCE, KEY1_INT_EXTI_PINSOURCE);
  EXTI_InitStructure.EXTI_Line = KEY1_INT_EXTI_LINE;
       
        /* EXTI为中断模式 */
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
        /* 上升沿中断 */
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  /* 使能中断 */       
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);
       
  /*--------------------------KEY2配置-----------------------------*/
        /* 选择按键用到的GPIO */       
  GPIO_InitStructure.GPIO_Pin = KEY2_INT_GPIO_PIN;
  /* 配置为浮空输入 */       
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(KEY2_INT_GPIO_PORT, &GPIO_InitStructure);

        /* 选择EXTI的信号源 */
  GPIO_EXTILineConfig(KEY2_INT_EXTI_PORTSOURCE, KEY2_INT_EXTI_PINSOURCE);
  EXTI_InitStructure.EXTI_Line = KEY2_INT_EXTI_LINE;
       
        /* EXTI为中断模式 */
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
        /* 下降沿中断 */
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  /* 使能中断 */       
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);
}
/*********************************************END OF FILE**********************/
火哥学习了中断我有几个问题,第一个就是这句话设置中断组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);这句话是针对所有中断源吧,比如说分组为1,那么比如定时器中断,串口中断设置主优先级从优先级就可以了,第二个就是这个中断优先级分组感觉不知道怎么用,因为我觉得两个中断不可能同时发生啊,这个优先级就是为了在中断同事发生的时候看谁先响应,但是我实在无法想出来两个中断能够同时发生的情况,因为程序的时间都是ns级别,不可能精确到同事发生,两个按钮不可能同时被检测到被按下,定时器和串口中断也不会同时发生,我有点不能理解,请火哥帮我解释一下这个中断优先级究竟是怎么用的



回复

使用道具 举报

发表于 2020-1-28 21:11:54 | 显示全部楼层
4组中断优先级组来区别表格中的  4个组情况下的 抢占优先级多少位、响应优先级多少位      

可以想为   几 号中断优先级组 即 表示为  抢占优先级含用 几 个位来表示  那0组就是0位(0个)抢占级  响应级用全部4个位(16个)   4组就是4位(16个)抢占级  剩下0位(0个)给响应级   0个就是没有用

工程里面到底用哪组没有绝对,看计划,要么就用0或4组都行

回复 支持 反对

使用道具 举报

发表于 2020-1-29 19:42:29 | 显示全部楼层
问题一:你的想法是正确的
问题二:
首先,不要想当然的说ns级就不会同时发生
其次,从你发的例程来看,两个按键的中断是同一优先级
最后,低优先级的中断是会被高优先级的中断打断的。
假设你需要用串口接收数据(非常重要的数据),假设整个串口中断服务函数执行需要100ns。就在这100ns执行的过程中,你按下了了按键,产生了按键中断:如果按键中断的优先级较高,就会打断串口的数据接收,有可能你即受到的数据是错误的;如果按键中断的优先级较低,就不会打断重要数据的接收。优先级的存在就是为了保证重要的事情被更优先的执行
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-4-25 09:20 , Processed in 0.036508 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表