嵌入式--中断系统学习(中断系统+NVIC+SYSCFG+优先级配置+中断嵌套+中断架构)

一、嵌入式中断系统

  (1)中断原理

  首先要搞明白怎么实现的中断,CPU遇到紧急事件要处理,就跳转到紧急事件,再返回来继续处理

  就时SP配合PC的一套操作了

  1、进入中断

  (a)处理器自动保存现场到栈里SP,PC,xPSR,R0-R3,LR,

  (b)入栈结束以后,ISR开始执行(中断服务)

  (c)中断会自动找到中断入口函数-》Vector里面声明的

  2、退出中断

  (a)现场恢复PC,SP

  (b)出栈完成执行下一条

二、嵌套向量控制器NVIC

  NVIC专门用于管理中断控制器(CPU并不知道谁传来的中断请求)

   NVIC功能:

  (1)中断管理

    1、给中断使能/禁止

      ISER--中断使能

      ICER--中断禁止

    2、设置挂起状态

      ISPR--中断挂起

     ICPR--中断挂起清除

    3、设置脉冲/下降触发

   (2)中断异常的向量化处理

    Reset+SVCall+系统调用+Systick

    当产生异常时,处理器把PC设置为中断向量(中断入口),每一个异常就是一个中断号,汇集起来就是中断向量表

  其中位置系统内部是负数,外部异常时正数。

  并且优先级值越小,优先级越高

   (3)中断配置

     1、中断分组

      STM32可以将中断分为5组-》0-4,其中划分两种:抢占优先级和响应优先级

  抢占优先级响应级别高于响应优先级。其中数值越小优先级越高

    嵌套:

    高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的;
    抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断;
    抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行;
    如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;

  1. 打断的情况只会与抢占优先级有关, 和响应优先级无关!

一般情况下,系统代码执行过程中,只设置一次中断优先级分组,比如分组2,设置好分组之后一般不会再改变分组。随意改变分组会导致中断管理混乱,程序出现意想不到的执行结果。

因此设置组优先级

  
void NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2)就是2:2的分配

  2、中断优先级

  NVIC_InitTypeDef结构体

  NVIC_IRQChannel:定义初始化的是哪一个中断,这个可以在stm32f10x.h文件中查到每个中断对应的名字,如USART1_IRQn; 

    NVIC_IRQChannelPreemptionPriority:定义此中断的抢占优先级别;
    NVIC_IRQChannelSubPriority:定义此中断的响应优先级别;
    NVIC_IRQChannelCmd:该中断是否使能。

 

    实例:
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;// 抢占优先级为1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;// 子优先级位2
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能
    NVIC_Init(&NVIC_InitStructure); //根据上面指定的参数初始化NVIC寄存器
    

    copy好累。。。原博主好棒快去康康↓

    ————————————————
    版权声明:本文为CSDN博主「Yngz_Miao」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/qq_38410730/article/details/79829983

  

 三、外部中断配置寄存器

  EXTIx哇终于到这里我心好累

  这个图里不是有

  外设吗,呐EXTI就是管理外设请求的 康康:EXTIx代表 PAx,PBx,PCx...的x号引脚,每一个x引脚智能有一个响应中断

  用SYSCFG来配置对应SYSCFG功能可多了

  

只有低16位可用,对应的16个类型分组

  一个寄存器可以配4类引脚所以一共有4个寄存器来配置对应的端口

 四、中断的构架

  我好累

 五:中断的实验

 1、按键启动流水灯

  配置KEY

首先看KEY的原理图

 

 你看吧,就是按下以后KEYx对应为0,现在看看KEYx对应的引脚

 

 看清楚了对应的引脚号,

  (1)重写中断入口函数

  到startup.s里找到EXTI0。2.3.4对应的入口函数改名自己实现

 

 具体怎么实现的key_irqHander最后再说

 (2)GPIO的中断初始

GPIO配置

  

 SYSCFG配置

 EXIT

 NVIC

 (3)结合前面的LED初始

可以编写最后的按键中断函数

 

猜你喜欢

转载自www.cnblogs.com/ttnrt/p/13211059.html
今日推荐