cortexm3异常和中断Word文档下载推荐.docx

上传人:b****6 文档编号:8544419 上传时间:2023-05-11 格式:DOCX 页数:13 大小:22.30KB
下载 相关 举报
cortexm3异常和中断Word文档下载推荐.docx_第1页
第1页 / 共13页
cortexm3异常和中断Word文档下载推荐.docx_第2页
第2页 / 共13页
cortexm3异常和中断Word文档下载推荐.docx_第3页
第3页 / 共13页
cortexm3异常和中断Word文档下载推荐.docx_第4页
第4页 / 共13页
cortexm3异常和中断Word文档下载推荐.docx_第5页
第5页 / 共13页
cortexm3异常和中断Word文档下载推荐.docx_第6页
第6页 / 共13页
cortexm3异常和中断Word文档下载推荐.docx_第7页
第7页 / 共13页
cortexm3异常和中断Word文档下载推荐.docx_第8页
第8页 / 共13页
cortexm3异常和中断Word文档下载推荐.docx_第9页
第9页 / 共13页
cortexm3异常和中断Word文档下载推荐.docx_第10页
第10页 / 共13页
cortexm3异常和中断Word文档下载推荐.docx_第11页
第11页 / 共13页
cortexm3异常和中断Word文档下载推荐.docx_第12页
第12页 / 共13页
cortexm3异常和中断Word文档下载推荐.docx_第13页
第13页 / 共13页
亲,该文档总共13页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

cortexm3异常和中断Word文档下载推荐.docx

《cortexm3异常和中断Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《cortexm3异常和中断Word文档下载推荐.docx(13页珍藏版)》请在冰点文库上搜索。

cortexm3异常和中断Word文档下载推荐.docx

*

4:

*@parampriMaskPriMask

5:

6:

*Settheprioritymaskbitintheprioritymaskregister

7:

*/

8:

static__INLINEvoid__set_PRIMASK(uint32_tpriMask)

9:

{

10:

registeruint32_t__regPriMask__ASM("

primask"

);

11:

__regPriMask=(priMask);

12:

}

 

 

使用__set_PRIMASK

(1)关闭中断;

__setPRIMASK(0)开启中断。

一些说明:

__INLINE是宏定义,对应__inline,这是keil编译器自定义关键字,表示这个函数是内联函数,但并不是强制性内联,编译器最终决定是否内联。

__ASM(“primask”):

__ASM也是一个宏,对应__asm,这是keil编译器自定义关键字,关于这个关键字,有相当多的用法,可以在C中内嵌汇编语言、内嵌汇编函数、指定汇编标号以及本代码中的声明一个已命名寄存器变量。

这里,已命名的寄存器是("

),也就是说寄存器变量__regPriMask等同于编译器已命名的primask。

语法为:

registertypevar-name__asm(reg);

keil编译器已命名的寄存器变量为:

寄存器

__asm修饰的字符串

处理器

APSR

"

apsr"

Allprocessors

CPSR

cpsr"

basepri"

Cortex-M3,Cortex-M4

BASEPRI_MAX

basepri_max"

CONTROL

control"

Cortex-M0,Cortex-M1,Cortex-M3,Cortex-M4

DSP

dsp"

EAPSR

eapsr"

EPSR

epsr"

faultmask"

IAPSR

iapsr"

IEPSR

iepsr"

IPSR

ipsr"

MSP

msp"

PSP

psp"

PSR

psr"

r0tor12

r0"

to"

r12"

r14orlr

r14"

or"

lr"

r13orsp

r13"

sp"

r15orpc

r15"

pc"

SPSR

spsr"

Allprocessors,apartfromCortex-Mseriesprocessors.

XPSR

xpsr"

XX文库-让每个人平等地提升自我XX文库-让每个人平等地提升自我Cortex-M0,Cortex-M1,Cortex-M3,Cortex-M4

1.2开/关异常

*@briefSettheFaultMaskvalue

*@paramfaultMaskfaultMaskvalue

*Setthefaultmaskregister

