LPC1768\1769之中断优先级与中断优先级组

发布者:科技创造者最新更新时间:2016-12-26 来源: eefocus关键字:LPC1768  中断优先级 手机看文章 扫描二维码
随时随地手机看文章
一、背景
        USB在持续通信几十万次后,会出现USB IN中断丢失几次的情况,分析是中断优先级不够高,导
    致USB中断在排队,然而排队还未完成,又有新的USB中断发生,致使其中断丢失。LPC1769的所有中
    断默认为最高优先级"0"(数字越低,优先级越高),因此能想到的第一个解决办法既是降低除USB外所
    有中断的优先级。
        本篇即对LPC1769的中断优先级及优先级分组做个概述。
        附:LPC1768/LPC1769除支持最高主频不同外,其他暂时没发现有什么差别。

二、正文
        首先,说说中断优先级,所有中断均有一个优先级,            1、 更低的优先级数字代表着更高优先级            2、 除了RESET, Hard fault, NMI等系统级中断,其他所有中断优先级均可配置为"0~31"。 
        如果软件没有配置这些中断的优先级,那么所有中断的优先级默认为最高优先级"0"。此处
    实例说明这个中断优先级的概念,假设三个外部中断"A,B,C","A,B"配置为"0","C"配置为"1",        1、 如果三个中断同时产生,那么"A,B"中断优先"C"中断运行。        2、 "A,B"中断同时产生,谁更优先执行呢?那就根据中断向量表的排号,低的优先执行。        3、 若是"C"的中断正在运行,此时"A"的中断发生,那么"A"的中断会抢占"C"的执行权限,优先
            执行。        4、 若是"A"的中断正在运行,此时"B"的中断发生,那么新产生的"B"中断会进入等待状态,等
            待"A"执行完毕再执行。
        以上,只是单纯的判断优先级值来控制中断的顺序,为了增强中断的控制逻辑,ARM新增了优先级
    组的概念。即相同的优先级等级可以分配在一组优先级内,在这一组优先级内再来定义次优先级,具
    体是怎么一个概念呢?还是假设有四个中断"A,B,C,D","A,B,C"配置在优先级组"0"内,"A,B"中断配
    置次优先级"0","C"配置为次优先级"1","D"则配置为优先级组"1"
        1、 若"A,D"中断同时产生,则优先级高的"A"会优于"D"中断执行。        2、 若"A,C"中断同时产生,则优先级次优先级高的"A"会优先执行。        3、 若"A,B"中断同时产生,则根据中断向量表的位置,排号低的优先执行。        4、 若"D"正在执行中断,此时"A"中断来了,那么"A"中断会抢占"D"中断优先执行。因为"A"所
            在的优先级组高于"D"。        5、 若"C"正在执行中断,此时"A"中断来了,那么"A"中断会等待"C"执行完毕再执行。因为属于
            同一优先级组。
        ARM用了一个8位寄存器来定义优先级组和次优先级的概念。中间可以选择一个端点,高位表示有
    多少个主优先级,低位表示有多少个次优先级。
        而LPC1769只用了其中5位。具体如下图:


**********************************************************************************


        以上图的1768选定的端点为例,上图表示有"2^3=8"个优先级组,因为高三位用来定义优先级
    组,同理,低二位用来定义次优先级有"2^2=4"个。
        接着用实例来解释:
        在LPC1769提供的"core_cm3.h"提供了定义优先级组和次优先级的函数。
        定义优先级组函数:
        __STATIC_INLINE void NVIC_SetPriorityGrouping(uint32_t PriorityGroup)        // PriorityGroup参数按上文所写,由于LPC1769只用了5位,所以传入的参数范围为"2~7"        // 对应的优先级组与次优先级如下图


        // 我选择的优先级组为8个,次优先级为4个。代码如下:
        NVIC_SetPriorityGrouping(0x04);
        接着,定义次优先级函数:
        __STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)        // 参数IRQn代表中断向量值,该值定义在文件"LPC17xx.h"内
        /** @brief IRQ interrupt source definition */
        typedef enum IRQn
        {            /******  Cortex-M3 Processor Exceptions Numbers ********************/
                ...
                Reset_IRQn                    = -15, 
                ...            
            /******  LPC17xx Specific Interrupt Numbers *************************/
            
                ... 
                USB_IRQn                      = 24,       
                ... 
        } IRQn_Type;        // 参数priority        // 代表中断优先级值,范围还是为"0~31",因此需要我们自己算好优先级组所处的位置        // 以我定义的8个优先级组来说,那么值"0~3"为优先级组"0",..."28~31"为优先级组"7"。
        NVIC_SetPriority(USB_IRQn,0);       //处于优先级组"0"
        NVIC_SetPriority(TIMER0_IRQn,4);    // 处于优先级组"1"
    至此,记录完毕。


