zoukankan      html  css  js  c++  java
  • 嵌入式--中断系统学习(中断系统+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初始

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

     

  • 相关阅读:
    POJ 2329 Nearest number
    POJ 2192 Zipper (简单DP)
    POJ 2231 Moo Volume(递推、前缀和)
    数据库增删改查--2017-04-08
    时间戳--2017-04-07
    数据库三大范式---2017-04-07
    数据库主键和外键----数据库基础知识1---2017-04-07
    登录页面(简单版,带遮罩层)---2017-04-06 (与04-05日写的差不多,界面圆滑点)
    第一阶段项目所遇到的问题---2017-04-066
    图片点击轮播(四)高级--2017-04-05
  • 原文地址:https://www.cnblogs.com/ttnrt/p/13211059.html
Copyright © 2011-2022 走看看