static__INLINEvoid__set_FAULTMASK(uint32_tfaultMask)

registeruint32_t__regFaultMask__ASM("

__regFaultMask=(faultMask&

1);

使用__set_FAULTMASK

(1)来关闭中断和异常;

使用__set_FAULTMASK(0)开启中断和异常.

1.3更精确的优先级屏蔽

*@briefSettheBasePriorityvalue

*@parambasePriBasePriority

*Setthebasepriorityregister

static__INLINEvoid__set_BASEPRI(uint32_tbasePri)

registeruint32_t__regBasePri__ASM("

__regBasePri=(basePri&

0xff);

比如想屏蔽优先级不高于0x60的中断,则使用代码:

__set_BASEPRI(0x60);

如果想取消中断屏蔽,则使用__set_BASEPRI(0)即可。

2.异常/中断和优先级

Cortex-M3的异常包括系统异常和外设中断,系统异常是Cortex-M3内核自带的一些异常,比如复位、总线Fault和SysTick等等(见表2-1),外设中断是指制造CPU的厂家加入的,比如串口、定时器中断等等(见表2-2)。

关于异常和中断,想要分个清清楚楚实在有点困难。

异常和中断都可以“中断”正常执行的代码流,区别在于,异常是Cortex-M3内核产生的“中断”信号,而中断是Cortex-M3内核外部(片上外设或外部中断信号)产生的“中断”信号。

希望你看懂了,有时候你心里明白,但要讲的清清楚楚着实难!

表2-1:

系统异常

编号

类型

优先级

简介

N/A

1

复位

-3(最高)

2

NMI

-2

不可屏蔽中断(来自外部NMI输入脚)

3

硬Fault

-1

只要FAULTMASK没有置位,硬Fault服务例程会被强制执行

4

存储器管理Fault

可编程

MPU访问违例以及访问非法位置均可引发。

企图在“非执行区”取址也会引发此Fault。

5

总线Fault

总线收到了错误响应,原因可以使预取流产或数据流产,企图访问协处理器也会引发此Fault

6

用法Fault

由于程序错误导致的异常。

通常是使用了一条无效指令,或者是非法的状态转换,例如尝试切换到ARM状态

7~10

保留

11

SVCall

执行系统服务调用指令(SVC)引发的异常

12

调试监视器

调试器(断点、数据观察点,或者是外部调试请求)

13

14

PendSV

为系统设备而设的“可挂起请求”

15

SysTick

系统节拍时钟定时器(SysTick)

表2-2:

外设中断

16

IRQ#0

外设中断#0

17

IRQ#1

外设中断#1

...

255

IRQ#239

外设中断#239

表2-1和2-2中的“编号”有着特殊的意义,一是特殊功能寄存器IPSR中会记录当前正在服务的异常并给出了它的编号;

二是优先级完全相同的多个异常同时挂起时,则先响应异常编号最小的那一个。

一个发生的异常如果不能被立即响应,就称它被“挂起”,值得一提的是,对于被挂起的中断/异常,中断/异常信号不必由其产生者保持,NVIC的挂起状态寄存器会来保持这个信号。

所以哪怕后来挂起的中断源释放了中断请求信号,曾经的中断请求也不会丢失。

除了复位、NMI和硬Fault三个异常具有固定的优先级外,其它所有异常和中断的优先级都是可以编程的。

这就涉及到优先级配置寄存器。

Cortex-M3优先级配置寄存器共8位,所以可以有256级的可编程优先级。

但是大多数Cortex-M3芯片都会精简设计。

LPC177x/8x使用了优先级配置寄存器的5位,所以有32级可编程优先级。

复位后,对于所有优先级可编程的异常,其优先级都被初始化为0(最高优先级)

2.1设置异常/中断的优先级

2.1.1系统异常优先级设置

SHPR1-SHPR3寄存器用于设置有可编程优先级的系统异常,可设置的优先级为0到31。

SHPR1-SHPR3可按字节访问。

为了提高软件效率,CMSIS简化了SCB寄存器的表述。

在CMSIS中,字节数组SHP[0]到SHP[12]对应于寄存器SHPR1至SHPR3。

表2-3:

SHPR1寄存器的位分配

名称

功能

[31:

24]

PRI_7

[23:

16]

PRI_6

系统处理程序6的优先级,用法Fault

[15:

8]

PRI_5

系统处理程序5的优先级,总线Fault

[7:

0]

PRI_4

系统处理程序4的优先级,存储器管理Fault

SHPR2寄存器的位分配

PRI_11

系统处理程序11的优先级,SVCall

0]

-

表2-4:

SHPR3寄存器的位分配

PRI_15

系统处理程序15的优先级,SysTick异常

PRI_14

系统处理程序14的优先级,PendSV

每个PRI_N域为8位宽,但是处理器仅实现每个域的位[7:

3],位[2:

0]读取值为零并忽略写入值。

2.1.2外设中断优先级设置

LPC177x/8x微处理器的中断优先寄存器IPR0~IPR10用于设置外设中断优先级,控制41个外设中断。

每个IPRx可以按字节访问,在CMSIS中,字节数组IP[0]到IP[40]对应于寄存器IPR0~IPR10。

2.1.3系统异常/外设中断优先级设置C代码

*@briefSetthepriorityforaninterrupt

*

*@paramIRQnThenumberoftheinterruptforsetpriority

*@parampriorityTheprioritytoset

*Setthepriorityforthespecifiedinterrupt.Theinterrupt

*numbercanbepositivetospecifyanexternal(devicespecific)

*interrupt,ornegativetospecifyaninternal(core)interrupt.

*Note:

Theprioritycannotbesetforeverycoreinterrupt.*/

static__INLINEvoidNVIC_SetPriority(IRQn_TypeIRQn,uint32_tpriority)

13:

14:

if(IRQn<

0){/*setPriorityforCortex-M3SystemInterrupts*/

15:

SCB->

SHP[((uint32_t)(IRQn)&

0xF)-4]=((priority<

<

(8-__NVIC_PRIO_BITS))&

16:

}

17:

else{/*setPriorityfordevicespecificInterrupts*/

18:

NVIC->

IP[(uint32_t)(IRQn)]=((priority<

19:

20:

其中,参数IRQn为中断ID号,可以为负,也可以为正。

当IRQn为负时,设置系统异常的优先级,当IRQn大于等于0时,设置外设中断优先级。

__NVIC_PRIO_BITS是指使用到的优先级配置寄存器的位数,LPC177x/8x使用了5位。

为什么要使用(8-__NVIC_PRIO_BITS)呢?

这是因为优先级配置寄存器是高位对齐的(MSB),这主要方面不同CPU间的移植。

参数priority为要设置的优先级值,为0~31,数值越低,表示优先级越大。

LPC177x/8x的中断ID为:

系统异常ID:

标号

中断ID

描述

NonMaskableInt_IRQn

-14

不可屏蔽中断

MemoryManagement_IRQn

-12

Cortex-M3内存管理中断

BusFault_IRQn

-11

Cortex-M3总线Fault中断

UsageFault_IRQn

-10

Cortex-M3用法Fault中断

SVCall_IRQn

-5

Cortex-M3SVCall中断

DebugMonitor_IRQn

-4

Cortex-M3调试监视中断

PendSV_IRQn

Cortex-M3PendSV中断

SysTick_IRQn

Cortex-M3系统Tick中断

外设中断ID:

中断ID

描述

标号

WDT_IRQn

看门狗

EINT3_IRQn

21

外中断3

TIMER0_IRQn

定时器0

ADC_IRQn

22

AD转换

TIMER1_IRQn

定时器1

BOD_IRQn

23

欠压检测

TIMER2_IRQn

定时器2

USB_IRQn

24

USB

TIMER3_IRQn

定时器3

CAN_IRQn

25

CAN

UART0_IRQn

UART0

DMA_IRQn

26

通用DMA

UART1_IRQn

UART1

I2S_IRQn

27

I2S

UART2_IRQn

7

UART2

ENET_IRQn

28

以太网

UART3_IRQn

8

UART3

MCI_IRQn

29

SD/MMC卡I/F

PWM1_IRQn

9

PWM1

MCPWM_IRQn

30

电机控制PWM

I2C0_IRQn

10

I2C0

QEI_IRQn

31

正交编码接口

I2C1_IRQn

I2C1

PLL1_IRQn

32

PLL1锁存

I2C2_IRQn

I2C2

USBActivity_IRQn

33

USB活动

Reserved0_IRQn

CANActivity_IRQn

34

CAN活动

SSP0_IRQn

SSP0

UART4_IRQn

35

UART4

SSP1_IRQn

SSP1

SSP2_IRQn

36

SSP2

PLL0_IRQn

PLL0锁存

LCD_IRQn

37

LCD

RTC_IRQn

RTC

GPIO_IRQn

38

GPIO

EINT0_IRQn

18

外中断0

PWM0_IRQn

39

PWM0

EINT1_IRQn

19

外中断1

EEPROM_IRQn

40

EEPROM

EINT2_IRQn

20

外中断2

2.2设置异常/中断的优先级组

Cortex-M3的异常/中断是可以抢占的,高抢占优先级中断可以抢占低抢占优先级中断。

NVIC中有个名字叫做“应用程序中断及复位控制寄存器(AIRCR)”的寄存器,该寄存器的bit[10:

8]称为优先级分组(PRIGROUP)段,表示的值为0~7,分别对应8个不同的抢占优先级设置。

比如优先级分组段为0时,则8位优先级配置寄存器(LPC177x/8x只使用了其中的5位)的bit[7:

1]表示抢占优先级,bit[0:

0]表示非抢占优先级;

再比如优先级分组段为1时,则8位优先级配置寄存器的bit[7:

2]表示抢占优先级,bit[1:

0]表示非抢占优先级,依次类推。

复位后,优先级分组(PRIGROUP)段默认值为0,也就是则8位优先级配置寄存器(LPC177x/8x只使用了其中的5位)的bit[7:

0]表示非抢占优先级。

而LPC177x/8x只使用了8位优先级配置寄存器其中的bit[7:

3],所以对于LPC177x/8x微处理器而言,复位后默认32级优先级全部为可抢占优先级。

2.2.1设置优先级寄存器组的C代码

*@briefSetthePriorityGroupinginNVICInterruptController

*@paramPriorityGroupisprioritygroupingfield

*Settheprioritygroupingfieldusingtherequiredunlocksequence.

*Theparameterpriority_groupingisassignedtothefield

*SCB->

AIRCR[10:

8]PRIGROUPfield.Onlyvaluesfrom0..7areused.

*Incaseofaconflictbetweenprioritygroupingandavailable

*prioritybits(__NVIC_PRIO_BITS)thesmallestpossibleprioritygroupisset.

static__INLINEvoidNVIC_SetPriorityGrouping(uint32_tPriorityGroup)

uint32_treg_value;

/*onlyvalues0..7areused*/

uint32_tPriorityGroupTmp=(PriorityGroup&

0x07);

reg_value=SCB->

AIRCR;

/*readoldregisterconfiguration*/

/*clearbitstochange*/

reg_value&

=~(SCB_AIRCR_VECTKEY_Msk|SCB_AIRCR_PRIGROUP_Msk);

21:

/*Insertwritekeyandpriortygroup*/

22:

reg_value=(reg_value|

23:

(0x5FA<

SCB_AIRCR_VECTKEY_Pos)|

24:

(PriorityGroupTmp<

8));

25:

AIRCR=reg_value;

26:

其中,参数PriorityGroup为要设置的优先级分组(PRIGROUP)段的值,取值范围为0~7.由于操作AIRCR寄存器需要访问钥匙,所以要把0x05FA写入到该寄存器的bit[31:

16]中,否则写入的值会被忽略。

需要注意的是,在一个设计好的产品中,如

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2