Download presentation
Presentation is loading. Please wait.
1
第4章 ARM Cortex-M3编程模型 ARM Cortex-M3概述 ARM Cortex-M3工作状态
1 ARM Cortex-M3概述 2 ARM Cortex-M3工作状态 3 ARM Cortex-M3工作模式 4 ARM Cortex-M3寄存器 5 ARM Cortex-M3异常中断 6 ARM Cortex-M3中断控制器 7 ARM Cortex-M3存储器系统
2
ARM Cortex-M3概述 指令总线 系统数据总线 私有外设总线
3
ARM Cortex-M3概述 ARM7TDMI功能图
4
ARM Cortex-M3概述 ARM Cortex-M3与ARM7TDMI比较: 增加中断控制器(NVIC)
增加存储器保护单元(MPU),可对某一存储区单独保护 采取哈佛结构,数据总线与指令总线分开,取指令取数据可同时进行 工作状态只1种、工作模式仅2种、寄存器不同、异常中断类型不同、异常中断处理机制不同 预定义存储器映射 带分支预测的三级流水线
5
第4章 ARM Cortex-M3编程模型 ARM Cortex-M3概述 ARM Cortex-M3工作状态
1 ARM Cortex-M3概述 2 ARM Cortex-M3工作状态 3 ARM Cortex-M3工作模式 4 ARM Cortex-M3寄存器 5 ARM Cortex-M3异常中断 6 ARM Cortex-M3中断控制器 7 ARM Cortex-M3存储器系统
6
Cortex-M3工作状态 与ARM7TDMI不同,Cortex-M3不支持ARM指令,只支持Thumb-2指令,故只有一种工作状态——Thumb态。 CM3指令集是thumb-2指令集的子集 CM3指令集包含了全部thumb指令
7
第4章 ARM Cortex-M3编程模型 ARM Cortex-M3概述 ARM Cortex-M3工作状态
1 ARM Cortex-M3概述 2 ARM Cortex-M3工作状态 3 ARM Cortex-M3工作模式 4 ARM Cortex-M3寄存器 5 ARM Cortex-M3异常中断 6 ARM Cortex-M3中断控制器 7 ARM Cortex-M3存储器系统
8
ARM Cortex-M3工作模式 Cortex‐M3 有2 个工作模式和2个特权等级 工作模式 特权等级
处理模式(handler)。进行异常处理的工作模式,响应异常中断时,CM3自动切换到该模式下运行 线程模式(thread)。执行主应用程序的工作模式,复位时也处于该模式 特权等级 特权级(Privileged)。 用户级(User)。
9
ARM Cortex-M3工作模式 CM3在处理模式下总是享有特权级 在线程模式下时,既可为特权级,也可为用户级
在复位时,处理器工作于:线程模式+特权级 异常handler的代码 主应用程序的代码
10
ARM Cortex-M3工作模式 在特权级下,程序可访问所有受保护的资源,也可以通过置位CONTROL[0]来进入用户级。
产生异常中断时,CM3将以特权级来运行其服务例程,异常中断返回后再回到产生异常中断之前的级别
11
ARM Cortex-M3工作模式 在用户级下,不能通过修改CONTROL[0]来回到特权级。它必须通过一个异常handler,由那个异常handler 来修改CONTROL[0],才能在返回到线程模式后拿到特权级。
12
ARM Cortex-M3工作模式 在用户级下,对系统控制空间(SCS)的访问被阻止——该空间包含了配置寄存器 以及调试组件的寄存器。除此之外,还禁止使用MSR 访问特殊功能寄存器——APSR 除外
13
ARM Cortex-M3工作模式 工作模式切换与特权等级改变
14
ARM Cortex-M3工作模式 工作模式切换与特权等级改变
15
第4章 ARM Cortex-M3编程模型 ARM Cortex-M3概述 ARM Cortex-M3工作状态
1 ARM Cortex-M3概述 2 ARM Cortex-M3工作状态 3 ARM Cortex-M3工作模式 4 ARM Cortex-M3寄存器 5 ARM Cortex-M3异常中断 6 ARM Cortex-M3中断控制器 7 ARM Cortex-M3存储器系统
16
ARM Cortex-M3寄存器 CM3与ARM7TDMI相比,寄存器有很大不同,主要体现在:
CM3状态寄存器可拆开使用,没有备份寄存器(SPSR)) CM3有3个中断屏蔽寄存器及1个控制寄存器
17
CM3 寄存器概览 进程堆栈寄存器 主堆栈寄存器 特殊功能寄存器
18
ARM Cortex-M3寄存器 堆栈指针SP(R13) 在CM3 中有两个堆栈指针,支持两个堆栈:
主堆栈指针(MSP),或写作SP_main。这是缺省的堆栈指针,它由OS 内核、异常服务例程以及所有需要特权访问的应用程序代码来使用。 进程堆栈指针(PSP),或写作SP_process。用于常规的应用程序代码(不处于异常服务例程中时)。 并非每个应用都必须用齐两个堆栈指针。简单的应用程序只使用MSP就够了。
19
ARM Cortex-M3寄存器 当引用R13(或写作SP)时,你引用到的是当前正在使用的那一个,另一个必须用特殊的指令来访问(MRS/MSR )。 PUSH 指令和POP 指令默认使用SP PUSH {R0} ; *(--R13)=R0 POP {R0} ; R0= *R13++
20
ARM Cortex-M3寄存器 subroutine_1 在程序代码中, MSP 和PSP 都被称为R13/SP
PUSH {R0-R7, R12, R14} ; 保存寄存器列表 … ; 执行处理 POP {R0-R7, R12, R14} ; 恢复寄存器列表 BX R ; 返回到主调函数 在程序代码中, MSP 和PSP 都被称为R13/SP
21
ARM Cortex-M3寄存器 程序状态寄存器(PSRs /PSR) 应用程序状态寄存器 (APSR) 中断程序状态寄存器(IPSR)
执行程序状态寄存器(EPSR)
23
中断程序状态寄存器(IPSR)包含当前激活的异常的 ISR 编号
Reset
24
执行 状态寄存器(EPSR)包含两个重叠的区域:
可中断-可继续指令(ICI)区:用于被打断的多寄存器加载(LDM)和存储(STM)指令。保存从产生中断的点继续执行时所必需的信息 If-then状态区 :用于 If-Then(IT)指令的执行状态区,以及 T位(Thumb 状态位),包含了 If-Then 指令的执行状态位 ICI 和 IT区是重叠的,If-Then 模块内的多寄存器加载或存储操作不具有可中断-可继续功能
25
ARM Cortex-M3寄存器 程序状态寄存器可用MRS/MSR 指令单独进行访问,例:
MRS r0, APSR ; Read Flag state into R0 MRS r0, IPSR ; Read Exception/Interrupt state MRS r0, EPSR ; Read Execution state MSR APSR, r0 ; Write Flag state
26
ARM Cortex-M3寄存器 程序状态寄存器也进行组合访问(2 个组合,3 个组合)。当使用三合一的方式访问时,应使用名字“xPSR”或者“PSR”。例: MRS r0, PSR ; Read the combined program status word MSR PSR, r0 ; Write combined program state word 三合一访问时,实际操作的是如下所示的寄存器
27
ARM Cortex-M3寄存器 中断屏蔽寄存器 名字 功能描述 PRIMASK
仅1位,置1 时,关掉所有可屏蔽的中断,不可屏蔽中断(NMI)和硬件错误(fault) 除外。缺省值为0,表示没有屏蔽中断。 FAULTMASK 仅1位,置1 时,只允许NMI ,所有其它异常中断和fault被禁止。缺省值也是0,表示没有屏蔽中断。 BASEPRI 最多可9 位(由表达优先级的位数决定)。定义了被屏蔽优先级的阈值。当它被设成某个值后,所有优先级号大于等于此值的中断都被禁止(优先级号越大,优先级越低)。但若被设成0,则不禁止任何中断,0 也是缺省值。
28
ARM Cortex-M3寄存器 例 MRS r0, BASEPRI ; Read BASEPRI register into R0
MRS r0, PRIMASK ; Read PRIMASK register into R0 MRS r0, FAULTMASK ; Read FAULTMASK register into R0 MSR BASEPRI, r0 ; Write R0 into BASEPRI register MSR PRIMASK, r0 ; Write R0 into PRIMASK register MSR FAULTMASK, r0 ; Write R0 into FAULTMASK register
29
ARM Cortex-M3寄存器 控制寄存器(CONTROL) 位 功能 CONTROL[1] 堆栈指针选择
0=主堆栈指针MSP(复位后缺省值) 1=进程堆栈指针PSP 在线程模式下,可以使用PSP或MSP。在handler 模式下,只允许使用MSP,所以此时不得往该位写1。 CONTROL[0] 线程模式的优先级选择 0=特权级 1=用户级 Handler 模式永远都是特权级的。
30
ARM Cortex-M3寄存器 CONTROL 寄存器也是通过MRS 和MSR 指令来操作的: MRS R0, CONTROL
MSR CONTROL, R0
31
CM3 寄存器复习 进程堆栈指针(寄存器) 主堆栈指针(寄存器) 特殊功能寄存器
32
第4章 ARM Cortex-M3编程模型 ARM Cortex-M3概述 ARM Cortex-M3工作状态
1 ARM Cortex-M3概述 2 ARM Cortex-M3工作状态 3 ARM Cortex-M3工作模式 4 ARM Cortex-M3寄存器 5 ARM Cortex-M3异常中断 6 ARM Cortex-M3中断控制器 7 ARM Cortex-M3存储器系统
33
ARM Cortex-M3异常中断 异常中断会引起程序控制流程的变化。在异常中断发生时,处理器停止当前的任务,转而执行被称作服务例程的程序。服务例程执行完后,才返回继续执行刚才暂停的正常程序流程。 CM3 支持11 个系统异常和最多240 个外部中断。CM3异常中断由嵌套向量中断控制器(NVIC)进行管理。本节讲授异常中断类型、响应、返回、优先级以及中断嵌套、咬尾中断、晚到中断等
34
Cortex-M3异常中断内容 异常中断类型 异常中断向量 异常中断响应 异常中断返回 异常中断优先级 异常中断新特性
35
1.CM3异常中断类型
36
1.CM3异常中断类型 硬件fault。其它fault发生时,由于其被除能、优先级低或缺服务例程等不能得到响应时都将“上访”成硬fault。
37
1.CM3异常中断类型 存储器管理faults 。多与MPU有关,常见诱因如下: 访问了 MPU设置区域覆盖范围之外的地址
往只读 region 写数据 用户级下访问了只允许在特权级下访问的地址
38
1.CM3异常中断类型 总线fault。当 AHB接口上正在传送数据时,如果收到了一个错误信号,则会产生总线 faults。产生的场合可以是: 取指,通常被称作“预取中止”(prefetch abort) 数据读/写,通常被称作“数据中止”(data abort) 中断处理起始阶段的堆栈 PUSH 动作,若地址有误。 中断处理收尾阶段的堆栈 POP动作,若地址有误。 在处理器启动中断处理序列后的向量读取时,若地址有误。
39
1.CM3异常中断类型 SVC和PendSV SVC与ARM7的SWI相同
PendSV:可挂起的系统调用,SVC也称为系统调用,但不可挂起。另外,前者通过置位对应的挂起寄存器产生,后者则通执行SVC指令产生。 PendSV常与SVC一起用在任务切换中。
40
2.异常中断向量 向量表 与ARM7TDMI一样,CM3 使用“向量表查表机制”。向量表其实是一个WORD(32 位整数)数组,每个下标对应一种异常中断,该下标元素的值则是该异常中断服务例程的入口地址——异常中断向量。 向量表即为异常中断向量按序排列构成的表
41
2.异常中断向量 存储器管理 fault 总线fault 用法fault 调试监视器
42
2.异常中断向量 CM3在复位结束时将读取下列两个32 位整数的值: 从地址 0x0000,0000 处取出MSP 的初始值。
从地址 0x0000,0004 处取出PC 的初始值——这个值是复位向量,LSB 必须是1。然后从这个值所对应的地址处取指。
43
2.异常中断向量 向量表的起始地址可以不为0,即向量表可重定位于Flash的其它地方或于RAM中
向量表是发生异常中断时CM3去取处理程序入口地址的地方,能随便放置吗? 向量表的重定位必须经由向量表偏移量寄存器(VTOR)来实现 位段 名称 类型 复位值 描述 29 TBLBASE R/W 0 0=向量表是在Code区 1=向量表在RAM区 28~7 TBLOFF R /W ‐ 向量表的起始地址
44
3.异常中断的响应 入栈:依次把8个寄存器按序压入适当的堆栈中:如果响应异常时,当前的代码正在使用PSP,则压入PSP;否则压入MSP。一旦进入了服务例程,就将一直使用MSP 。 地址 寄存器 被保存的顺序 旧SP (N‐0) 原先已压入的内容 ‐ (N‐4) xPSR 2 (N‐8) PC 1 (N‐12) LR 8 (N‐16) R12 7 (N‐20) R3 6 (N‐24) R2 5 (N‐28) R1 4 新SP (N‐32) R0 3
45
3.异常中断的响应 取向量:当数据总线(系统总线)在为入栈传送数据时,指令总线(I‐Code总线)可从向量表中找出正确的异常向量,然后在服务程序的入口处预取指。入栈与取指同时进行。
46
3.异常中断的响应 更新寄存器:在入栈和取向量完成后,在执行服务例程之前,还要更新一系列的寄存器:
SP:在入栈中会把堆栈指针(PSP或MSP)更新到新的位置。在执行服务例程后,将由MSP负责对堆栈的访问 PSR:IPSR位段(地处PSR的最低部分)会被更新为新响应的异常编号。 PC:在向量取出后,PC将指向服务例程的入口地址 LR: 存放异常返回值“EXC_RETURN”,其由CM3自动计算出来,除最低4位外全为1,最低4位在异常返回时使用,决定异常返回时的行为
47
3.异常中断的响应 EXC_RETURN的计算 EXC_RETURN位段详解 合法的EXC_RETURN值及其功能 位段 含义 [31:4]
位段 含义 [31:4] EXC_RETURN的标识:必须全为1 3 0=返回后进入Handler模式;1=返回后进入线程模式 2 0=从主堆栈中做出栈操作,返回后使用MSP;1=从进程堆栈中做出栈操作,返回后使PSP 1 保留,必须为0 0 0=返回ARM状态;1=返回Thumb状态。在CM3中必须为1 合法的EXC_RETURN值及其功能 EXC_RETURN[31:0] EXC_RETURN[3:0] 功能 0xFFFF_FFF1 0001 返回handler模式 , 使用主堆栈MSP 0xFFFF_FFF9 1001 返回线程模式,使用主堆栈MSP 0xFFFF_FFFD 1101 返回线程模式,使用线程堆栈PSP
48
3.异常中断的响应 例1 主程序在线程模式下运行,并且在使用MSP时被中断,则响应中断时EXC_RETURN =0xFFFF_FFF9
49
3.异常中断的响应 例2 在Handler模式下运行时,如响应中断,LR =0xFFFF_FFF1
50
3.异常中断的响应 例3 主程序在线程模式下运行,并且在使用PSP时被中断,则响应中断时LR=0xFFFF_FFFD
51
4.异常中断的返回 CM3通过把存放在LR中的EXC_RETURN往PC里写来启动中断返回流程,有三种方式: 返回指令 工作原理
返回指令 工作原理 BX <reg> 若EXC_RETURN在LR中,使用BX LR即可启动中断返回程序 POP {PC}或POP {…,PC} 若LR的值被压入栈,可使用POP指令把LR存储的EXC_RETURN往PC里弹,从而启动处理器做中断返回 程序 LDR与LDM 把PC作为目的寄存器,亦可启动中断返回序列
52
4.异常中断的返回 在启动了中断返回程序后,将进行下列操作:
在启动了中断返回程序后,将进行下列操作: 出栈:先前压入栈中的寄存器在这里恢复。内部的出栈顺序与入栈时的相对应,堆栈指针的值也改回去。 更新NVIC寄存器:伴随着异常的返回,它的活动位也被硬件清除。对于外部中断,倘若中断输入再次被置为有效,挂起位也将再次置位,新一次的中断响应序列也可随之再次开始。
53
5.异常中断优先级 CM3将复位、NMI与硬件错误三个中断的优先级固定为-3、-2与-1,其它中断的优先级则可编程设置,最多可用8bit来编程表示,因此最多可支持256级,且分为两个位段(组),高位段表示的称为抢占优先级,低位段表示的称为亚/子优先级。 CM3芯片厂商为精简设计,通常不会用到8位来表示优先级,如STM32只用4位来表示,仅有16级优先级 中断响应时先看抢占优先级,若抢优相同,再看子优,子优相同则再看异常号,号小优高。 中断抢占时只看抢占优先级,高可抢占低,同级不能抢占
54
5.异常中断优先级 优先级数值越小级越高。 可编程优先级存储在中断优先级寄存器(IP)中,分段(组)位置保存在应用程序中断及复位控制寄存器(AIRCR)中。
55
5.异常中断优先级 中断优先级寄存器(IP) bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
抢占优先级与亚优先级的表达 128级,0~127 2级,0~1 64级,0~63 4级,0~3 32级,0~31 8级,0~7 16级,0~15 16级,0~15 8级,0~7 32级,0~31 4级,0~3 64级,0~65 2级,0~1 128级,0~127 0级,无 256级,0~255
56
5.异常中断优先级 每个中断源都有一个8位的中断优先级寄存器,4个相邻的拼成一个32位寄存器,其地址范围为:0xE000_E400~0xE000_E4EF 例把IRQ #4的优先级设为0xC0 LDR R0, =0xE000E400 ; 加载外部优先级寄存器阵列的起始地址 LDR R1, =0xC0 ; 优先级 STRB R1, [R0, #4] ; 为IRQ #4设置优先级(按字节写)
57
5.异常中断优先级 应用程序中断及复位控制寄存器 (AIRCR)(地址:0xE000_ED00)
位段 名称 类型 复位值 描述 31:16 VECTKEY RW ‐ 访问钥匙:任何对该寄存器的写操作,都必须同时把0x05FA写入此段,否则写操作被忽略。若读取此半字,则读回值为0xFA05 15 ENDIANESS R 指示端设置。1=大端,0=小端。此值是在复位时确定的,不能更改。 10:8 PRIGROUP R/W 优先级分组 2 SYSRESETREQ W 请求芯片控制逻辑产生一次复位 1 VECTCLRACTIVE 清零所有异常的活动状态信息。通常只在调试时用,或者在OS从错误中恢复时用。 0 VECTRESET 复位CM3处理器内核(调试逻辑除外),但是此复位不影响芯片上在内核以外的电路 设置分组时将分组位置(需要添加上访问钥匙)写入位[10:8]即可
58
5.异常中断优先级 例 将优先级分组位置设置在bit5
LDR r0, =NVIC_AIRCR ; NVIC_AIRCR= 0xE000_ED00 LDR r1, =0x05FA ;0x05FA访问钥匙,从位5处划分 STR r1, [r0]
59
例 STM32优先级设 STM32有84个中断,包括16个内核中断和68个可屏蔽中断,优先级用4位表示,有16级优先级 设置优先级时,首先要将分组位置写入应用程序中断及复位控制寄存器AIRCR[10:8],然后将抢优与亚优写入中断优先级寄存器IP中相应位置,如果是外部中断,还需设置外部中断控制器的相关寄存器。
60
分组位置写入应用程序中断及复位控制寄存器AIRCR 分析可能有的抢优与子优
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 组号 分组位置 AIRCR[10:8] 抢优位数 抢优级 亚优位数 亚优级 bit7 111 无 4 0~15 1 bit6 110 0~1 3 0~7 2 bit5 101 0~3 bit4 100 bit3 011 0~16
61
分组位置写入代码 //设置 NVIC分组位置函数 //NVIC_Group:NVIC 分组号,可取 0~4
void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group) { u32 temp,temp1; temp1=(~NVIC_Group)&0x07;//取后三位 temp1<<=8; temp=SCB->AIRCR; //读取先前的设置 temp&=0X0000F8FF; //清空先前分组 temp|=0X05FA0000; //写入钥匙 temp|=temp1; SCB->AIRCR=temp; //设置分组 }
62
typedef struct { __I uint32_t CPUID; /* CPU ID Base Register */ __IO uint32_t ICSR; /* Interrupt Control State Register */ __IO uint32_t VTOR; /*Vector Table Offset Register */ __IO uint32_t AIRCR; /* Application Interrupt / Reset Control Register */ __IO uint32_t SCR; /* System Control Register */ __IO uint32_t CCR; /* Configuration Control Register */ __IO uint8_t SHP[12]; /* System Handlers Priority Registers */ __IO uint32_t SHCSR; /* System Handler Control and State Register */ __IO uint32_t CFSR; /* Configurable Fault Status Register */ __IO uint32_t HFSR; /* Hard Fault Status Register */ __IO uint32_t DFSR; /* Debug Fault Status Register */ __IO uint32_t MMFAR; /* Mem Manage Address Register */ __IO uint32_t BFAR; /* Bus Fault Address Register */ __IO uint32_t AFSR; /* Auxiliary Fault Status Register */ __I uint32_t PFR[2]; /* Processor Feature Register */ __I uint32_t DFR; /* Debug Feature Register */ __I uint32_t ADR; /* Auxiliary Feature Register */ __I uint32_t MMFR[4]; /* Memory Model Feature Register */ __I uint32_t ISAR[5]; /* ISA Feature Register */ } SCB_Type;
63
抢优与亚优写入中断优先级寄存器IP //NVIC_PreemptionPriority:抢占优先级
//NVIC_SubPriority :响应优先级 //NVIC_Channel :中断编号 //NVIC_Group :中断分组号, 0~4 void MY_NVIC_Init(u8 NVIC_PreemptionPriorit, u8 NVIC_SubPriority, u8 NVIC_Channel,u8 NVIC_Group) { u32 temp; MY_NVIC_PriorityGroupConfig(NVIC_Group); temp=NVIC_PreemptionPriority<<(4-NVIC_Group); temp|=NVIC_SubPriority&(0x0f>>NVIC_Group); temp&=0xf; //取低四位 NVIC->ISER[NVIC_Channel/32]|=(1<<NVIC_Channel%32); //使能中断位 NVIC->IP[NVIC_Channel]|=temp<<4; //写入抢优和子优到相应寄存器 }
64
NVIC控制寄存器结构体 typedef struct { __IO uint32_t ISER[8]; //中断使能寄存器组
uint32_t RESERVED0[24]; __IO uint32_t ICER[8]; //中断除能寄存器组 uint32_t RSERVED1[24]; __IO uint32_t ISPR[8]; //中断挂起控制寄存器组 uint32_t RESERVED2[24]; __IO uint32_t ICPR[8]; //中断解挂控制寄存器组 uint32_t RESERVED3[24]; __IO uint32_t IABR[8]; //中断激活标志位寄存器组 uint32_t RESERVED4[56]; __IO uint8_t IP[240]; //中断优先级控制寄存器组 uint32_t RESERVED5[644]; __O uint32_t STIR; //软件触发中断寄存器组 } NVIC_Type;
65
6.异常中断新特性 嵌套中断 CM3支持嵌套中断,在当前中断服务例程执行中,若有一更高优先级的中断发生了,则当前中断被挂起(被抢占),优先处理这个更高优先级中断,完后再继续处理当前中断。
66
6.异常中断新特性 咬尾中断(Tail-chain)
咬尾中断机制用于缩短中断延迟。在当前的异常处理完成后,若还有异常处理处于挂起状态,这时处理器不会返回到中断前的程序,而是重新进入异常处理流程,这称为咬尾中断(末尾连锁)。咬尾中断机制使得处理器不必马上恢复栈的值,因为这么做的话还得将它们重新压栈。
67
6.异常中断新特性 例 中断1处理期间挂起了中断2,但其优先级不高,中断1服务例程继续执行至结束,此时不是先出栈再入栈,而是紧接着执行中断2服务例程,因而缩短了中断2的响应延迟。
68
6.异常中断新特性 咬尾中断使得中断响应时间缩短到6个周期限
69
6.异常中断新特性 晚到中断。晚到中断机制用于强调优先级的作用
若CM3还处在响应某低优先级异常的早期,即入栈的阶段,尚未执行服务例程,如此时收到高优先级异常的请求,则入栈后,将执行高优先级异常的服务例程。
70
6.异常中断新特性 例 若在响应异常#1的早期,检测到了异常#2,则只要#2没有太晚,就能以“晚到中断”的方式处理——在入栈完毕后执行ISR #2。
71
如果高优先级异常来得太晚,以至于已经执行低优先级异常服务例程的指令了,则按普通的抢占处理,这会需要更多的处理器时间和额外32字节的堆栈空间。
72
第4章 ARM Cortex-M3编程模型 ARM Cortex-M3概述 ARM Cortex-M3工作状态
1 ARM Cortex-M3概述 2 ARM Cortex-M3工作状态 3 ARM Cortex-M3工作模式 4 ARM Cortex-M3寄存器 5 ARM Cortex-M3异常中断 6 ARM Cortex-M3中断控制器 7 ARM Cortex-M3存储器系统
73
寄存器组
74
中断控制器(NVIC)寄存器列表 名称 类型 地址 复位值 中断控制类型寄存器 只读 0xE000E004
系统时钟节拍(SysTick)控制与状态寄存器 读/写 0xE000E010 0x 系统时钟节拍(SysTick)重装值寄存器 0xE000E014 不可预测 系统时钟节拍(SysTick)当前值寄存器 读/写清除 0xE000E018 系统时钟节拍(SysTick)校准值寄存器 0xE000E01C STCALIB Irq0~31使能设置寄存器 0xE000E100 … Irq224~239使能设置寄存器 0xE000E11C Irq0~31使能清除寄存器 0xE000E180 Irq224~239使能清除寄存器 0xE000E19C Irq0~31挂起设置寄存器 0xE000E200 .. Irq224~239挂起设置寄存器 0xE000E21C
75
中断控制器(NVIC)寄存器列表 Irq0~31挂起清除寄存器 读/写 0xE000E280 0x00000000 ..
Irq224~239挂起清除寄存器 0xE000E29C Irq0~31中断激活状态寄存器 只读 … Irq224~239中断激活状态寄存器 0xE000E31C Irq0~31中断优先级寄存器 0xE000E400 Irq236~239中断优先级寄存器 0xE000E4F0 中断控制状态寄存器 读/写或只读 0xE000ED04 向量表偏移寄存器 0xE000ED08 应用中断/复位控制寄存器 0xE000ED0C 系统控制寄存器 0xE000ED10
76
中断控制器类型寄存器 用于指示NVIC支持的中断线数目
77
系统时钟节拍控制与状态寄存器 SysTick控制与状态寄存器
78
系统时钟节拍重装/当前值寄存器
79
系统时钟节拍(SysTick)校准值寄存器
80
中断使能设置寄存器ISER[8] 一位对应一个中断,CM3支持240个中断,需8个寄存器(最后一个没用完),地址范围0xE000E100-0xE000E11C 使能位置位时,一旦中断被挂起,处理器会根据其优先级将其激活;使能位清零时,中断仍可被挂起,但不能被激活。 使能位的清零通过写 1 到中断使能清除寄存器实现 域 名称 定义 复位状态 [31:0] SETENA 中断使能设置位 写:1=使能中断, 0=忽略 读:返回中断当前状态 0x0
81
中断使能清除寄存器ICER[8] 一个使能设置寄存器有一个使能清除寄存器与之对应,故共有8个使能清除寄存器,地址范围0xE000E180-0xE000E19C 域 名称 定义 复位状态 [31:0] CLRENA 中断使能清除位 写:1=清零使能位, 0=忽略 读:返回中断当前状态 0x0
82
中断挂起设置寄存器ISPR[8] 中断挂起设置寄存器用于: 将中断强制挂起(写1置位相应位)
显示当前被挂起的中断(中断管脚被置为有效时,对应的挂起位被硬件置位) 一位对应一个中断,共需8个中断挂起设置寄存器,地址范围0xE000E200-0xE000E21C 。 域 名称 定义 复位状态 [31:0] SETPEND 中断挂起设置位: 写:1=挂起相应中断, 0=忽略 读:返回中断当前挂起状态 0x0
83
中断挂起设置寄存器ISPR[8] 挂起位的清零通过写 1 到中断挂起清除寄存器的相应位来实现。
中断的服务例程开始执行时,中断就进入了“激活”状态,并且其挂起位会被硬件自动清除。 写中断挂起设置寄存器操作对已经挂起或已经被禁能的中断没有影响。
84
中断挂起清除寄存器ICPR[8] 中断挂起清除寄存器用于: 清除挂起中断 显示当前正在挂起哪个中断
一个中断挂起设置寄存器有一个挂起清除寄存器与之对应,故共有8个挂起清除寄存器,地址范围0xE000E280-0xE000E29C 。 域 名称 定义 复位状态 [31:0] CLRPEND 中断挂起清除位: 写:1=清除挂起中断, 0=忽略 读:返回中断当前挂起状态 0x0
85
中断激活状态寄存器IABR[8] 激活状态寄存器用于判断当前哪个中断是激活的(ISR的第一条指令已被执行)。
一位对应一个中断,共8个寄存器,地址范围0xE000E300-0xE000E31C 没有对应的清除寄存器,ISR执行完返回时由硬件清零 域 名称 定义 复位状态 [31:0] ACTIVE 中断激活标志: 读:1= 中断被激活或者被抢占和压栈 0= 中断不被激活或中断未被压栈 0x0
86
中断优先级寄存器IP[240] 每个外部中断有一个对应的优先级寄存器,每个寄存器占用 8 位,4 个相临的拼成一个 32 位寄存器。下图是外部中断#0~31的优先级寄存器
87
中断优先级寄存器IP[240] 8位可表示250级优先级,芯片厂商实际上并不实现这么多优先级,只用到其中几位,且分为高低两个位段,用于表示抢占优先级和亚优先级。 优先级寄存器都可以按字节访问,当然也可以按半字/字来访问。 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 抢占优先级 子优先级 没有实现,写忽略,读返回0
88
中断控制状态寄存器ICSR 中断控制状态寄存器用于: 设置一个挂起(pending)NMI 设置或清除一个挂起 SVC
设置或清除一个挂起 SysTick 查找挂起异常 查找最高优先级挂起异常的向量号 查找激活异常的向量号
89
中断控制状态寄存器ICSR 挂起的ISR的编号,若不只1,则为最高 激活的ISR的编号 1=当前有中断挂起(NMI除外)
1=一个挂起中断将在下一步进入活跃 写1清除SysTick挂起 写1挂起SysTick 写1清除pendSV挂起 写1挂起pendSV 写1挂起NMI
90
向量表偏移寄存器VTOR 向量表偏移寄存器用于: 定位向量表在 RAM 中或程序存储器中 设置向量表的偏移量 地址: 0xE000E000
向量表的起始地址 =0向量表基址位于Code; =1向量表基址位于RAM
91
向量表偏移寄存器VTOR 向量表重定位 #define SCB ((SCB_Type *) SCB_BASE)
#define SCS_BASE (0xE000E000) /*!< System Control Space Base Address */
92
typedef struct { __I uint32_t CPUID; /* CPU ID Base Register */ __IO uint32_t ICSR; /* Interrupt Control State Register */ __IO uint32_t VTOR; /*Vector Table Offset Register */ __IO uint32_t AIRCR; /* Application Interrupt / Reset Control Register */ __IO uint32_t SCR; /* System Control Register */ __IO uint32_t CCR; /* Configuration Control Register */ __IO uint8_t SHP[12]; /* System Handlers Priority Registers */ __IO uint32_t SHCSR; /* System Handler Control and State Register */ __IO uint32_t CFSR; /* Configurable Fault Status Register */ __IO uint32_t HFSR; /* Hard Fault Status Register */ __IO uint32_t DFSR; /* Debug Fault Status Register */ __IO uint32_t MMFAR; /* Mem Manage Address Register */ __IO uint32_t BFAR; /* Bus Fault Address Register */ __IO uint32_t AFSR; /* Auxiliary Fault Status Register */ __I uint32_t PFR[2]; /* Processor Feature Register */ __I uint32_t DFR; /* Debug Feature Register */ __I uint32_t ADR; /* Auxiliary Feature Register */ __I uint32_t MMFR[4]; /* Memory Model Feature Register */ __I uint32_t ISAR[5]; /* ISA Feature Register */ } SCB_Type;
93
应用中断与复位控制寄存器AIRCR 应用中断与复位控制寄存器用于: 决定数据的字节顺序
清除所有有效的状态信息,以便进行调试或从硬故障中恢复 执行系统复位 设置优先级分组位置 请求芯片控制逻辑产生一次复位 清零所有异常的活动状态信息 复位 CM3 处理器内核 访问钥匙: 写时须同时写入0x5FA 读时返回值0xFA05 指示端设置: 1=大端,0=小端。 优先级分组
94
应用中断与复位控制寄存器AIRCR 设置分组位置代码 //设置 NVIC分组位置函数
//NVIC_Group:NVIC 分组号,可取 0~4 void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group) { u32 temp,temp1; temp1=(~NVIC_Group)&0x07;//取后三位 temp1<<=8; temp=SCB->AIRCR; //读取先前的设置 temp&=0X0000F8FF; //清空先前分组 temp|=0X05FA0000; //写入钥匙 temp|=temp1; SCB->AIRCR=temp; //设置分组 }
95
应用中断与复位控制寄存器AIRCR
96
系统控制寄存器SCR 系统控制寄存器用于电源管理功能: 对处理器进入和退出低功耗状态的方式进行控制 位段 名称 类型 描述 4
SEVEONPEND RW 0=处理器由中断唤醒; 1=处理器由事件唤醒 2 SLEEPDEEP 控制处理器器在低功耗模式时是睡(睡眠模式)或深睡(指停止或待机模式) 0=睡;1=深睡 1 SLEEPONEXIT 0= 从中断返回时不睡眠 1=从中断返回时睡眠
97
系统异常优先级寄存器 异常优先级寄存器用于为以下异常设置优先级: 存储器管理故障 总线故障 使用故障 调试监控 SVC SysTick
PendSV
98
系统异常优先级寄存器 Cortex-M3共有15个系统异常,其中3个异常(复位、NMI、硬件故障)的优先级固定(-3、-2、-1),余下的12个异常的优先级需要设置。 域 名称 定义 []31:24] PRI_N3 异常7,11和15的优先级,对应保留,SVCall和SysTick []23:16] PRI_N2 异常6,10和14的优先,对应使用故障,保留和PendSV []15:8] PRI_N1 异常5,9和3的优先级,对应总线故障,保留和保留 []7:0] PRI_N 异常4,8和12的优先,对应存储器管理,保留和调试监控
99
系统处理控制与状态寄存器SHCSR 系统处理控制与状态寄存器用于: 使能或禁能系统处理
决定总线故障、存储器管理故障以及 SVC 的挂起(pending)状态 决定系统处理的激活状态
100
系统处理控制与状态寄存器SHCSR
101
系统处理控制与状态寄存器SHCSR 域 名称 定义 [31:19] - 保留 [18] USGFAULTENA 1=使能,0=禁能 [17]
BUSFAULTENA [16] MEMFAULTENA [15] SVCALLPENDED 1=SVC挂起中(如果在开始调用时被一个更高优先级的中断抢占,将导致被挂起) [14] BUSFAULTPENDED 1=总线故障挂起中,细节同上 [13] MEMFAULTPENDED 1=存贮器管理故障挂起中,细节同上 [12] [11] SYSTICKACT 1=SysTick异常激活中 [10] PENDSVACT 1=PendSV异常激活中 [9] [8] MONITORACT 1=监控器异常激活中 [7] SVCALLACT 1=SVC激活中 [6:4] [3] USGFAULTACT 1=用法故障激活中 [2] [1] BUSFAULTACT 1=总线故障激活中 [0] MEMFAULTACT 1=存贮器管理故障激活中
102
第4章 ARM Cortex-M3编程模型 ARM Cortex-M3概述 ARM Cortex-M3工作状态
1 ARM Cortex-M3概述 2 ARM Cortex-M3工作状态 3 ARM Cortex-M3工作模式 4 ARM Cortex-M3寄存器 5 ARM Cortex-M3异常中断 6 ARM Cortex-M3中断控制器 7 ARM Cortex-M3存储器系统(第5、6章)
103
CM3 的存储器系统与传统ARM 架构的相比有了很大变化:
存储器系统支持 “位带”操作。可实现对单一比特的原子操作。位带操作仅适用于一些特殊的存储器区域中; 存储器系统支持非对齐访问和互斥访问; 存储器系统支持小端和大端配置。
104
Cortex-M3
105
ARM提供(设计) 芯片商提供
106
代码区。指令总线与数据总线分开,取指和数据访问各自使用自己的总线,可并行。
107
内部SRAM 区.用于让芯片制造商连接片上SRAM,通过系统总线访问。
下部有1MB位带区,32MB 位带别名区。位带别名区1个字对应位带区的1位。位带操作只适用于数据访问。位带别名区中的访问操作是原子的。
108
片上外设区。由片上外设的控制寄存器使用。下部有1MB位带区及32MB位带别名区,以便于访问外设寄存器的各种控制位和状态位。该区不允许执行指令。不可缓存。
109
外部RAM设区。用于连接外部RAM ,没有位带。RAM 区允许执行指令。
110
外部设备区。用于连接外部设备 ,没有位带。该区不允许执行指令。
111
私有外设总线区。有两条: AHB 私有外设总线。只用于CM3 内部的AHB 外设:NVIC, FPB, DWT 和ITM。 APB 私有外设总线。既用于CM3 内部的APB 设备,也用于外部设备。CM3 允许器件制造商再添加一些片上APB 外设到APB 私有总线上,它们通过ABP 接口来访问。
113
位带操作
114
位带操作 映射公式: bit_word_offset 为位带区中的目标位的位置 bit_band_base 是别名区的开始地址
bit_word_addr=bit_band_base+bit_word_offset bit_word_offset 为位带区中的目标位的位置 bit_band_base 是别名区的开始地址 bit_word_addr 为位带区中的目标位映射到位带别名区中的(字)地址 bit_word_offset=(byte_offset×32)+(bit_number×4) byte_offset 为位带区中包含目标位的字节的编号 bit_number 为目标位的位位置(0-7)
115
位带操作 位带区字节地址为0x20000000的位0对应的别名区地址为: 位带区字节地址为0x20000000的位2对应的别名区地址为:
bit_word_addr=bit_band_base+bit_word_offset =bit_band_base+ (byte_offset×32)+(bit_number×4) =0x ×32+0×4 =0x 位带区字节地址为0x 的位2对应的别名区地址为: =0x ×32+2×4 =0x
116
位带操作 位带区字节地址为0x20000000的位7对应的别名区地址为:
bit_word_addr=bit_band_base+bit_word_offset =bit_band_base+ (byte_offset×32)+(bit_number×4) =0x ×32+7×4 =0x c
117
位带操作 位带区字节地址为0x200FFFFF的位0对应的别名区地址为: 位带区字节地址为0x200FFFFF的位7对应的别名区地址为:
bit_word_addr=bit_band_base+bit_word_offset =bit_band_base+ (byte_offset×32)+(bit_number×4) =0x xFFFFF×32+0×4 =0x23FFFFE0 位带区字节地址为0x200FFFFF的位7对应的别名区地址为: =0x xFFFFF×32+7×4 =0x23FFFFFc
118
位带操作 综上可得映射公式另一个表达式 bit_word_addr= bit_word_addr为目标位binum的位带别名地址
位带别名地址可作宏定义表示 bit_word_addr= #define BITBAND(addr, bitnum) ((addr & 0xF )+0x ((addr &0xFFFFF)<<5) +(bitnum<<2))
119
位带操作 例1:欲置位地址0x2000_0000 中的比特2,则使用位带操作的置位过程及汇编代码如下图所示:
120
位带操作 例2,欲读地址0x2000_0000 中的比特2,使用位带操作的读过程及汇编代码如下图所示:
121
位带操作 位带操作对于硬件I/O 密集型的底层驱动程序非常有用处。主要体现在两个方面: 简化代码 实现“读-改-写”的原子操作
122
共享资源“读-改-写”被中断(非原子),导致紊乱出现
123
位带操作实现共享资源“读-改-写”的原子操作,避免紊乱出现
124
在C 语言中使用位带操作 在C 编译器中并没有直接支持位带操作。C 编译器并不知道同一块内存能够使用不同的地址来访问,也不知道对位带别名区的访问只对LSB 有效。欲在C 中使用位带操作,有两种方法 1、用宏定义#define 一个位带别名区的地址,例如: #define DEVICE_REG0 ((volatile unsigned long *) (0x )) #define DEVICE_REG0_BIT0 ((volatile unsigned long *) (0x )) #define DEVICE_REG0_BIT1 ((volatile unsigned long *) (0x )) ...
125
在C 语言中使用位带操作 *DEVICE_REG0 = 0xAB; //使用正常地址访问寄存器 ...
*DEVICE_REG0 = *DEVICE_REG0 | 0x2; //使用传统方法设置bit1 *DEVICE_REG0_BIT1 = 0x1; // 通过位带别名地址设置bit1
126
在C 语言中使用位带操作 2、定义一些宏将“位带地址+位序号”转换为成别名地址的宏: 把该地址转换成一个指针
#define BITBAND(addr, bitnum) ((addr & 0xF )+0x ((addr &0xFFFFF)<<5)+(bitnum<<2)) 把该地址转换成一个指针 #define MEM_ADDR(addr) *((volatile unsigned long *)(addr)) 在此基础上,我们就可以如下改写代码: MEM_ADDR(DEVICE_REG0) = 0xAB; //使用正常地址访问寄存器 MEM_ADDR(DEVICE_REG0)= MEM_ADDR(DEVICE_REG0) | 0x2; //使用传统方法设置bit1 MEM_ADDR(BITBAND(DEVICE_REG0,1)) = 0x1;//使用位带别名地址
127
教材第5章其它内容 非对齐访问(通常不用) 互斥访问(不要求) 端模式(实验课讲授)
128
第4章 ARM Cortex-M3编程模型-复习
1 ARM Cortex-M3概述 2 ARM Cortex-M3工作状态 3 ARM Cortex-M3工作模式 4 ARM Cortex-M3寄存器 5 ARM Cortex-M3异常中断 6 ARM Cortex-M3中断控制器 7 ARM Cortex-M3存储器系统
129
第4章 ARM Cortex-M3编程模型-复习
ARM7TDMI Cortex-M3 工作状态 2态(ARM 、Thumb) 1态(Thumb) 工作模式 7式(用户、系统、未定义、中止、管理、IRQ、FIQ) 2级(用户、特权) 2式(线程、处理) 寄存器 ARM37、Thumb27、有影子寄 22。双堆栈、状态分3合1、3屏1控 异常中断 类型、向量 7类(5异2中) 255类(15异240中) 响应 1.入寄(SPSR)保CPSR 2.修改CPSR 3.入寄(LR)保断点位置 4.取向量送PC 1.入栈保PSR、PC、LR、R12及R3~R0同时取向量; 2.修改SP、PSP、PC、LR 返回 专用指令恢复CPSR及返回到断点 LR中的EXC_RETURN送PC触发中断返回流程:出栈,更新NIVC 优先级 固定:复位、取数据中止、FIQ、IRQ、预取指中止、SWI与未定义 3固定其余编程定 分抢占优与子优
130
测试题 CM3工作状态有几种?工作模式有几种? 写出CM3的复位异常向量。在复位异常向量为地址指向的存储空间中存放了什么?p41
ARM7的状态寄存器用5位来表示工作模式,CM3的状态寄存器有工作模式指示位吗?p31 什么是位带操作?CM3中的两个位带区及他们所对应的位带别名区的地址范围分别是多少?p112 CM3 优先级分为抢占优先级与子优先级,试述他们分别由哪些量决定。p55
Similar presentations