当前位置:首页 > 单片机 > 单片机
[导读]一、背景USB在持续通信几十万次后,会出现USBIN中断丢失几次的情况,分析是中断优先级不够高,导致USB中断在排队,然而排队还未完成,又有新的USB中断发生,致使其中断丢失。LPC1769的所有中断默认为最高优先级"0"(数

一、背景USB在持续通信几十万次后,会出现USBIN中断丢失几次的情况,分析是中断优先级不够高,导致USB中断在排队,然而排队还未完成,又有新的USB中断发生,致使其中断丢失。LPC1769的所有中断默认为最高优先级"0"(数字越低,优先级越高),因此能想到的第一个解决办法既是降低除USB外所有中断的优先级。本篇即对LPC1769的中断优先级及优先级分组做个概述。附:LPC1768/LPC1769除支持最高主频不同外,其他暂时没发现有什么差别。二、正文首先,说说中断优先级,所有中断均有一个优先级,1、更低的优先级数字代表着更高优先级2、除了RESET,Hardfault,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_INLINEvoidNVIC_SetPriorityGrouping(uint32_tPriorityGroup)//PriorityGroup参数按上文所写,由于LPC1769只用了5位,所以传入的参数范围为"2~7"//对应的优先级组与次优先级如下图


//我选择的优先级组为8个,次优先级为4个。代码如下:NVIC_SetPriorityGrouping(0x04);接着,定义次优先级函数:__STATIC_INLINEvoidNVIC_SetPriority(IRQn_TypeIRQn,uint32_tpriority)//参数IRQn代表中断向量值,该值定义在文件"LPC17xx.h"内/**@briefIRQinterruptsourcedefinition*/typedefenumIRQn{/******Cortex-M3ProcessorExceptionsNumbers********************/...Reset_IRQn=-15,.../******LPC17xxSpecificInterruptNumbers*************************/...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"至此,记录完毕。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

当多个同级别中断同时发出中断请求时,单片机中断系统将按照自然优先级别进行中断排序,并首先响应其中自然优先级别最高的中断。

关键字: 中断优先级 单片机 中断系统

实现中断允许控制和中断优先级控制分别由特殊功能寄存器区中的中断允许寄存器IE和中断优先级寄存器IP来实现的。下面介绍这两个特殊功能寄存器。

关键字: at89s51 中断优先级 中断允许

中断优先级是CPU响应中断的先后顺序。中断优先处理的原则是:(1)先响应优先级高的中断请求,再响应优先级低的中断请求。(2)如果一个中断请求己被响应,同级的其他中断请求将被禁止。(3)如果同级的多个中断请求同时出现

关键字: 中断优先级 先级处理

我自己依据此图理解,应用思维导图画了一张方便理解:(如果看不清可通过ctrl+鼠标滑轮放大看;)前提条件1:组别优先顺序(第0组优先级最强,第4组优先级最弱):NVIC_PriorityGroup_0>NVIC_P...

关键字: STM32 中断优先级

  之前说了stm32的iap编程,今天天气真好,顺手就来说说lpc1788的iap编程(没看前面的请查看stm笔记下的内容)  首先是flash的算法,lpc1768并没有寄存器来让我们操作flash,他内置了iap的...

关键字: iap lpc1768 上位机

一、FreeRTOS中断设置介绍FreeRTOSConfig.h中定义了两个宏,分别是:configKERNEL_INTERRUPT_PRIORITYconfigMAX_SYSCALL_INTERRUPT_PRIORIT...

关键字: freertos STM32 中断优先级

在MCS-中断优先级中由中断优先级寄存器IP来高置的,IP中某位设为1,相应的中断就是高优先级,否则就是低优先级。---PSPT1PX1PT0PX0IP优先级别寄存器各位介绍如下:PS:串行口中断优先级控制位。PS=1设...

关键字: 51单片机 中断优先级

#ifndef __USB_H__#define __USB_H__//usb传输数据的宏定义描述#include "sys.h"typedef__packed union{ U16 W; __pac...

关键字: lpc1768 USB 结构体定义

8051 系列 MCU 的基本结构包括:32 个 I/O 口(4 组8 bit 端口);两个16 位定时计数器;全双工串行通信;6 个中断源(2 个外部中断、2 个定时/计数器中断、1 个串口输入/输出中断),两级中断优...

关键字: interrupt using 中断优先级 c51中断

试分析以下几个中断优先级的排列顺序(级别由高到低)是否有可能实现?若能,应如何设置中断源的中断优先级别?若不能,试述理由。内容来自单片机之家www.dpj100.com1)T0、T1、/INT0、/INT1、串行口;2)...

关键字: 中断优先级 单片机 排列顺序
关闭
关闭