关键字:LPC1768  中断优先级 引用地址:LPC1768\1769之中断优先级与中断优先级组

上一篇:Stm32 debug停留在"BKPT 0xAB"或者"SWI 0xAB"的解决办法
下一篇:LPC1769 CAN的自测试模式

推荐阅读最新更新时间:2024-03-16 15:27

STM32F103 中断优先级理解
最近项目上用到STM32多串口通信,出现的问题是,串口都能正常收发数据,但是有一个串口发送数据帧给另一个主控时,数据帧出现了分包,我判断了一下,可能是通信串口发送中断被调试串口的打印中断给“截胡”了,所以来专门研究一下STM32的中断优先级,用更改串口优先级的方式来消除这种现象。 先看官方给的文档说明,其中有如下图: 其中有句说的很明白了,“The lower the value, the greater the priority of the corresponding interrupt.”,就是说,优先级数值越小,优先级别越高。 再看下图,了解如何配置中断优先级: 前提条件1:组别优先顺序(第0组优先
[单片机]
STM32F103 <font color='red'>中断优先级</font>理解
STM32 NVIC中断优先级:抢占优先级&响应优先级区别
首先,对STM32中断进行分组,组0~4。同时,对每个中断设置一个抢占优先级和一个响应优先级值。 分组配置是在寄存器SCB- AIRCR中配置: 抢占优先级 & 响应优先级区别: 1. 高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。 2. 抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。 3. 抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个 先执行。 4. 如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先 执行; 等级越低,优先级越高。
[单片机]
STM32 NVIC<font color='red'>中断优先级</font>:抢占优先级&响应优先级区别
51单片机中断优先级以及中断嵌套
简介:说最基本的,老的51单片机(80C51系列)有5个中断源,2个优先级,可以实现二级中断服务嵌套。现在很多扩展的51单片机已经有4个优先级(或更多)和更多的中断源了。 在说到中断之前,我先来定义一下优先级,明白了什么是优先级,后面的阐述就容易明白了。实际上很多人都是混淆了优先级的含义,所以才觉得糊里糊涂。 中断的优先级有两个:查询优先级和执行优先级。 什么是查询优级呢?我们从datasheet或书上看到的默认(IP寄存器不做设置,上电复位后为00H)的优先级: 外部中断0 定时/计数器0 外部中断1 定时/计数器1 串行中断 或 int0,timer0,int1,timer1,serial port
[单片机]
MCS-51单片机中断优先级寄存器IP的位格式及优先级的设定
MCS-51单片机具有2个 中断 优先级,均可编程设定为高优先级或低优先级。寄存器IP的位格式如下: PX0:外部中断1优先级控制位。PX1=0,设定外部中断0为高优先级中断;PX0=0,设定外部中断1为低优先级中断。 PT0:T0中断优先级控制位。PT0=1,设定定时器T0为高优先级中断;PT0=0,设定时器T0为低优先级中断。 PX1:外部中断1优先级控制位。PX1=1,设外部中断1为高优先级中断;PX1=0,设定外部中断1为低优先级中断。 PT1:T1中断优先级控制位。PT1=1,设定定时器T1为高优先级中断;PT1=0,设定定时器T1为低优先级中断。 PS:串行口中断优先级控制位。PS=1,设定串行口为高优先级中断
[单片机]
MCS-51单片机<font color='red'>中断优先级</font>寄存器IP的位格式及优先级的设定
LPC1768菜鸟学习之路systick
LPC1768在代码里用到使用systick时,是以如下形式出现 if (SysTick_Config(SystemCoreClock /1000))/1ms进入一次中断/ { while (1); /* 错误情况下就停在这里 } 这个函数的原型是 __STATIC_INLINEuint32_t SysTick_Config(uint32_t ticks) { if ((ticks - 1) SysTick_LOAD_RELOAD_Msk) return(1); /* Reload value impossible */ SysTick- LOAD = ticks - 1;
[单片机]
stm32 SCB->AIRCR 寄存器和中断优先级寄存器使用理解
参考: Cortex M3权威指南(中文).pdf STM32F4xx中文参考手册.pdf STM32F4开发指南-寄存器版本_V1.1.pdf https://blog.csdn.net/rng_uzi_/article/details/90762767 记住:抢占和响应的值越小级别越高。 首先stm32的中断有240个,中断优先级分两级抢占和响应。两种级别,规则如下,需要记住 高抢占可以打断低抢占 高响应不能打断低响应(同一抢占级,处理内部的优先级) 中断7:抢占:2响应:0 中断3:抢占:2响应:1 同抢占级别,同时发生中断,响应级别的高先执行,(不是打断) 中断6:抢占:3
[单片机]
stm32 SCB->AIRCR 寄存器和<font color='red'>中断优先级</font>寄存器使用理解
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多每日新闻
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved