Professional Documents
Culture Documents
Cortex-M3
Joseph Yiu
www.ouravr.com
1
Cortex-M3
2
Cortex-M3
ARM 4
Cortex-M3
ARM
150
1.
2.
3.
4.
error fault
:retarget, fault, region
both
5.
200%
6.
.text
7. ARM
40%
^_^
2008.05.10-2008.06.07 28
rock.song@hotmail.comQQ:9471202/9312500
bugs
Y
2008.07.02
3
Cortex-M3
4 /
CM3 STM32
CM3
CM3
16 DSP CM3
www.ouravr.com
Cortex-M3
ouravr
watercat
RTOS
ARM
32
Cortex-M3
4
Cortex-M3
5
Cortex-M3
ARM7TDMIARMCPU
ARM7TDMI
ARM Cortex-M3
ARM32ARMv7
Thumb-2
Cortex-M3
ARM
Wayne Lyons
6
Cortex-M3
ARMCortex-M3
Cortex-M3
Cortex-M3 TRM
ARMv7-M
ARMv7-M Application Level Architecture
Reference Manual
SoC
Cortex-M3
Cortex-M3
ARMGNUARM7TDMI
Cortex-M3
7
Cortex-M3
Alan Tringham, Dan Brook, David Brash, Haydn Povey, Gary Campbell, Kevin McDermott,Richard
Earnshaw, Samin Ishtiaq, Shyam Sadasivan, Simon Axford, Simon Craske, Simon Smith, Stephen Theobald
and Wayne Lyons.
CodeSourceryLuminary Micro
Elsevier
Peter ColeIvan Yardley
8
Cortex-M3
ADK AMBA
AHB
AHB-AP AHB
AMBA
APB
ARM ARM ARM
ASIC
ATB
BE8
CPI
CPU
DAP
DSP
DWT
ETM
FPB
FSR Fault
HTM CoreSight AHB
ICE
IDE
IRQ
ISA
ISR
ITM
JTAG
JTAG-DP JTAG
LR
LSB
LSU /
MCU
MMU
MPU
MSB
MSP
NMI
NVIC
OS
PC
PSP
PPB
9
Cortex-M3
MOV R0, R1 ; R1R0
MRS <reg>, <special_reg> ;
C
for (i=0;i<3;i++) { func1(); }
if (a > b) { ...
:
1. 4'hC , 0x123 16
2. #33 (e.g., IRQ #3 3)
3. #immed_1212
4.
bit[15:12] 1512
1. R
2. W
3. RW 3
4. R/Wc 0
10
Cortex-M3
34
11
Cortex-M3
12
Cortex-M3 [] 1
ARM Cortex-M3
ARM
Thumb-2(ISA)
Cortex-M3
USB
ARM Cortex-M3
Cortex32
32
DSPCM332
CM38051
dreams come true
CM3
8/1632
328/16Cortex-M3
1
Cortex-M3
device aggregation
13
Cortex-M3 [] 1
34
CM3
CC
CM3
ARM7/ARM9
NXPphilipsTIAtmelOKISTARM32
MCUARM73210
CM3ARM7
CM3
-
ARM
Cortex-M3CPUCM3MCU
CM3CM3
I/O
1.1.2.1
ARMARMARM
ARM1990Advanced RISC Machines Ltd.,
14
Cortex-M3 [] 1
AcornVLSI1991ARMARM6
VLSITI, NEC, Sharp, ST
ARMARMARMPDA
ARM20ARM
ARM
ARM
(SoC)
ARMIPIPARM
1.2 ARM
ARMARM7TDMI
ARM1176TZ(F)-S
ARM
ARM7TDMIARMv4TTThumbARMv5TE
ARM9EARM9EARM926E-SARM946E-SARMv5TE
DSP
ARM11ARM11ARMv6ARMv6
ARM1136J(F)-SARM1156T2(F)-S ARM1176JZ(F)-SARMv6ARM
SIMDv6Thumb-2
ARMv6MCU
ARMv6
ARMv6ARMCPU
ARMv73
A
R
M
3
AARMv7-A[ 1]
SymbianLinuxWindows CE
Windows MobileMMU
Java
1
PC
1
RARMv7-R
15
Cortex-M3 [] 1
MARMv7-M
Cortexv7Cortex-M3M
1
deadlineARM
Cortex-M3Cortex-M3M
CortexACortex-A8RCortex-R4
1.2 ARM
1.2.1
ARM1990s
ARM7TDMITThumbDJTAG
(Debugging)MIICE4
4
TCM
16
Cortex-M3 [] 1
1.1 ARM
ARM7TDMI v4T
ARM7TDMI-S v4T
DSP,Jazelle[
3]
ARM7EJ-S v5E
ARM920T v4T MMU
ARM922T v4T MMU
ARM926EJ-S v5E MMU DSP,Jazelle
ARM946E-S v5E MPU DSP
ARM966E-S v5E DSP
ARM968E-S v5E DMA,DSP
ARM966HS v5E MPU DSP
ARM1020E v5E MMU DSP
ARM1022E v5E MMU DSP
[ 2]
ARM1026EJ-S v5E MMU MPU DSP, Jazelle
ARM1136J(F)-S v6 MMU DSP, Jazelle
ARM1176JZ(F)-S v6 MMU+TrustZone DSP, Jazelle
ARM11 MPCore v6 MMU+ DSP
ARM1156T2(F)-S v6 MPU DSP
Cortex-M3 v7-M MPU NVIC
Cortex-R4 v7-R MPU DSP
Cortex-R4F v7-R MPU DSP+
Cortex-A8 v7-A MMU+TrustZone DSP, Jazelle
2JazelleARMJava
3MMU
MMUMMU
safety-critical
MPUMPUMMU
7ARM
ARMv7Cortex
ARMARM7TDMIARMv7
v4T
1.3
ARM
ARM7TDMIARM
17
Cortex-M3 [] 1
32ARMARM
16ThumbThumb
ThumbARM
1.3
1: Thumb-2v7v6
ARM and Thumb-2 Instruction Set Quick Reference Card
ARMThumb2
ThumbThumb-22003Thumb
both 1632
The ARM Architecture Reference ManualARMARM
ARMv73
3Corex-M3ARMv7-MARMv7-M Architecture Application
Level Reference Manual(Ref2)
18
Cortex-M3 [] 1
1.4 Thumb-2Thumb
Cortex-M332ARM
Thumb-2Cortex-M3
Thumb-2
Cortex-M3
ARM7ARMCM3CM3Thumb
Thumb
both 1632ThumbARM
ARM7ARM9
Cortex-M3ARMv7ARM7Cortex-M3
CM3
data-crunchingCM3ARM
1.5 Cortex-M3
3CM3
CM3
CM3816CM3
ARM32
CM3CM3
CM3240
MPU
CM3Thumb-2sCM3
Ad-HocZigBee
CM3
fault-handingfault
19
Cortex-M3 [] 1
CM3MPU
Cortex-M31ARM
8
Chpt 12 Cortex-M3
Chpt 3-6 Cortex-M3
Chpt 7-9
Chpt 1011 Cortex-M3
Chpt 12-14 Cortex-M3
Chpt 15-16 Cortex-M3
Chpt 17-20 Cortex-M3
s
1.6
Cortex-M3Cortex-M3
CM3ARM
CM3
AMBA Specification 2.0 4AMBA
2
Cortex-M3
20
Cortex-M3 2
Cortex-M3
2.1
Cortex-M3 32 32 32
32 CM3
CM3
8GB
CM3 MPU
cache CM3 Both
CM3
21
Cortex-M3 2
2.1 Cortex-M3
2.1
1. Debug SystemTrace System
2. MPU
2.2
Cortex-M3 R0-R15 R13 SPSP
banked
22
Cortex-M3 2
2.2.1 R0-R12
R0-R12 32 16 Thumb
R0-R7 32 Thumb-2
0 4
ARM (exception)
fault
2.2.3 R14
R14
ARM 3 MMU
cache 1
1 R14 ARM
RISC
23
Cortex-M3 2
2.2.4 R15
2.2.5
Cortex-M3
PSRs
PRIMASK, FAULTMASK, BASEPRI
CONTROL
2.3 Cortex-M3
2.1
xPSR ALU 0
PRIMASK NMI
FAULTMASK faultNMI faults
BASEPRI
CONTROL
3
2.3
Cortex-M3
thread mode
Cortex-M3
24
Cortex-M3 2
userUnprivileged
2.4 Cortex-M3
CM3
MPU MPU
CONTROL
(SVC) SVC
CONTROL
2.5
MPU
MPU
25
Cortex-M3 2
2.4
Cortex-M3 NVIC(Nested
2.4.1
xPSR
2.4.2
CM3 ISR
ARM
2.4.3
ISR
pending(reentry)
7
7
2.4.4
Cortex-M3
ISR
2.4.5
/ 8(BASEPRI)(
PRIMASKFAULTMASK)time-critical
26
Cortex-M3 2
(deadline)
8
2.5
ARM Cortex-M3
Cortex-M3
CM3
RAM
CM3 MPU
5
27
Cortex-M3 2
2.6
Cortex-M3 CM3
I-Code D-Code
SRAM RAM
2.7 MPU
Cortex-M3
violatedMPU fault
fault
MPU MPU
MPU ( region
) region
MPU
2.8
Cortex-M3 Thumb-2 32 16
ARM 32
ARM 16 Thumb ARM 32
NOP Thumb 16
thumb ARM
ARM Thumb
overheadARM
Thumb
28
Cortex-M3 2
2.7 ARM7
Thumb-2
Cortex-M3 ARM Thumb
ARM ARM CM3
ARM
both
ARM Thumb
Cortex-M3
UBFXBFIBFC C
CLZRBIT
UDIVSDIV
SEVWFEWFI
MSR,MRS
CM3 Thumb-2 C
CM3
CM3 (unified assembler framework)
CM3 Thumb-2 ARMv7-M Thumb-2
CM3
SIMD Thumb v6
SETEND A
2.9
ARMv7-M CM3
ARM
29
Cortex-M3 2
2.2 Cortex-M3
0 N/A N/A
1 -3
2 NMI -2 NMI
4 MemManage faultMPU
fault
5 fault Abort
6 (usage)
Fault
11 SVCall
12
13 N/A N/A
15 SysTick
16 IRQ #0 #0
17 IRQ #1 #1
30
Cortex-M3 2
2.9b ( r2p0 )
Cortex-M3
CM3
CM3
Cortex-M3
8 16
2.10
Cortex-M3
(halting)(stepping)
profiling
Cortex-M3 ARM CoreSight ARM
JTAG CPU (DAP)
(DP)DPs CM3
DPs SWJ-DP( JTAG
) SW-DP JTAG ARM CoreSignt JTAG-DP
3 DPs
SWJ-DP
CM3 ETM ETM
TPIU
TIPU
PC
Cortex-M3 fault
Cortex-M3
handler
ITM
ITM
JTAG
DAP CM3 DAP
TPIU
31
Cortex-M3 2
2.11 Cortex-M3
Cortex-M3
Cortex-M3
2.11.1
Cortex-M3
Thumb-2 32 ARM
16 Thumb
Thumb-2
Cortex-M3
32
Cortex-M3 100MHz
CM3 (CPI) MHz
CM3
2.11.2
240
Cortex-M3 R0-R3, R12, LR, PSR PC
8
NVIC
8
LDMSTM
PUSH POP
NMI
-(safety-critical)NMI
2.11.3
Cortex-M3 0.19mW/MHz
32
Cortex-M3 2
2.11.4
8051
fault faults
banked
MPU
2.11.5
JTAG
CoreSight
6 4
ETM DWT
fault fault
patch
ITM
33
Cortex-M3 2
34
Cortex-M3 3
Cortex-M3
3.1
CM3 R0-R15 R0-R12
16 R0-R7 32 Thumb-2
3.1.1 R0-R7
R0-R7 32
3.1.2 R8-R12
R8-R12 16 Thumb 32
thumb-2 32
35
Cortex-M3 3
3.1.3
3.1 Cortex-M3
3.1.4 R13
R13 CM3 R13
SPMRS,MSR
MSP SP_main OS
PSP SP_process
ISR
ESR
MSP
36
Cortex-M3 3
PUSH POP SP
PUSH POP
1.2
PUSH POP SP
subroutine_1
PUSH {R0-R7, R12, R14} ;
;
POP {R0-R7, R12, R14} ;
BX R14 ;
37
Cortex-M3 3
PUSH POP 4
0x4,0x8,0xc,R13 0, 0Read As Zero
3.1.5 R14
R14 LR both LR R14LR
BL(Branch and Link) LR
main ;
BL function1 ; function1
; PC= function1 LR=main
Function1
; function1
BX LR ; function1 LR PUSH
;
3.1.6 R15
R15 PC CM3
PC +4
PC LR CM3
PC LSB 0 PC
PC LSB=1 Thumb
0 ARM CM3 fault
3.2
Cortex-M3
PSRs xPSR
PRIMASK, FAULTMASK, BASEPRI
CONTROL
MSR/MRS
MRS <gp_reg>, <special_reg> ;
38
Cortex-M3 3
3.4 (xPSR)
3.2 Cortex-M3
PRIMASK 1
NMI fault 0
FAULTMASK 1 1 NMI
fault 0
BASEPRI 9
00
- PRIMASK BASEPRI
FAULTMASK OS fault
faults fault
FAULTMASK OS
39
Cortex-M3 3
CM3 CPS 4
CPSID I ;PRIMASK=1 ;
CPSIE I ;PRIMASK=0 ;
CPSID F ;FAULTMASK=1, ;
CPSIE F ;FAULTMASK=0 ;
3.2.3 CONTROL
CONTROL[1]
0= MSP
1= PSP
PSP handler
MSP 1
CONTROL[0] 0=
1=
Handler
CONTROL[1]
Cortex-M3 handler CONTROL[1] 0 0 1
LR 2 LR
LR 5
CONTROL[0]
40
Cortex-M3 3
3.3
Cortex-M3 2
3.6
handler
SCS
MRS/MSR APSR
SCS
fault
fault( If a program running at the user access level tries
to access SCS or special registers, a fault exception will occur)Keil MDK
STM32 fault
SCS 0xE000E100
STM32 STM32 faultfault
MDK 3.20
CONTROL[0]
CONTROL[0] handler
handler CONTROL[0]
3.7
CM3
NVIC
MPU
41
Cortex-M3 3
PSP
MSP CM3
8
CONTROL CONTROL[0]=0
3.8
CONTROL[0]=1+both
3.9
CONTROL0
SVC SVC CONTROL[0]
3.4
Cortex-M3 16-4-1=11 240 IRQ
240 SysTick
NVIC 16 32
42
Cortex-M3 3
3.4 Cortex-M3
0 N/A N/A
1 -3
2 NMI -2 NMI
3 (hard) fault -1 fault fault
PRIMASK BASPRI
4 MemManage faultMPU
fault fault
5 fault Abort
6 (usage)
Fault ARM
7-10 N/A N/A
11 SVCall SVC
12
13 N/A N/A
14 PendSV
pendable request
15 SysTick
16 IRQ #0 #0
17 IRQ #1 #1
255 IRQ #239 #239
7-9
3.5
CM3 (ESR) ESR
CM3 WORD32
ESR
NVIC
0 0
3.5
43
Cortex-M3 3
0 0x00 MSP
1 0x04
2 0x08 NMI
3 0x0C fault
4 0x10 MemManage fault
5 0x14 fault
6 0x18 fault
7-10 0x1c-0x28
11 0x2c SVC
12 0x30
13 0x34
14 0x38 PendSV
15 0x3c SysTick
16 0x40 IRQ #0
17 0x44 IRQ #1
18-255 0x48-0x3FF IRQ #2 - #239
11SVC NVIC 11x4=0x2C
0
MSP
3.6
Cortex-M3 PUSH POP
PUSH POP 9
3.6.1
SP PUSH
POP PUSH POP SP
PUSH PUSH
PUSH POP
PUSH/POP SP /
; R0=X, R1=Y, R2=Z
BL Fx1
Fx1
PUSH {R0 } ; R0 & SP
PUSH {R1} ; R1 & SP
PUSH {R2} ; R2 & SP
; Fx1 R0-R2
44
Cortex-M3 3
;
;R0=X, R1=Y, R2=Z Fx1 R0-R2
3.10
PUSH POP PUSH/POP
PUSH {R0-R2} ; R0-R2
PUSH {R3-R5,R8, R12} ; R3-R5,R8 R12
POP
POP {R3-R5,R8, R12} ; R3-R5R8 R12
POP {R0-R2} ; R0-R2
push pop
PUSH/POP
PUSH {R0-R3, LR}
POP {R0-R3, PC}
POP PC PUSH LR
LR LR PC LR
PC LR LR
PC
PUSH R13 STMDB POP
R13 LDMIA STMDB/LDMIA
4
3.7 Cortex-M3
Cortex-M3 SP 32
SP 4
45
Cortex-M3 3
POP SP SP 4
POP PUSH
ESR CM3 SP
MSP PSP ESR ESR CONTROL[1]
SP
3.7.1 Cortex-M3
CM3 CONTROL[1]
CONTROL[1]=0 MSP handler
3.15 CONTROL[1]=0
handler MSP
PSP
46
Cortex-M3 3
3.16 CONTROL[1]=1
MRS R0, MSP ; R0
MSR MSP, R0 ; R0
MRS R0, PSP ; R0
MSR PSP, R0 ; R0
PSP OS
STMDB LDMIA
OS PSP
3.8
CM3 32
0x0000,0000 MSP
0x0000,0004 PC LSB 1
3.17
ARM ARM
0 0 CM3 0
MSP
32
47
Cortex-M3 3
3.18 MSP PC
CM3 MSP 1
0x20007C00-0x20007FFF MSP 0x20008000
MSP 2 CM3 Thumb
LSB 1 3.18
0x101 0x100 0x100
MSP 1 NMI faultMSP
MSP
10 20 ARM 19 GCC
48
Cortex-M3 4
Cortex-M3
Cortex-M3
A ARMv7-M
Architecture Application Level Reference Manual(Ref2)
ARM 20 Keil RVMDK
RVMDK
4
4.1
ARM
ARM 19 GCC AS
4.1.1
1, 2, ;
Tab
1
#
MOV R0, #0x12 ; R0 0x12
MOV R1, #A ; R1 A ASCII
;
EQU
NVIC_IRQ_SETEN0 EQU 0xE000E100 ;
NVIC_IRQ0_ENABLE EQU 0x1
LDR R0, =NVIC_IRQ_SETEN0 ; LDR
; PC
MOV R1, #NVIC_IRQ0_ENABLE ; R1
49
Cortex-M3 4
ARM
4.1.2
ARM 4.1
S APSR
ADDS R0, R1 ; APSR
EQ,NE,LT,GT EQ=Euqal, NE= Not Equal, LT= Less Than, GT= Greater Than
BEQ <Label> ; EQ
4
Cortex-M3 B
CM3 IF-THEN IF-THEN
IT S 15
4.1.3
Thumb-2ARM
UAL 16 32
50
Cortex-M3 4
UAL
ADD R0, R1 ; Thumb
ADD R0, R0, R1 ; UAL R0=R0+R1
UAL Thumb
Thumb APSR S UAL
S
AND R0, R1 ; Thumb
ANDS R0, R0, R1 ; UAL S
Thumb-2 16 32
R0=R0+1 16 32 ADD UAL
16 32
ADDS R0, #1 ; 16
ADDS.N R0, #1 ; 16 NNarrow
ADDS.W R0, #1 ; 32 W=Wide
.W(Wide) 32 16
32 .N
ARM
C C
32 32
32 Thumb-2 ARM 32
PC
ARMv7-M
4.2
Cortex-M3 4.2 4.9
ARMv6T2
Cortex-M3 v7
51
Cortex-M3 4
Cortex-M3
APSR 5
N: (Negative)
Z (Zero)
C: /(Carry)
V: (oVerflow)
S: (Saturation)
52
Cortex-M3 4
4.2.1
4.2 16
ADC
ADD
AND
C &
ASR
BIC 0
CMN
CMP
CPY
EOR
LSL 31
LSR
MOV
MUL
MVN NOT
NEG
ORR
ROR
SBC
SUB
TST Z
REV 32
REVH 32 16 16
REVSH 32 16 32
SXTB 32
SXTH 32
UXTB 32
UXTH 32
4.3 16
B
B<cond>
BL LR
BLX #im BLXCM3
CBZ 0
CBNZ 0
53
Cortex-M3 4
IT If-Then
4.4 16
LDR
LDRH
LDRB
LDRSH
LDRSB
STR
STRH
STRB
LDMIA
STMIA
PUSH
POP
16 Thumb v4T
4.5 16
SVC
BKPT
fault
NOP
CPSIE PRIMASK(CPSIE i)/ FAULTMASK(CPSIE f) 0
CPSID PRIMASK(CPSID i)/ FAULTMASK(CPSID f)
4.6 32
ADC
ADD
ADDW 12
AND C |
ASR
BIC
BFC
BFI
54
Cortex-M3 4
CMN
CMP
CLZ
EOR
LSL
LSR
MLA
MLS
MOVW 16 16 16 0
MOV 16 MOVW
MOVT 16 16 16
MVN
MUL
ORR
ORN
RBIT 32 2 180
REV 32
REVH/ 32
REV16
REVSH 32 32
ROR
RRX C C
SFBX 32 32
SDIV
SMLAL 32 64
64
SMULL 32 64
SSAT
SBC
SUB
SUBW 12
SXTB 32
TEQ
TST Z
UBFX
UDIV
UMLAL 32 64
64
UMULL 32 64
USAT
UXTB 32 24 0
55
Cortex-M3 4
UXTH 32 16 0
4.7 32
LDR
LDRB
LDRH
LDRSH 32
LDM
LDRD 64 2
STR
STRB
STRH
STM
STRD 2
PUSH
POP
4.8 32
B
BL
TBB 8
TBH 16
4.9 32
LDREX
LDREXH
LDREXB
STREX
STREXH
STREXB
CLREX LDREX/LDREXH/LDREXB
MRS
MSR
NOP
SEV
WFE
WFI
56
Cortex-M3 4
ISB MPU
DSB MPU cache
DMB MPU cache
4.2.2
Thumb Cortex-M3
4.10
4.11
MCR
MCR2
MCRR
MRC
MRC2
MRRC
LDC
STC
CPS PSRs
ARMv6 CM3
4.12 CPS
CPS<IE/ID>.W A CM3 A
57
Cortex-M3 4
4.13 hint
DBG hint
PLD cache hint CM3 cache
NOP
PLI cache hint CM3 cache
NOP
YIELD
swapped out
4.3
ARM
4.3.1
CM3
MOV R3 R8
MOV R8, R3
MOV MVN
LoadStore
LDR
STR
4.14
LDRB Rd, [Rn, #offset] Rn+offset Rd
LDRH Rd, [Rn, #offset] Rn+offset Rd
LDR Rd, [Rn, #offset] Rn+offset Rd
LDRD Rd1, Rd2, [Rn, #offset] Rn+offset (64 ) Rd1
32 Rd2 32
58
Cortex-M3 4
4.15
LDMIA Rd!, {} Rd
Rd 16
STMIA Rd!, {} Rd
Rd 16
LDMIA.W Rd!, {} Rd
Rd 32
LDMDB.W Rd!, {} Rd
Rd 32
STMIA.W Rd!, {} Rd
Rd 32
STMDB.W Rd!, {} Rd Rd 32
LDR/STR (Pre-indexing)
LDR STR
LDR.W R0, [R1, #20]! ;
R1+offset R0R1 R1+ 20offset
R1
R0
4.16
59
Cortex-M3 4
LDR.W Rd, [Rn, #offset] ///
LDRB.W Rd, [Rn, #offset] 0
LDRH.W Rd, [Rn, #offset]
LDRD.W Rd1, Rd2, [Rn, #offset]
LDRSB.W Rd, [Rn, #offset] /
LDRSH.W Rd, [Rn, #offset] 32
STR.W Rd, [Rn, #offset] ///
STRB.W Rd, [Rn, #offset]
STRH.W Rd, [Rn, #offset]
STRD.W Rd1, Rd2, [Rn, #offset]
CM3 (Post-indexing)
offset Rd
Rd Rd+offsetoffset
STR.W R0, [R1], #-12 ;
R0 R1 R1 R1+(-12)
[R1]
4.17
LDR.W Rd, [Rn], #offset ///
LDRB.W Rd, [Rn], #offset 0
LDRH.W Rd, [Rn], #offset
LDRD.W Rd1, Rd2, [Rn], #offset
LDRSB.W Rd, [Rn], #offset] /
LDRSH.W Rd, [Rn], #offset] 32
STR.W Rd, [Rn], #offset ///
STRB.W Rd, [Rn], #offset
STRH.W Rd, [Rn], #offset
STRD.W Rd1, Rd2, [Rn], #offset
60
Cortex-M3 4
LDR/STR
CM3 #offset
C
ldr r2, [r0, r3, lsl #2]
PUSH/POP
PUSH/POP PC LR
;
PUSH {R0-R3, LR}
;
POP {R0-R3, PC}
LR
MRS/MSR 3 CM3
MRS/MSR
CM3
APSR
CM3
faultMemManage fault
fault OSC
32
CM3 MOV/MVN
16 MOV 8
61
Cortex-M3 4
LDR PC
32 32
LDR Rd, [PC, #offset] offset
LDR offset
LDR offset
literal pool(
LTORG )
ADR LSB
ADR r0, address1 ; R0= 0x4000=
address1
0x4000: MOV R0, R1
ADR 0x4000=
LDR PC
ADR PC ADR
ADR LDR 32
ADR LDR
62
Cortex-M3 4
4.3.2
CM3
ADD R0, R1 ; R0 += R1
ADD R0, #0x12 ; R0 += 12
ADD.W R0, R1, R2 ; R0 = R1+R2
ADD
16 APSR .W 32
S APSR
ADD.W R0, R1, R2 ;
ADDS.W R0, R1, R2 ;
ADD CM3 SUB, MUL, UDIV/SDIV 4.18
63
Cortex-M3 4
4.18
ADD Rd, Rn, Rm ; Rd = Rn+Rm
ADD Rd, Rm ; Rd += Rm imm im816 im1232
CM3 / 64 4.19
4.19 64
SMULL RL, RH, Rm, Rn ;[RH:RL]= Rm*Rn 64
SMLAL RL, RH, Rm, Rn ;[RH:RL]+= Rm*Rn
UMULL RL, RH, Rm, Rn ;[RH:RL]= Rm*Rn 64
SMLAL RL, RH, Rm, Rn ;[RH:RL]+= Rm*Rn
64
Cortex-M3 4
4.20 CM3
4.20
ORR Rd, Rn ; Rd |= Rn
EOR Rd, Rn ; Rd ^= Rn
EOR.W Rd, Rn, #imm12 ; Rd = Rn ^ imm12
65
Cortex-M3 4
3 32 3 Rn
Rn Rn Rn
CM3
4.21
66
Cortex-M3 4
4.21
LSL Rd, Rn, #imm5 ; Rd = Rn<<imm5
LSL Rd, Rn ; Rd <<= Rn
LSL.W Rd, Rm, Rn ; Rd = Rm<<Rn
LSR Rd, Rn, #imm5 ; Rd = Rn>>imm5
LSR Rd, Rn ; Rd >>= Rn
LSR.W Rd, Rm, Rn ; Rd = Rm>>Rn
( RRX S ) Rn
RRXS.W Rd, Rn ; tmpBit = Rn & 1
; Rd = (Rn>>1)+(C<<31)
; C= tmpBit
S C 16 Thumb
C 4.1
4.1
67
Cortex-M3 4
32
n 32-n
n 32-n
2 1
1
8 16 32
1 0
4.22
4.22
SXTB Rd, Rm ; Rd = Rm 32
SXTH Rd, Rm ; Rd = Rm 32
32 4 2
4.23
4.23
REV.W Rd, Rn
REV16.W Rd, Rn
REVSH.W
4.2
68
Cortex-M3 4
4.2
4.24
4.24
BFC.W Rd, Rn, #<width>
BFI.W Rd, Rn, #<lsb>, #<width>
CLZ.W Rd, Rn 0
RBIT.W Rd, Rn 180
SBFX.W Rd, Rn, #<lsb>, #<width> 32
SBFX.W Rd, Rn, #<lsb>, #<width> 32
4.3.3
B Label ; Label
BX reg ; reg
MOV PC, Rn ; Rn
LDR PC, [Rn] ; Rn
POP {,PC} ; PC
;
LDMIA SP!, {, PC} ;POP
PC LSB1
ARM BL
LR
69
Cortex-M3 4
4.3.4
5 4 ARM
4.25
ARM 4
If-Then
C
4 15
4.26
4.26
EQ (EQual) Z==1
NE NotEqual Z==0
CS/HS (CarrySet) C==1
CC/LO (CarryClear) C==0
MI (MInus) N==1
PL N==0
VS V==1
VC V==0
HI C==1 && Z==0
LS C==0 || Z==1
GE N==V
LT N!=V
GT Z==0 && N==V
70
Cortex-M3 4
LE Z==1 || N!=V
AL -
15 AL B
CM3 PSR
16
32 S
CMP/CMN TST/TEQ
PSR/APSR (MSR )
16 16 ADD.N Rd, Rn,
Rm 16 32 S
ADDS.W R0, R1, R2 ; 32 Thumb-2
ADD.W R0, R1, R2 ; 32 Thumb-2
ADD R0, R1 ; 16 Thumb
ADDS R0, #0xcd ; 16 Thumb
UAL
ARM
S UAL
S 16 Thumb
S
CM3
71
Cortex-M3 4
CMN R0, R1 ; R0+R1
CMN R0, 0x12 ; R0+0x12
TST TST AND
CMP
TST R0, R1 ; R0 & R1
TST R0, 0x12 ; R0 & 0x12
TEQ TEQ EOR
CMP
TEQ R0, R1 ; R0 ^ R1
TEQ R0, 0x12 ; R0 ^ 0x12
4.3.5 (barrier)
CM3
race condition
.
MPU
DSB MPU
fault
CM3
CM3 3 4.27
4.27
DMB DMB
(commit)
DSB DMB
ISB
DMB DSB
DMB/DSB ISB
72
Cortex-M3 4
(self-mofifying)
ISB
4.3.6
CM3
MSB
4.3
4.3
4.28
4.28
SSAT.W Rd, #imm5, Rn, {,shift}
SSAT.W Rd, #imm5, Rn, {,shift}
Q
APSR
Q 0 APSR
APSR
73
Cortex-M3 4
Rn
Rn 32
Rn
Rd
#imm5
132 32 12 -2048 2047
SSAT
SSAT{.W} R1, #12, R0
R0 4.29
4.29
(R0) (R1) Q
0x2000(8192) 0x7FF(2047) 1
0x537(1335) 0x537(1335)
0x7FF(2047) 0x7FF(2047)
0 0
0xFFFFE000(-8192) 0xFFFFF800(-2048) 1
0xFFFFFB32(-1230) 0xFFFFFB32(-1230)
32 12 0-4095
USAT
USAT{.W} R1, #12, R0
4.4
4.4
4.30
(R0) (R1) Q
0x2000(8192) 0xFFF(4095) 1
0xFFF(4095) 0xFFF(4095)
0x1000(4096) 0xFFF(4095) 1
0x800(2048) 0x800(2048)
0 0
74
Cortex-M3 4
0x80000000(-2G) 0 1
0xFFFFFB32(-1230) 0 1
4.4 CM3
v6 v7
APSR
IEPSR IPSR+EPSR
IAPSR IPSR+APSR
EAPSR EPSR+APSR
PSR xPSR = APSR+EPSR+IPSR
MSP
PSP
PRIMASK
BASEPRI
BASEPRI_MAX BASEPRI
FAULTMASK fault PRIMASK fault
CONTROL
PSP
LDR R0, =0x20008000
MSR PSP, R0
BX LR ; PSP
4.4.2 IF-THEN
IF-THEN(IT) 4
IT T 3 TE T E
T E If-Then
T IT E IT
75
Cortex-M3 4
IT
IT <cond> ; 1 IF-THEN
IT<x> <cond> ; 2 IF-THEN
IT<x><y> <cond> ; 3 IF-THEN
IT<x><y><z> <cond> ; 4 IF-THEN
<x>, <y>, <z>TE <cond> 4.26 AL
17
IT CM3
C if ?:
IT C
if (R0==R1)
{
R3 = R4 + R5;
R3 = R3 / 2;
}
else
{
R3 = R6 + R7;
R3 = R3 / 2;
}
CMP R0, R1 ; R0 R1
ITTEE EQ ; R0 == R1, Then-Then-Else-Else
ADDEQ R3, R4, R5 ;
ASREQ R3, R3, #1 ;
ADDNE R3, R6, R7 ;
ASRNE R3, R3, #1 ;
76
Cortex-M3 4
B Loop
LoopExit:
CBZ/CBNZ
REV 32 REVH
REV Rd, Rm
REVH Rd, Rm
REV16 Rd, Rm
REVSH Rd, Rm
R0=0x12345678
REV R1, R0
REVH R2, R0
REV16 R3, R0
R1=0x78563412R2=0x12347856R3=0x34127856
4.4.6 RBIT
RBIT REV 32
180
RBIT.W Rd, Rn
R1=0xB4E10C23 1011,0100,1110,0001,0000,1100,0010,0011
RBIT.W R0, R1
77
Cortex-M3 4
R0=0xC430872D 1100,0100,0011,0000,1000,0111,0010,1101
SXTB Rd, Rn
SXTH Rd, Rn
SXTB Rd, Rn
UXTH Rd, Rn
SXTB/SXTH 32 UXTB/UXTH
R0=0x55aa8765,
SXTB R1, R0 ; R1=0x00000065
SXTH R1, R0 ; R1=0xffff8765
UXTB R1, R0 ; R1=0x00000065
UXTH R1, R0 ; R1=0x00008765
4.4.8 BFC/BFIUBFX/SBFX
CM3 C
BFC 32 2 s 0
BFC.W Rd, #lsb, #width
lsb width lsb
LDR R0, =0x1234FFFF
BFC R0, #4, #10
R0= 0x1234C00F
BFC R0, #27, #9
BFI LSB
LDR R0, =0x12345678
LDR R1, =0xAABBCCDD
BFI.W R1, R0, #8, #16
R1= 0xAA5678DD Rn #lsb Rd
78
Cortex-M3 4
UBFX/SBFX
UBFX.W Rd, Rn, #lsb, #width
SBFX.W Rd, Rn, #lsb, #width
UBFX Rn Rd BFI
LDR R0, =0x5678ABCD
UBFX.W R1, R0, #12,#16
R0=0x0000678A
SBFX
LDR R0, =0x5678ABCD
SBFX.W R1, R0, #8,#4
R0=0xFFFFFFFB
4 #lsb #width
4.4.9 LDRD/STRD
CM3 64 LDRD/STRD 64
(0x1000)= 0x1234_5678_ABCD_EF00
LDR R2, =0x1000 ;
LDRD.W R0, R1, [R2]
R0= 0xABCD_EF00, R1=0x1234_5678
STRD 64
STRD.W R1, R0, [R2]
(0x1000)=0xABCD_EF00_1234_5678
4.4.10 TBB,TBH
C switchBasic Select Case
case TBB/TBH
51 MOVC
TBB TBH
TBH
switch switch TBH
CM3
PC +4 TBB 255*2+4=514TBH
65535*2+4=128KB+2Both TBB TBH
79
Cortex-M3 4
TBB
TBB.W [Rn, Rm] ; PC+= Rn[Rm]*2
Rn Rm 4.5
4.5 TBB
Rn R15Rn PC+4
ARM armasm.exe
TBB
TBH TBB 16 Rm
Rn+2*Rm 4.6
80
Cortex-M3 4
4.6 TBH
TBH TBB
TBH.W [pc, r0, LSL #1] ; PC branchtable
branchtable
DCI ((dest0 branchtable)/2) ; 16 DCI
DCI ((dest1 branchtable)/2)
DCI ((dest2 branchtable)/2)
DCI ((dest3 branchtable)/2)
dest0
... ; r0 = 0
dest1
... ; r0 = 1
dest2
... ; r0 = 2
dest3
... ; r0 = 3
81
Cortex-M3 4
82
Cortex-M3 5
5.1
CM3 ARM
CM3 bit-band
CM3 v7M
CM3 both
5.2
CM3 CM3
CM3 NVIC MPU
CM3
(FPB)
(DWT)
(ITM)
(ETM)
(TPIU)
ROM
CM3 4GB, SRAM RAM
83
Cortex-M3 5
4GB
5.1 Cortex-M3
512MB 32MB
SRAM
1GB RAM
RAM
84
Cortex-M3 5
0.5GB CM3
s s
AHB CM3 AHB NVIC, FPB, DWT ITM
APB CM3 APB
CM3 APB APB
APB
NVIC SCS SCS NVIC SysTickMPU
5.2
5.2 (SCS)
CM3 MPU
RAM ROM
5.3
CM3 4
(Bufferable)
(Cacheable)
(Executable)
(Sharable)
MPUCM3
RAM
8 512MB
1. 0x0000_0000- 0x1FFF_FFFF WT
Write Through
D-Code System
2. SRAM 0x2000_0000 0x3FFF_FFFF SRAM
WB-WA(Write Back, Write Allocated)
3. (0x4000_0000 0x5FFF_FFFF)
eXecute Never, XNARM
4. RAM 0x6000_0000 - 0x7FFF_FFFF RAM RAM
WB-WA
85
Cortex-M3 5
CM3
MPU
(Write Back)
cache
(Write Through)
cache
C
volatile volatile
(Write Allocate)~
5.4
CM3 NVICMPU
MPU
MPU MPU
MPU MPU regions region
5.1
5.1
0000_0000 1FFF_FFFF
SRAM 2000_0000 3FFF_FFFF
4000_0000 5FFF_FFFF
RAM 6000_0000 9FFF_FFFF
A000_0000 DFFF_FFFF
ITM E000_0000 E000_0FFF
stimulus
DWT E000_1000 E000_1FFF fault
FPB E000_2000 E000_3FFF fault
86
Cortex-M3 5
5.5
/ CM3
SRAM 1MB 1MB
RAM
32
5.3A A
87
Cortex-M3 5
5.3B B
0x2000_0000 2
5.4
5.5
5.5
88
Cortex-M3 5
5.6
5.7
30 8051 CM3
8051
CM3
LSB
LSB LSB
0x2000_0000-0x200F_FFFFSRAM 1MB
0x4000_0000-0x400F_FFFF 1MB
SRAM A, n(0<=n<=7)
5.2 SRAM
0x20000000.0 0x22000000.0
0x20000000.1 0x22000004.0
89
Cortex-M3 5
0x20000000.2 0x22000008.0
0x20000000.31 0x2200007C.0
0x20000004.0 0x22000080.0
0x20000004.1 0x22000084.0
0x20000004.2 0x22000088.0
0x200FFFFC.31 0x23FFFFFC.0
5.3
0x40000000.0 0x42000000.0
0x40000000.1 0x42000004.0
0x40000000.2 0x42000008.0
0x40000000.31 0x4200007C.0
0x40000004.0 0x42000080.0
0x40000004.1 0x42000084.0
0x40000004.2 0x42000088.0
0x400FFFFC.31 0x43FFFFFC.0
1. 0x20000000 0x3355AACC
2. 0x22000008 0x20000000 2 1
3. 0x22000008 0 0x20000000
2 0
4. 0x20000000 0x3355AAC8bit[2]
LSB
//
5.5.1
GPIO LED
74HC165,CD4094
I/O
CM3 bit-bangbit-band
bit-bang
90
Cortex-M3 5
ISR
5.8
5.8
ISR
CM3 CM3
5.9
91
Cortex-M3 5
5.9
5.5.2
LDRB/STRB LDRH/STRH
5.5.3 C
C C
LSB C
#define
#define DEVICE_REG0 ((volatile unsigned long *) (0x40000000))
#define DEVICE_REG0_BIT0 ((volatile unsigned long *) (0x42000000))
#define DEVICE_REG0_BIT1 ((volatile unsigned long *) (0x42000004))
...
*DEVICE_REG0 = 0xAB; //
...
*DEVICE_REG0 = *DEVICE_REG0 | 0x2; // bit1
...
*DEVICE_REG0_BIT1 = 0x1; // bit1
92
Cortex-M3 5
//
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &
0xFFFFF)<<5)+(bitnum<<2))
//
#define MEM_ADDR(addr) *((volatile unsigned long *) (adr))
MEM_ADDR(DEVICE_REG0) = 0xAB; //
MEM_ADDR(DEVICE_REG0)= MEM_ADDR(DEVICE_REG0) | 0x2; //
MEM_ADDR(BITBAND(DEVICE_REG0,1)) = 0x1; //
volatile C
volatile
0x20003014 7 32*7=224
long*const
at() 4
pbbaVar[136]=1; // 136
bbaVarAry[224]
bbVarAry[7] 224*4
bbVarAry
volatile
volatile
5.6
CM3
ARM
0 LSB 0
0x1001,0x1002 0x1003 ARM
Data abort CM3 fault
5.12-5.16 5
93
Cortex-M3 5
4 2
5.12 1
5.13 2
5.14 3
5.15 4
5.16 5
CM3 LDR/LDRH/LDRSH
/(LDM/STM)
PUSH/POP
(LDREX/STREX) fault
LSB
94
Cortex-M3 5
ARM
NVIC fault
UNALIGN_TRP
5.7
CM3 SWP ARM SWP
CM3 SWP
ARM / SWP
/
SWP
master CM3
LDREX/STREX, LDREXH/STREXH,
LDREXB/STREXB// LDREX/STREX
LDREX/STREX
LDREX Rxf, [Rn, #offset]
STREX Rd, Rxf, [Rn, #offset]
4GB
LDREX 16 4K
LDREX/STREX
(R0)(R0).5
(R0) 0
MainProgram
;
TryInc1st
LDREX r2, [R0]
ADD r2, #1
; 3 ISREx3
STREX R1, R2, [R0] ; STREX R1=1(R0)=0x20
TryInc2nd
;
LDREX r2, [R0]
ADD r2, #1
STREX R1, R2, [R0] ; STREX R1=0(R0)=0x21
ISREx3
; R0-R3, R12, LR, PC, PSR
LDR R2, [R0]
ORR R2, #0x20
STR R2, [R0] ; ISREx3 (r0) Bit2
BX LR ; R0-R3,R12,LR,PC,PSR
STREX #3
ISREx3(R0)(STR) ISRExt3 STREX
LDREX ISREx3 (R0)
STREX STREX
STR R2=1(R0)=1
(R0)
2
TryInc
LDREX r2, [R0]
ADD r2, #1
STREX R1, R2, [R0]
CMP R1, #1 ; STREX
BEQ TryInc ; STREX
LDREX/STREX LDREX
R0
4 4KB 4GB
96
Cortex-M3 5
STR/STREX
4GB LDREX
LDREX
STREX
STREX STREX
CM3 MPU
(master)
So
LDREX/STREX
LDREXTestRecursive
ldr r3, =N ; N
LoopWrapper
push {r0-r2, lr}
ldr r0, =0x20003000
sub r3, #1
TryInc
ldrex r1, [r0]
add r1, #1
ldr lr, =DoSTREXRcsv
cmp r3, #0
bne LoopWrapper
DoSTREXRcsv
strex r2, r1, [r0]
cmp r2, #1
beq TryInc
pop {r0-r2, pc}
(0x20003000)=0(0x20003000)N N
5.8
CM3 both
CM3
97
Cortex-M3 5
5.4 CM3
Bits 31-24 Bits 23-16 Bits 15-8 Bits 7-0
0x1000 D[7:0] D[15:8] D[23:16] D[31:24]
0x1000 D[7:0] D[15:8] - -
0x1002 D[7:0] D[15:8]
0x1000 D[7:0]
0x1001 D[7:0]
0x1002 D[7:0]
0x1003 D[7:0]
CM3
NVIC, FPB
0xE0000000 0xE00FFFFF
So REV/REVH
98
Cortex-M3 6
Cortex-M3
Cortex-M3
Cortex-M3
[] ARM
NVIC
15 16
6.1
Cortex-M3 3 3
6.1
6.1 Cortex-M3
4
3
16CM3
3216
16
CM3ARMv7M4IF-THEN
99
Cortex-M3 6
ThumbPC+4
41632ThumbThumb2
32
penalty
6.2 32
100
Cortex-M3 6
6.2
CM3
6.3 Cortex-M3
6.1
NVIC
SYSTICK Timer
MPU
CM3BusMatrix AHB
AHB to APB AHB APB
SW-DP/SWJ-DP / JTAG
JTAG SWJ-DP
AHB-AP AHB /SWJ AHB
ETM
DWT
ITM
TPIU
101
Cortex-M3 6
FPB Flash
ROM
CM3CoreCortex-M3
NVICNVIC CM3
NVIC CPU NVIC
CM3 NVIC
SysTick
OS CM3
SysTick
NVIC
MPU CM3
regions regions
BusMatrixBusMatrix CM3 AHB
BusMatrix
(bit-band)
AHB to APB Bridge APB CM3
APB CM3
APB APB APB
SW-DP/SWJ-DPSW-DP/ JTAG SWJ-DP AHB
AHB-AP AHB
JTAG NVIC
AHB SWJ-DP both JTAG SW-DP
AHB-AP AHBCM3
SW-DP/SWJ-DPDAP[ ]
SW-DP/SWJ-DPAHB-APAHB-APAHB
DAP SW-DP/SWJ-DP AHB-AP 15 15.1
ETMETM
CM3 ETM
DAP
DWT DWT
ETM
ITMITM TPIU
102
Cortex-M3 6
6.3 Cortex-M3
SoC
hook up
CM3
AHB-Lite APB AMBA 4
6.3.1 I-Code
I-Code AHB-Lite 32 0x0000_0000 0x1FFF_FFFF
16 CPU
16 Thumb
6.3.2 D-Code
D-Code AHB-Lite 32 0x0000_0000 0x1FFF_FFFF
CM3
D-Code
AHB-Lite
6.3.3
AHB-Lite 32 0x2000_0000 0xDFFF_FFFF
103
Cortex-M3 6
6.3.4
APB 32 0xE004_0000 0xE00F_FFFF
APB TPIUETM ROM
0xE004_2000-E00F_F000
6.3.5
APB 32
SWJ-DP SW-DP
15 ARM CoreSight
Technology System Design Guide (Ref 3)
6.4 Cortex-M3
CM3
SoC
Cortex-M3 Technical Reference Manual(TRM)(Ref1) 6.2
6.2
TXEV, RXEV
(SLEEPING, SLEEPDEEP)
ETM
(ETMINTNUM, ETMINTSTATE, CURRPRI)
(SYSRESETREQ) NVIC
(Lockup) (Halted) fault
(LOCKUP, HALTED) NMI
(ENDIAN)
ETM
ITM ATB ATBARM CoreSight
ITM
TPIU
12 Lockup
6.5
CM3 (PPB) PPB (APB)
CoreSight
PADDR31 0 CM3
104
Cortex-M3 6
MPU regions
PPB 32 APB
PPB
6.6
CM3
6.4
6.4 Cortex-M3
(I-Code)
D-Code
AHB SRAM
both I-CodeD-CodeARMAMBAADKADKAMBA
VHDL/Verilog
CM3 CM3
AHB
105
Cortex-M3 6
AHB
flash SRAM
6.7
CM3Cortex-M3 Technical Reference
Manual(Ref1)
12
CM3
6.3
6.3 Cortex-M3
assert
nPORESET
NVICMPU
nSYSRESET
nTRST
106
Cortex-M3 6
6.5 Cortex-M3
107
Cortex-M3 6
108
Cortex-M3 7
Fault
SVC PendSV
7.1
Cortex-M3
115 16
240 CM3
CM3 CM3 CM3
CM3
CM3
240
115 7.1 0 16
7.2
7.1
0 N/A N/A
1 -3
2 NMI -2 NMI
3 (hard)fault -1 fault(escalation) fault
FAULTMASK fault Fault
PRIMASK/BASEPRI
FAULTMASK fault
4 MemManage faultMPU
fault fault
5 fault Abort
fault
6 (usage)
109
Cortex-M3 7
Fault ARM
7-10 N/A N/A
11 SVCall SVC
12
13 N/A N/A
14 PendSV
pendable request
15 SysTick
7.2
16 IRQ #0 #0
17 IRQ #1 #1
255 IRQ #239 #239
NVIC VECTACTIVE
IPSR
NVIC
IRQ #
NVIC
(pending) fault
7.2
CM3
CM3
(preempt) 3 NMI fault
CM3 3 256 128
128
CM3
8 16 32
MSB
3 7.1
110
Cortex-M3 7
7.1 3
[4:0] 3
8 0x000x200x400x600x800xA0
0xC0 0xE0
CM3 3 8
3 vs. 4
7.3 3 vs. 4
MSB 4
3 LSB
MSB 7
7 8 MSB 0 15
7 0-6
111
Cortex-M3 7
3 5 8 7.3
7.3 3 5 8
3 5 8
-3 -3 -3 -3
-2 NMI -2 -2 -2
-1 fault -1 -1 -1
0, 0x00, 0x00 0x00,0x01
1, 0x20 0x08 0x02,0x03
0xFF 0xE0 0xF8 0xFE,0xFF
256 128
CM3 256
NVIC 7.5
2
MSB LSB
74
7.4
0 [7:1] [0:0]
1 [7:2] [1:0]
2 [7:3] [2:0]
3 [7:4] [3:0]
4 [7:5] [4:0]
5 [7:6] [5:0]
6 [7:7] [6:0]
7 [7:0]
7.5 (AIRCR)0xE000_ED00
31:16 VECTKEY RW -
0x05FA
0xFA05
15 ENDIANESS R - 1(BE8)0
2 SYSRESETREQ W -
112
Cortex-M3 7
1 VECTCLRACTIVE W -
OS
0 VECTRESET W - CM3
L H
H L
1 7
128
CM3 7
CM3
NMI fault
3 [7:5] 5 5
4 2 7.4
7.4 3 5
7.4 7.5
113
Cortex-M3 7
7.5 5
[4:0] 1 8
7.6 7.7
7.6 3 1
114
Cortex-M3 7
7.7 3 1
IRQ #3
IRQ #5 IRQ #3 IRQ #5
AIRCR
7.5
7.3
CM3
CM3 4
4 7.6
115
Cortex-M3 7
7.6
32
0x0000_0000 - MSP
0x0000_0004 1 PC
0x0000_0008 2 NMI
0x0000_000C 3 fault
0 Flash ROM
CM3
RAM RAM
NVIC
0xE000_ED08
2
32 32+16=48
2 64 64*4=256
0x0, 0x100, 0x200 7.7
7.7 (VTOR)0xE000_ED08
7-28 TBLOFF RW 0
29 TBLBASE R - Code 0 RAM 1
MSP
NMI
fault
SRAM
7.4
NMI NMI
NMI CPU
(halted)CPU Lock up NMI
lock up NMI 12
116
Cortex-M3 7
7.8
assert
PRIMASK FAULTMASK
7.9
7.9
7.10
117
Cortex-M3 7
7.10
7.11 CM3 ARM7TDMI
7.11
7.12
118
Cortex-M3 7
7.12
CM3
7.13
7.13 ISR
7.5 Fault
fault CM3 Faults
faults
faults
faults
119
Cortex-M3 7
fault
7.5.1 Faults
AHB (error response)
faults
prefetch abort
/data abort
CM3
PUSH fault
POP fault
(sequence)
fault
AHB
AHB fault
region
SDRAM
SDRAM
faults
fault fault
fault fault
fault fault
fault fault NMI
fault fault fault
12
fault BFSR
BFARVALID 1 fault
fault BFAR fault
fault
120
Cortex-M3 7
BFSR 8
0xE000_ED28 2
0xE000_ED29 7.8
7 BFARVALID - 0 =1 BFAR
6:5 - - - -
4 STKERR R/Wc 0
3 UNSTKERR R/Wc 0
2 IMPRECISERR R/Wc 0 violation
1 PRECISERR R/Wc 0
0 IBUSERR R/Wc 0
7.5.2 faults
faults MPU MPU
MemManage fault
MPU MemMange fault
MemManage faults
MPU regions
region
MemManage fault
MemManage MemMange
fault MemManage fault fault
fault fault fault NMI
MemManage fault
121
Cortex-M3 7
7 MMARVALID - 0 =1 MMAR
6:5 - - - -
4 MSTKERR R/Wc 0
3 MUNSTKERR R/Wc 0
2 - - - -
1 DACCVIOL R/Wc 0
0 IACCVIOL R/Wc 0
7.5.3 faults
faults
Cortex-M3 fault
Cortex
ARM CM3 ARM fault
ARM
LR /
/
CM3
fault NVIC
fault fault
fault fault
fault fault fault MemManage fault
fault fault fault fault NMI
fault
fault MemManage fault fault
fault NVIC handler USGFAULTENA
RAM fault fault
122
Cortex-M3 7
ARM
fault ARM PC
LSB ARM
BX RnRn LSB=0
LSB=0
POP {,PC} LSB=0
fault UFSR INVSTATE (INValid STATE)
UFSR 7.10 2
0xE000_ED28 0xE000_ED2A FAULT
1
9 DIVBYZERO R/Wc 0 DIV_0_TRP
8 UNALIGNED R/Wc 0 fault
7:4 - - - -
3 NOCP R/Wc 0
2 INVPC R/Wc 0 EXC_RETURN
PC
EXC_RETURN The return PC
PC
1 INVSTATE R/Wc 0 ARM
0 UNDEFINSTR R/Wc 0
7.5.4 fault
fault fault fault fault
fault escalation fault
fault fault NVIC
fault HFSR fault
fault fault
HFSR 7.11
31 DEBUGEVT R/Wc 0 fault
30 FORCED R/Wc 0 fault
fault fault fault
29:2 - - - -
1 VECTBL R/Wc 0 fault
0 - - - -
7.5.5 faults
fault
E faults
Faults
fault
RTOS
fault
fault
NVIC VECTRESET
CM3
SYSRESETREQ
fault
RTOS
fault (FSRs)Fault
fault fault
fault fault fault
FSRs 1
FSR fault
SVC PendSV
SVC
SVC
SVC SVC
OS
OS
SVC
124
Cortex-M3 7
SVC
API
SVC
7.14
7.14 SVC
SVC SVCSVC
SVC 0x3 ; 3
SVC SVC
SVC SVC
PSP MRS Rn, PSP
LR SVC 8
PendSV
125
Cortex-M3 7
SYSTICK
SysTick 7.15
7.15 SysTick
SysTick
SysTick ISROS
CM3 OS
fault
7.16 IRQ
OS
IRQ SysTick
SysTick SysTick
PendSV PendSV
ISR PendSV
126
Cortex-M3 7
7.17 PendSV
1. A SVC
2. OS PendSV
3. CPU SVC PendSV
4. PendSV B
5.
6. ISR SysTick ISR
7. OS PendSV
8. SysTick ISR ISR
9. ISR PendSV
10. PendSV A
127
Cortex-M3 7
128
Cortex-M3 8
NVIC
NVIC
SysTick
8.1 NVIC
NVIC Cortex-M3
CM3 NVIC CM3
NVIC
NVIC MPUSysTick
NVIC MPU
MRS/MSR CPS
8.2
NVIC
129
Cortex-M3 8
8.3
CM3 240 (SETENA /CLRENA )
240 8 32
1 SETENA 1 CLRENA
0
1
0 0
--
SETENA CLRENA 240 32 8
SETENA0, SETENA1SETENA7 8.1
32
SETENA0/CLRENA0 SETENA/CLRENA //
16 0 16 7 7.2
8.1 SETENA/CLRENA
SETENA0 R/W 0xE000_E100 0 0-31 32
[n]#n 16+n
SETENA1 R/W 0xE000_E104 0 32-63 32
SETENA7 R/W 0xE000_E11C 0 224-239 16
CLRENA7 R/W 0xE000_E19C 0 224-239 16
8.4
(SETPEND)
(CLRPEND)
8 /
130
Cortex-M3 8
8.2
8.2 SETPEND/CLRPEND
SETPEND0 R/W 0xE000_E200 0 0-31 32
[n]#n 16+n
SETPEND1 R/W 0xE000_E204 0 32-63 32
SETPEND7 R/W 0xE000_E21C 0 224-239 16
CLRPEND7 R/W 0xE000_E29C 0 224-239 16
8.4.1
8 CM3
3 4 32
/
D D.18
PRI_0 R/W 0xE000_E400 08 #0
PRI_1 R/W 0xE000_E401 08 #1
PRI_239 R/W 0xE000_E4EF 08 #239
131
Cortex-M3 8
0xE000_ED18 PRI_4 fault
0xE000_ED19 PRI_5 fault
0xE000_ED1A PRI_6 fault
0xE000_ED1B - - - -
0xE000_ED1C - - - -
0xE000_ED1D - - - -
0xE000_ED1E - - - -
0xE000_ED1F PRI_11 SVC
0xE000_ED20 PRI_12
0xE000_ED21 - - - -
0xE000_ED22 PRI_14 PendSV
0xE000_ED23 PRI_15 SysTick
8.4.2
ISR
1 ISR ISR
1 ISR
//
8.4
[n] #n 16+n
132
Cortex-M3 8
FAULTMASK-1fault
PRIMASKFAULTMASK
NMINMI
NMI
NMI
8.4.4 BASEPRI
BASEPRI
BASEPRI0BASEPRI
0x60
MOV R0, #0x60
MSR BASEPRI, R0
BASEPRI
MOV R0, #0
MSR BASEPRI, R0
BASEPRI_MAXBASEPRI
BASEPRI
BASEPRI_MAX
8.4.5
faultfaultfault
Handler(SHCSR)0xE000_ED24
faults8.5
8.5 HandlerSHCSR0xE000_ED24
18 USGFAULTENA R/W 0 fault
17 BUSFAULTENA R/W 0 fault
16 MEMFAULTENA R/W 0 fault
15 SVCALLPENDED R/W 0 SVC SVC
14 BUSFAULTPENDED R/W 0 fault
13 MEMFAULTPENDED R/W 0 fault
12 USGFAULTPENDED R/W 0 fault
11 SYSTICKACT R/W 0 SysTick
10 PENDSVACT R/W 0 PendSV
9 - - - -
8 MONITORACT R/W 0 Monitor
7 SVCALLACT R/W 0 SVC
6:4 - - - -
3 USGFAULTACT R/W 0 fault
2 - - - -
1 BUSFAULTACT R/W 0 fault
0 MEMFAULTACT R/W 0 fault
CM3
fault
134
Cortex-M3 8
fault
ICSRNMISysTickPendSV
8.6
8.5 ICSR0xE000_ED04
31 NMIPENDSET R/W 0 1 NMI NMI
NMI
28 PENDSVSET R/W 0 1 PendSV PendSV
27 PENDSVCLR W 0 1 PendSV
26 PENDSTSET R/W 0 1 SysTick PendSV
25 PENDSTCLR W 0 1 SysTick
23 ISRPREEMPT R 0 =1
22 ISRPENDING R 0 1= NMI
21:12 VECTPENDING R 0 ISR
11 RETTOBASE R 0 (base level)
1
fault
0
9:0 VECTACTIVE R 0 ISR
ISRNMI
fault
16,
/
8.5
1. 071
2. faultNMI
3.
4.
135
Cortex-M3 8
ROM
5.
6.
LDR R0, =0xE000ED0C ;
LDR R1, =0x05FA0500 ; 5 (2/6)
STR R1, [R0] ;
...
MOV R4, #8 ; ROM
LDR R5, =(NEW_VECT_TABLE+8)
LDMIA R4!, {R0-R1} ; NMI fault
136
Cortex-M3 8
CM3NVIC
32 8.7SETENA
SETENA10
10 SETPEND
8.7 ICTR0xE000_E004
4:0 INTLINESUM R - 32
0=1 32
1=33 64
2=65 96
0xFFMSB13
0xE0
8.6
SETPEND
STIR8.8
8.8 STIR0xE000_EF00
8:0 INTID W - INTID
8 IRQ #8
NMIfaultsPendSV
NVICNVIC(0xE000_ED14)
1USERSETMPENDNVICSTIR
8.7 SysTick
SysTickNVICSysTick15
137
Cortex-M3 8
Cortex-M3CM3
CM3FCLKCM3
CM3STCLKSTCLK
SysTickCM3
CM3CM3
SysTick
4SysTick8.98.12
8.9 SysTick0xE000_E010
16 COUNTFLAG R 0 SysTick
0 1
2 CLKSOURCE R/W 0 0=(STCLK)
1=(FCLK)
1 TICKINT R/W 0 1=SysTick 0 SysTick
0= 0
0 ENABLE R/W 0 SysTick
8.10 SysTick0xE000_E014
23:0 RELOAD R/W 0
8.11 SysTick0xE000_E018
23:0 CURRENT R/Wc 0
SysTick
COUNTFLAG
8.10 SysTick0xE000_E01C
31 NOREF R - 1=STCLK
0=
30 SKEW R - 1= 10ms
0= 10ms
23:0 TENMS R/W 0 10ms
Cortex-M3
138
Cortex-M3 8
CM3
SysTickTENMS
10ms SysTickSysTick
TENMSCM3
TENMSCM3TENMS
SysTick
haltSysTick
139
Cortex-M3 8
140
Cortex-M3 9
/
faults
9.1
CM3
8
MSP/PSPSPLRPC
9.1.1
xPSR, PC, LR, R12R3-R0
PSPPSP
MSP
SPN9.1AHB
9.19.13
141
Cortex-M3 9
9.1
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
9.1
Cortex-M3 r2p0
r2p0
SP89.19.1
SP8
4PCN-8N-12
8exception
stack frameCM32
2
AAPCSCM31
1NVIC
STKALIGN
12
CM3PCxPSR
PC
xPSRIPSR
R0-R3R12R4-R11ARM
CC/C++ Procedure Call Standard for the ARM ArchitectureAAPCS,
Ref5C
142
Cortex-M3 9
R4-R11push
ISR
R0-R3, R12
SPLDMLDM
R0-R3, R12
R0-R3SVCPendSV
9.1.2
I-Code
9.1.3
SPPSPMSPMSP
PSRIPSRPSR
PCPC
LRISRLREXC_RETURN
LREXC_RETURN
4149.39.4
NVIC
9.2
3
9.2LREXC_RETURN
9.2
BX <reg> LREXC_RETURNBX LR
LDRLDM PC
143
Cortex-M3 9
8051reti CM3
EXC_RETURNPCC
__interrupt
1.
2. NVIC
9.3
CM3NVIC
(wrapper code)
NVICCM3
832
ISR
SVCSVC
fault
9.4
CM3Tail-Chaining
POP
POPPUSHCPU
CM3POPPUSH
9.2
144
Cortex-M3 9
9.2
9.2B ARM7TDMI
9.5
CM3CM3
#1#2#2
ISR #29.3#2
ISR #132
ISR #2ISR #1
145
Cortex-M3 9
9.3
9.6
LREXC_RETURN
281[3:0]9.3PC
LRCM3
9.3 EXC_RETURN
[31:4] EXC_RETURN1
3 0=Handler
1=
2 0=MSP
1=PSP
1 0
0 0=ARM
1=ThumbCM31
9.3EXC_RETURN39.4
9.4 EXC_RETURN
EXC_RETURN
0xFFFF_FFF1 handler
0xFFFF_FFF9 (SP=MSP)
0xFFFF_FFFD (SP=PSP)
MSPLR=0xFFFF_FFF9
LR
PSPLR=0xFFFF_FFFD
146
Cortex-M3 9
LR
9.4 LREXC_RETURN
HandlerLR=0xFFFF_FFF1LR
ISRLR0xFFFF_FFF19.5
9.5 LREXC_RETURN
147
Cortex-M3 9
EXC_RETURN0xFFFF_FFF0-0xFFFF_FFFF
CM3
9.7
CM3
1212
CM3
6
LDRD/STRD
(LDM/STM)
CM3
LDM/STM
LDR/STRCM3LDM/STM
LDR/STR
CM3xPSRICILDM/STM
xPSRCM3ICI bits
LDM/STM
IF-THEN(IT)
xPSRICICunionboth ICI bitsIT
EPSRIF-THENLDM/STMLDM/STM
LDM/STM
xPSR
(outstanding)
fault
9.8 faults
Faults
faults
148
Cortex-M3 9
9.8.1
fault
faultfaultfault
fault
(stacking error)fault(BFSR
0xE000_ED29)STKERR4
MPUfaultMemFault
faultfault(MFSR
:0xE000_ED28)MSTKERR4fault
fault
9.8.2
fault
faultfault
fault
unstacking errorBFSR.3UNSTKERR
MPUMemManage faultMFSR.3MUNSTKERR
MemManage faultfault
9.8.3
faultfault
MPUfaultHFSR
0xE000_ED2CVECTTBL1
9.8.4
LREXC_RETURN9.4ARM
faultfaultfaultFault(UFSR,0xE000_ED2A)
INVPC2INVSTATE1
149
Cortex-M3 9
150
Cortex-M3 10
10
Cortex-M3
C
10.1
CM3 C
C C C
19 20
10.1.1
bug
C
NMI
10.1.2 C
CC
151
Cortex-M3 10
main
C CM3 NVIC
STKALIGN
AAPCS 12
10.2 C
C
C GNU
C
C
ARMARM Architecture Procedure
Call Standard(AAPCS, Ref5)
R0-R3
R0R12R0
152
Cortex-M3 10
R0-R3R129PUSHR4-R11
PUSHPOP
R0-R3, R12C
R0-R3, R12
R4-R11R0-R3,R12PUSHC
POPR4-R11
AAPCS
10.3
CM3
CARMRVDSRealView
RVCT10.1
10.1 ARM
RVDS(IDE)
ARMwww.arm.com
10.4
C
CM3C
ARM(armasm)
ARM
$> armasm --cpu cortex-m3 -o test1.o test1.s
-otest1.o
ELF
$> fromelf --bin --output test1.bin test1.elf
$> fromelf -c --output test1.list test1.elf
ELF
10.5
LED
UARTWindows
CM3UARTCM3
UARTUART
154
Cortex-M3 10
UARTUART
MAX3232I/ORS-232
UARTCM3
SemihostingNVIC
Semihostingprintf15
Cprintf
STDOUT15
CM3
TPAUARTITMprintf
UART
CM3TPIU
SWV TPAITM
SWV
retargeting
~
UART0_BASE EQU 0x4000C000
UART0_FLAG EQU UART0_BASE+0x018
UART0_DATA EQU UART0_BASE+0x000
Putc ; UART
; R0 =
PUSH {R1,R2, LR} ;
LDR R1, =UART0_FLAG
PutcWaitLoop
LDR R2, [R1] ;
TST R2, #0x20 ;
BNE PutcWaitLoop ; UART
LDR R1, =UART0_DATA ; UART
STRB R0, [R1] ;
POP {R1,R2, PC} ;
UART
UARTUART
UART
20
155
Cortex-M3 10
Puts ; UART
; R0 =
; C
PUSH {R0 ,R1, LR} ;
MOV R1, R0 ; R1Putc
; R0
PutsLoop
LDRB R0, [R1], #1 ;
CBZ R0, PutsLoopExit ;
BL Putc ; UART
B PutsLoop ;
PutsLoopExit
POP {R0, R1, PC} ;
PutsHello World
STACK_TOP EQU 0x20002000 ; SP
UART0_BASE EQU 0x4000C000
UART0_FLAG EQU UART0_BASE+0x018
UART0_DATA EQU UART0_BASE+0x000
AREA | Header Code|, CODE
DCD STACK_TOP ; MSP
DCD Start ;
ENTRY
Start ;
MOV r0, #0 ;
MOV r1, #0
MOV r2, #0
MOV r3, #0
MOV r4, #0
BL Uart0Initialize ; UART0
LDR r0, =HELLO_TXT ; R0
BL Puts
deadend
B deadend ;
;-------------------------------------------------------------
;
;-------------------------------------------------------------
Puts ; UART
; R0 =
; C
PUSH {R0 ,R1, LR} ;
MOV R1, R0 ; R1Putc
; R0
PutsLoop
156
Cortex-M3 10
CM3
Uart0InitializePutcPutcPuts
16
PutHex ; 16
; R0=
PUSH {R0-R3,LR}
MOV R3, R0 ; R0R3R0Putc
MOV R0, #0 ; 0x
BL Putc
MOV R0, #x
BL Putc
MOV R1, #8 ;
MOV R2, #28 ;
PutHexLoop
ROR R3, R2 ; 284
157
Cortex-M3 10
0x7B(123)321
Puts
C
PutDec ; 10
; R0=
; 320xffff_ffff101011
PUSH {R0-R5, LR} ;
MOV R3, SP ; R3
SUB SP, SP, #12 ; 11
MOV R1, #0 ; NULL
STRB R1, [R3, #-1]! ; NULL
;
158
Cortex-M3 10
10.6
/
0x2000_0000(SRAM)
$> armlink --rw_base 0x20000000 --ro_base 0x0 --map -o test1.elf test1.o
10.7
159
Cortex-M3 10
DeviceALockedR/WA
A
ADeviceALocked1A
ADeviceALockedA
A
1DeviceALocked1
22
A2A11
AAA
AA
DeviceALocked5STREX
#1#2STREX#1
STREX11A
10.3
10.3
STREX
LockDeviceA
; A
; R0=0R0=1
; DeviceALocked1
160
Cortex-M3 10
PRIMASK
CM3
10.8
locked transfers
CM3C
--
10.4
161
Cortex-M3 10
10.4
10.4
10.9
4UBFXTBB/TBH
162
Cortex-M3 10
10.5
DecodeA
LDR R0,=A ; A
LDR R0, [R0]
UBFX R1, R0, #6, #2 ; R1=R0[7:6]
TBB [PC, R1]
BrTable1
DCB ((P0 -BrTable1)/2) ; A[7:6] = 00 P0
DCB ((DecodeA1-BrTable1)/2) ; A[7:6] = 01 DecodeA1
DCB ((P1 -BrTable1)/2) ; A[7:6] = 10 P1
DCB ((DecodeA2-BrTable1)/2) ; A[7:6] = 10 DecodeA2
DecodeA1
UBFX R1, R0, #3, #2 ; R1=R0[4:3]
TBB [PC, R1]
BrTable2
DCB ((P2 -BrTable2)/2) ; A[4:3] = 00 P2
DCB ((P3 -BrTable2)/2) ; A[4:3] = 01 P3
DCB ((P4 -BrTable2)/2) ; A[4:3] = 10 P4
DCB ((P4 -BrTable2)/2) ; A[4:3] = 11 P4
DecodeA2
TST R0, #4 ; UBFX
BEQ P5
B P6
P0 ... ; P0
P1 ... ; P1
P2 ... ; P2
P3 ... ; P3
P4 ... ; P4
P5 ... ; P5
P6 ... ; P6
Cswitch
TBH
163
Cortex-M3 10
164
Cortex-M3 11
11
/
SVC
SVC
C SVC
11.1
CM3 NVIC
/ NVIC
11.1.1
MSP
MSP
8 32 ISR
CM3 SP SP
SRAM
11.1
165
Cortex-M3 11
10.1
10.1
11.1.2
ROM
fault NMI SVC
166
Cortex-M3 11
; IRQ=+16
; R0=
; R1=
PUSH {R2, LR}
LDR R2, =0xE000ED08 ;
LDR R2, [R2] ;
STR R1, [R2, R0, LSL #2] ; VectTblOffset+ExcpType*4
; ExcpType*4
POP {R2, PC} ; Return
11.1.3
0NMIfault
-2-1
; IRQ #40xC0
LDR R0, =0xE000E400 ;
LDR R1, =0xC0 ;
STRB R1, [R0, #4] ; IRQ #4
CM338
0xFF1
RBITCLZ
;
LDR R0, =0xE000E400 ; IRQ #0
LDR R1, =0xFF
STRB R1, [R0] ; 0xFF
LDRB R1, [R0] ; 30xE0
RBIT R2, R1 ; LSB
CLZ R1, R2 ; 315
MOV R2, #8
SUB R2, R2, R1 ;
MOV R1, #0x0
STRB R1, [R0] ;
3
0x00, 0x20, 0x40, 0x60, 0x80, 0xA0, 0xC00xE0CM3
3
faults
NMI
11.1.4
1. RAMRAM
167
Cortex-M3 11
(DSB)4
2.
UART
NVIC(SETENA/CLRENA)
10
--
SETENACLRENA
1.
; IRQ
EnableIRQ
; R0=
PUSH {R0-R2, LR}
AND.W R1, R0, #0x1F ; IRQ
MOV R2, #1
LSL R2, R2, R1 ; = (0x1 << (N & 0x1F))
AND.W R1, R0, #0xE0 ; IRQ>31
LSR R1, R1, #3 ; = (N/32)*4IRQ
LDR R0, =0xE000E100 ; SETENA
STR R2, [R0, R1] ;
POP {R0-R2, PC} ;
2.
DisableIRQ
; R0=
PUSH {R0-R2, LR}
AND.W R1, R0, #0x1F ; IRQ
MOV R2, #1
LSL R2, R2, R1 ; = (0x1 << (N & 0x1F))
AND.W R1, R0, #0xE0 ; IRQ>31
LSR R1, R1, #3 ; = (N/32)*4IRQ
LDR R0, =0xE000E180 ; CLRENA
STR R2, [R0, R1] ;
POP {R0-R2, PC} ;
NVIC
NVIC//
/--
168
Cortex-M3 11
11.2 /
CM3CARM7
CM3
ISR
irq1_handler
;
...
; IRQ
...
;
BX LR
ISRR4-R11CM3
PUSH
irq1_handler
PUSH {R4-R11, LR} ;
;
...
; IRQ
...
;
POP {R4-R11, PC}
POPPOP
ISR
ARM7 []
CM3
NVIC
NVIC
ISR
ARM7
11.3
NVIC8
NVICSTIR8
169
Cortex-M3 11
SVC
NVICUSERSETMPENDSTIR
DD.17
SVC
ISR
NVIC STIR
DSB
MOV R0, #SOFTWARE_INTERRUPT_NUMBER
LDR R1,=0xE000EF00 ; NVIC
STR R0, [R1] ;
DSB ;
...
USERSETMPEND
SVC
11.4
7
NMIfault
SRAMSRAM
170
Cortex-M3 11
ENTRY
Start ;
;
MOV r0, #0
MOV r1, #0
...
;
LDR r0, =0
LDR r1, =VectorTableBase
LDMIA r0!, {r2-r5} ; 4MSP, Reset, NMI, fault
STMIA r1!, {r2-r5}
DSB ;
;
LDR r0, =NVIC_VECTTBL
LDR r1, =VectorTableBase
STR r1, [r0]
...
;
LDR r0, =NVIC_AIRCR
LDR r1, =0x05FA0500 ; 52
STR R1, [r0]
; IRQ0
MOV r0, #0 ; IRQ#0
LDR r1, =Irq0_Handler
BL SetupIrqHandler
; IRQ #0
LDR r0, =NVIC_IRQPRI
LDR r1, =0xC0 ; IRQ#0
STRB r1, [r0,#0] ;
DSB ;
MOV r0, #0 ; IRQ #0
BL EnableIRQ
...
;------------------------
;
SetupIrqHandler
; R0 = IRQ
; R1 = IRQ
PUSH {R0, R2, LR}
LDR R2, =NVIC_VECTTBL ;
LDR R2, [R2]
ADD R0, #16 ; = IRQ + 16
171
Cortex-M3 11
;------------------------
AREA | Header Data|, DATA
ALIGN 4
;
VectorTableBase SPACE 256 ; 256
VectorTableEnd ; (256 / 4 = 64)
MyData1 DCD 0 ;
MyData2 DCD 0
END ;
SPACE
25664256
MyData1
0x2000_0100 MyData20x2000_0104
172
Cortex-M3 11
NVIC
NMIfault
BX LRPOP ,PC
LDMIA
LDM/STM
LDM/STMLDM/STM
NVIC
DSB
SetupIrqHandlerEnableIRQ
NVIC
DisableIRQSETENACLRENA
11.5 SVC
SVCOSAPIOSAPI
SVC8
SVC 3 ;3
3SVCSVCSVCSVC
811.2
11.2 SVC
173
Cortex-M3 11
svc_handler
TST LR, #0x4 ; EXC_RETURN2
ITE EQ ; 0,
MRSEQ R0, MSP ; MSP
MRSNE R0, PSP ; , MSP
LDR R1, [R0,#24] ; PC
LDRB R0, [R1,#-2] ; SVCR0
; PCLR(EXC_RETURN)OS
BX LR ; OS
OSTBB/TBH
OS
SVCSVCSVC
BL
11.6 SVC
BL
OS
OSSVC
SVC
174
Cortex-M3 11
svc_handler
;
TST LR, #0x4 ; EXC_RETURN2
ITE EQ ; 0,
MRSEQ R0, MSP ; MSP
MRSNE R0, PSP ; , MSP
LDR R0, [R1,#0] ; R0
LDR R1, [R1,#24] ; PC
LDRB R1, [R1,#-2] ; SVC8
; R0R1
PUSH {LR} ; LRBL
CBNZ R1, svc_handler_1
BL Puts ; Puts
B svc_handler_end
svc_handler_1
CMP R1, #1
BNE svc_handler_2
BL Putc ; Putc
B svc_handler_end
svc_handler_2
CMP R1, #2
BNE svc_handler_3
BL PutHex ; PutHex
B svc_handler_end
svc_handler_3
CMP R1, #3
BNE svc_handler_4
BL PutDec ; PutDec
B svc_handler_end
svc_handler_4
B error ;
...
svc_handler_end
POP {PC} ; Return
3R0R1-R3
svc_handler
R0-R3
SVC
+SVCR0-R3
175
Cortex-M3 11
1. R0SVC
2. CM3SVCxPSR, PC, LR, R12, R3-R0
3.
4.
5. SVCR0
R0-R3
LDR/STR
SetupIrqhandler SetupExcpHandler
SetupIrqHander3
SetupExcpHandler
31
CM3
CLZRBIT
both
uC/OS-II256
11.7 C SVC
SVC
SVCSVCC
ARM(armcc)(armasm)RVDSKeil RVMDK
// R0SVC
__asm void svc_handler_wrapper(void)
{
IMPORT svc_handler
TST LR, #4
ITE EQ
MRSEQ R0, MSP
MRSNE R0, PSP
B svc_handler
}
// BX LRsvc_handler
SVCCR0
R0-R3
176
Cortex-M3 11
CC
// CSVCpwdSF
// pwdSF[0] = R0 , pwdSF[1] = R1
// pwdSF[2] = R2 , pwdSF[3] = R3
// pwdSF[4] = R12, pwdSF[5] = LR
// pwdSF[6] = PC
// pwdSF[7] = xPSR
unsigned long svc_handler(unsigned int* pwdSF)
{
unsigned int svc_number;
unsigned int svc_r0;
unsigned int svc_r1;
unsigned int svc_r2;
unsigned int svc_r3;
int retVal; //
svc_number = ((char *) pwdSF[6])[-2]; // C
svc_r0 = ((unsigned long) pwdSF[0]);
svc_r1 = ((unsigned long) pwdSF[1]);
svc_r2 = ((unsigned long) pwdSF[2]);
svc_r3 = ((unsigned long) pwdSF[3]);
printf (SVC number = %xn, svc_number);
printf (SVC parameter 0 = %x\n, svc_r0);
printf (SVC parameter 1 = %x\n, svc_r1);
printf (SVC parameter 2 = %x\n, svc_r2);
printf (SVC parameter 3 = %x\n, svc_r3);
//retVal
pwdSF[0]=retVal;
return 0;
}
0
retVal
SVCCunsigned int func(),
return xx;ARMR0
R0return
R0pwdSF[0]=retVal
return xx
C//
177
Cortex-M3 11
RVDSKeil RVMDK__svc
34
unsigned long __svc(0x03) CallSvc3(unsigned long svc_r0, unsigned long
svc_r1, unsigned long svc_r2, unsigned long svc_r3);
CSVC
int Func(void)
{
unsigned long p0, p1, p2, p3; //SVC4
unsigned long svcRet; //
. . .
svcRet=CallSvc3(p0, p1, p2, p3); // 34p1,p2,p3,p4
svcRet
. . .
return;
}
__svcRVCT 3.0 Compiler and Library Guide(Ref6)
GNU__svcGCC
3R0
SVC
int MyDataIn 0x123;
__asm __volatile (mov R0, %0\n
svc 3 \n : : r (MyDataIn) );
r(MyDataIn)
178
Cortex-M3 12
12
12.1
CM3 v7-M
/(kernel)
MPU
CM3 CM3
MSP
MSP
PSP
SysTick
PSP
MSP MPU MSP
12.1 SRAM MPU regions
CM3
SP regions
179
Cortex-M3 12
12.1 /
0 MSP
;
BL MpuSetup ; MPU regions
LDR R0, =PSP_TOP ;
MSR PSP, R0 ;
BL SystickSetup ; SysTickSysTickOS
MOV R0, #0x3 ; CONTROLPSP
MSR CONTROL,R0 ;
B UserAppStart ;
C C C
Cortex-M3 TRM
Ref1 SVC ISR EXC_RETURN
12.2 OS
180
Cortex-M3 12
EXC_RETURN
SysTick
12.3
12.3 SysTick
PendSV
MSP CM3 MSP process
stack MSP
; MSP
MpuSetup(); // MPU regions
SystickSetup(); // SysTick
SwitchStackPointer(); // PSP
12.2
AAPCS primitive
1,2,4 8 CM3 NVIC
STKALIGN D D.17
181
Cortex-M3 12
CM3 1 0
AAPCS C
2 C
double, long long / INT64
12.3
CM3 handler
NVIC NONBASETHRDENA
0
CM3
redirect_handler
PUSH {LR}
SVC #0 ;
BL User_IRQ_Handler
SVC #1 ;
POP {PC} ;
182
Cortex-M3 12
+PSP
SVC #0 8
PSP EXC_RETURN.+PSP
SVC #1 PSP EXC_RETURN
redirect_handler
5
12.4 SVC
svc_handler
;
TST LR, #0x4 ; EXC_RETURN.2
ITE EQ ;
MRSEQ R0, MSP ; MSPR0
MRSNE R0, PSP ; PSPR0
LDR R1, [R0, #24] ;
LDRB R0, [R1, #-2] ; 8
CBZ r0, svc_service_0
CMP r0, #1
BEQ svc_service_1
B.W Unknown_SVC_Request
svc_service_0 ; 0+PSP
MRS R0, PSP ; PSP
SUB R0, R0, #0x20 ; 328
MSR PSP, R0 ; PSP
MOV R1, #8*4 ; R18
svc_service_0_copy_loop
SUBS R1, R1, #1*4
LDR R2, [SP, R1]
STR R2, [R0, R1]
CMP R1, #0
BNE svc_service_0_copy_loop
svc_service_1 ; 1+PSPhandler
MRS R0, PSP ; PSPR0
LDR R1, [R0, #0x18] ; PSPsvc #1
; POP {PC}
STR R1, [SP, #0x18] ; handlerMSP
ADD R0, R0, #0x20 ; PSP
MSR PSP, R0 ; PSP
183
Cortex-M3 12
12.4
12.4
PSPSVC0IRQ
PSPsvc #1
IRQPSPPSP
MSPMSP
MSPPSP
184
Cortex-M3 12
12.4
CM3
MCU/SoC
32
I-CodeSystemD-Code
(I-Code)
(System)RAM
SRAMCodeD-Code
SRAM
CM3
ARMALIGNGNU AS
LDR/STRLSL
/
LDM/STMLDM/STM14LDM
14LDR
if then
IF-THENITxxxIT4
ThumbThumb-2
Thumb-2
CM3ARMv6
RBITCLZ
12.5 (Lockup)
faultfault
faultfaultfault
CM3
-mission-critical
185
Cortex-M3 12
12.5.1
PC0xFFFF_FFFx
CM3LOCKUP
faultfaultsfault
NMIfaults
MSPPCfault
faultNMINMI
-1NMINMI-2
haltPC
-
NMIfault/fault
fault12.5
12.5.2
NMI
fault
NMI
NMI
faultSP
fault
hard_fault_handler
PUSH {R4-R7,LR} ;
...
faultfaultfault
186
Cortex-M3 12
SPNMI
I/O
R0-R3R12
faultNMIPendSV
PendSV
NMI/faultSVCSVC
NMIfaultfault
NMI/fault
SVC
SVC
187
Cortex-M3 12
188
Cortex-M3 13
13
Cortex-M3
SysTick
CM3
13.1 SysTick
8 NVIC SysTick SysTick
24 0 RELOAD
SysTick 13.1 SysTick
13.1 SysTick
SysTick 1 0 COUNTFLAG
SysTick STCSR
SysTick STCVR
SysTick OS
189
Cortex-M3 13
SysTick STCSR.TICKINT
SRAM SysTick
; SysTick
MOV R0, #0xF ; 15
LDR R1, =systick_handler ;
LDR R2, =0xE000ED08 ;
LDR R2, [R2] ;
STR R1, [R2, R0, LSL #2] ;
SysTick
; SysTickSysTick
LDR R0, =0xE000E010 ; STCSR
MOV R1, #0
STR R1, [R0] ; SysTick
LDR R1, =0x3FF ; SysTick10241023
; 010240x3FF
STR R1, [R0,#4] ;
STR R1, [R0,#8] ; STCVRCOUNTFLAG
MOV R1, #0x7 ; FCLKSysTick
STR R1, [R0] ;
SysTick 10ms (TENMS )
CM3 24 10ms
STCR TENMS
SysTick 300
SysTick
SysTick CURRENT RELOAD 300
190
Cortex-M3 13
WaitLoop
LDR R5, [R4] ;
CMP R5, #0
BEQ WaitLoop
... ; SysTickFired
SetupExcpHandler RAM
SetupExcpHandler
; R0 =
; R1 =
PUSH {R0, R2, LR}
LDR R2, =NVIC_VECTTBL
LDR R2, [R2] ;
STR.W R1, [R2, R0, LSL #2] ; [R2+R0<<2]
POP {R0, R2, PC} ;
0 300-12 CURRENT12
13.2
CM3
FCLK SysTick
CM3 SLEEPING
191
Cortex-M3 13
CM3 SLEEPDEEP
NVIC
13.1 CM3
13.1 0xE000_ED10
4 SEVONPEND RW - WFE
CM3 WFE
3 - - -
2 SLEEPDEEP R/W 0 SLEEPDEEP
1 SLEEPONEXIT R/W - SleepOnExit
0 - - -
WFI/WFE CM3 CM3
sleep/slpWFI Wait-For-Interrupt WFE Wait-For-Event
event RXEV
event
WFE 13.2
13.2
SRAM STM32
WFI/WFE
WFI
WFI BASEPRI
ISR PRIMASK ISR
WFE SETONPEND
ISR WFI
192
Cortex-M3 13
PRIMASK=0SEVONPEND=0 BASEPRI + +
PRIMASK=0SEVONPEND=0 BASEPRI
PRIMASK=0SEVONPEND=1 BASEPRI + +
+
PRIMASK=0SEVONPEND=1 BASEPRI
PRIMASK=1SEVONPEND=0 BASEPRI +
PRIMASK=1SEVONPEND=0 BASEPRI
PRIMASK=1SEVONPEND=1 BASEPRI +
+
PRIMASK=1SEVONPEND=1 BASEPRI
1. PRIMASK=0 ISR
2. WFE SEVONPEND=1
3. PRIMASK BASEPRI
4. PRIMASK=0
CM3 SleepOnExit
SLEEPONEXIT 13.3
193
Cortex-M3 13
13.3 SleepOnExit
13.3
CM3
TXEVTransmit Event
RXEVReceive Event
13.4
13.4
WFE RXEV CM3
SEV Send EVent TXEV
13.5
194
Cortex-M3 13
13.5
WFE
WFE 13.6
195
Cortex-M3 13
13.6 WFE
WFE
WFE
13.3.1
13.6 WFE
WFE WFE
WFE
spin lock Linux
RTOS
RTOS spin_lock() spin_unlock():Linux
196
Cortex-M3 13
spin_lock ; r0
MOVS r2, #1 ; r2
spin_lock_loop
LDREX r1, [r0]
CMP r1, #0
BNE spin_lock_loop ;
STREX r1, r2, [r0] ; STREX Lock_Variable 1
CMP r1, #0 ; STREX
BNE spin_lock_loop ; STREX
DMB ;
BX LR ;
spin_unlock ; r0
MOVS r1, #0
DMB ;DMB
STR r1, [r0] ; Clear lock
DMB ;
BX LR ;
WFE/SEV
WFE
SEV
spin_lock_with_WFE ; WFE r0
MOVS r2, #1 ; r2
spin_lock_loop
LDREX r1, [r0]
CBNZ r1, lock_is_set ; r1!=0
STREX r1, r2, [r0] ; STREX Lock_Variable 1
CMP r1, #0 ; STREX
BNE spin_lock_loop ; STREX
DMB ;
BX LR ;
lock_is_set
WFE ; SEV
B spin_lock_loop ; SEV
SEV
spin_unlock_with_SEV ; r0
MOVS r1, #0
DMB ;DMB
197
Cortex-M3 13
WFE WFE
spin_unlock_with_SEV
RTOS
CPU 100%
CM3 RXEV
Cortex-M3 r2p0
SLEEPONEXIT CM3 WFI/WFE
WFI/WFE
SLEEPONEXIT
Cortex-M3 2 2008
WFI/WFE
2
cells
SysTick 2
13.4
CM3 CM3
NVIC (AIRCR)
VECTRESET 0
LDR R0, =0xE000ED0C ; NVIC AIRCR address
LDR R1, =0x05FA0001 ; VECTRESET0x05FA
STR R1, [R0] ;
deadloop
198
Cortex-M3 13
B deadloop ;
CM3
CM3
SYSRESETREQ
CM3
CM3
STM32
SYSRESETREQ
LDR R0, =0xE000ED0C ; NVIC AIRCR address
LDR R1, =0x05FA0004 ; SYSRESETREQ0x05FA
STR R1, [R0] ;
deadloop
B deadloop ;
SYSRESETREQ CM3
(SYSRESETn)SYSRESETREQ
SYSRESETREQ
FAULTMASK
199
Cortex-M3 13
200
Cortex-M3 14
14
MPU
MPUCM3CM3
MPU
MPU
MPU
MPU
14.0
MPU
1 C
unsigned int
bug
C C
C Super StarC
C
[]
C
bug 0
u r my super star
201
Cortex-M3 14
C
C C C
C
2-
/
MPU
MPU
14.1 MPU
Cortex-M3MPU
MPU
MPUMPUMPU
MPUregions
MPUregionregion
CM3MPU8regions
regionregion
regionMPU
MPUregion
MemManage fault
MPUregionsregion
region1region4region4region
14.2 MPU
MPU
202
Cortex-M3 14
Cortex-M3 TRM
MPUMPUTR14.1
23:16 IREGION R 0 MPU region ARMv7-M
MPU
15:8 DREGION R 0 MPU MPU 8,
0 SEPARATE R 0
DREGIONMPU
MPUMPUCR14.2
2 PRIVDEFENA RW 0
203
Cortex-M3 14
region
1= region
0= region
region fault
1 HFNMIENA RW 0 1= NMI fault MPU
0= NMI fault MPU
0 ENABLE RW 0 MPU
PRIVDEFENAregionMPU
regionMPU
regionregionregion
PRIVDEFENA14.1
14.1 PRIVDEFENA
ENABLE
regionMemManage fault
MPUMPUMPU
MPU(system
partition)
SCS
When the MPU is enabled, only the system partition and vector table loads are always
accessible.
regionMPUregionregionMPU
region(MPURNR)14.3
204
Cortex-M3 14
7:0 REGION RW - region 8
region[2:0]
regionregion
regionsMPU region(MPURBAR)
VALIDREGIONMPURNRMPURBAR14.4
31:N ADDR RW - Region N region
MPU region
SZENABLE ADDR
4 VALID RW - REGION
1=MPU regionREGION
0=MPU region
3:0 REGION RW - MPU region
regionregion
64KB64KB0x0001,00000x0002,0000
160
REGIONregionVALID0VALID=1
REGION=nregionMPU region
regionMPU
14.5
205
Cortex-M3 14
31:29 3 -
28 1 XN 1=
2=
27 1 -
26:24 3 AP
0b000
0b001 RW OS
0b010 RW RO
0b011 RW RW
0b100 n/a n/a n/a
0b101 RO OS
0b110 RO RO
0b111 RO RO
23:22 2
21:19 3 TEX
18 1 S Sharable
1=
0=
17 1 C Cachable
1=
0=
16 1 B Buffable
1=
0=
15:8 8 SRD regionSRDregion
128region8region
128regionRegion
7:6 2 -
5:1 5 REGIONSIZE Region1<<(REGIONSIZE+1)32
0 1 SZENABLE 1=region 0=region
region[15:8]8region
regionregionregion
region8regionregionregion
regionregionSRD8
regionSRD.3=03regionregion
regionregionfault
region256128regionregion
206
Cortex-M3 14
APAP
[28]XNeXecute Neverregion
MemManage fault
TEX, S, BC[21:16]CM3
(cache)CM3v7-Mv7-ML2
v7-M
v6ARMx86
(policy)
14.6 TEX,C,B
TEX C B
000 0 0
000 0 1
000 1 0 allocate S
000 1 1 allocate S
001 0 0 S
001 0 1 n/a n/a n/a
001 1 0
001 1 1 allocate S
010 1 x
010 0 1 n/a n/a n/a
010 1 x n/a n/a n/a
1BB A A BB=, AA= S
TEXMSB=1regionCB
AATEX[1:0]BBAA
BB
14.7
Cortex-M3 TRM
207
Cortex-M3 14
9.2.3 (alias)MPU
STMregions
43
(STM)1-4region
region/region/retgion
4region
; R1 = RTOS4region8
MOV R0, #NVIC_BASE
ADD R0, #MPU_REG_CTRL
LDM R1, [R2-R9] ; 4region
STM R0, [R2-R9] ; 4region
regionsregion
C/C++memcpy()CRT
memcpy()long* char*,
short*
14.3 MPU
MPU
MPUregions
OS
data_stack
data_stack
SRAM
NVICMPU
UARTADC
CM3regionTEX=0C=1B=1NVIC
strongly orderedregionsTEX=0, C=0, B=1
regionfaultregionTEX=0, C=0, B=0
14.2MPUMPURAM
MemManage faultNVIChandlerSHCSR
MemManage faultMPUMemManage fault
208
Cortex-M3 14
14.2 MPU
4region
LDR R0, =0xE000ED98 ; Region
MOV R1, #0 ; region 0
STR R1, [R0]
LDR R1, =0x00000000 ; = 0x00000000
STR R1, [R0, #4] ; MPU Region
LDR R1, =0x0307002F ; R/W, TEX=0,S=1,C=1,B=1, 16MB, Enable=1
STR R1, [R0, #8] ; MPU Region
MOV R1, #1 ; region 1
STR R1, [R0]
209
Cortex-M3 14
210
Cortex-M3 14
ALIGN 4 ;
MPUconfigTab ; LDM/STM
MpuSetup ; MPU
PUSH {R0-R6,LR}
LDR R0, =0xE000ED94 ; MPU
MOV R1, #0
STR R1, [R0] ; MPU
; --- Region #0 ---
LDR R0, =0x00000000 ; Region 0: = 0x00000000
211
Cortex-M3 14
MpuRegionSetup
; MPU region
; :
; R0 =
; R1 = Region
; R2 =
; R3 = AP ()
; R4 = MemAttrib ({TEX[2:0], S, C, B})
; R5 = region
; R6 = {XN,Enable}
MpuRegionDisable
; region
; R0 = region
PUSH {R1, LR}
AND R0, R0, #0xF ; region4
ORR R0, R0, #0x10 ; VALID
LDR R1, =0xE000ED9C ; MPU Region
STR R0, [R1] ;
MOV R0, #0
LDR R1, =0xE000EDA0 ; MPU Region
STR R0, [R1] ;
POP {R1, PC} ;
regionregion
14.4 MPU
MPUMPU
regionsregions
1. region
a)
b)
2. SRAM region
a)
b)
c)
d)
3.
a)
b)
c)
d)
4. NVIC
a)
11regionMPU8
region14.1regionsregion
PRIVDEFENA=1regions53
RAMregions
RAM
14.4.1 region
213
Cortex-M3 14
regions
regionregion
regionregion
8region
3region
regionregionregion14.3
14.3 regionSRDregions
regions
region0
MOV R5, #0x64 ; Region 1: region 2, 5, 6
MpuSetup ; MPU
PUSH {R0-R6,LR}
LDR R0, =0xE000ED94 ; MPU
MOV R1, #0
STR R1, [R0] ; MPU
; --- Region #0 ---
LDR R0, =0x00004000 ; Region 0: = 0x00004000
214
Cortex-M3 14
215
Cortex-M3 14
216
Cortex-M3 14
14.8 regions
MPU region
C,B,A,S,XN
0000_0000 16KB RO C,-,A,-,-
0000_3FFF
0000_4000 16KB RO C,-,A,-,- Region #0
0000_7FFF
2000_0000 4KB RW C,B,A,-,- Region #1
2000_0FFF
2000_1000 4KB C,B,A,-,-
2000_1FFF RW
2200_0000 128KB RW C,B,A,-,- Region #2
2001_FFFF
2202_0000 128KB C,B,A,-,-
2203_FFFF RW
4000_0000 1MB RW -,B,-,-,XN Region #3
400F_FFFF
4004_0000 128KB -,B,-,-,XN
4005_FFFF RW Region #3
region 2
400A_0000 128KB -,B,-,-,XN
400B_FFFF RW Region #3
region 5
400C_0000 128KB -,B,-,-,XN
400D_FFFF RW Region #3
region 6
4200_0000 32MB RW -,B,-,-,XN Region #4
43FF_FFFF
4280_0000 4MB -,B,-,-,XN
42BF_FFFF RW Region #4
region 2
4340_0000 4MB -,B,-,-,XN
437F_FFFF RW Region #4
region 5
4380_0000 4MB -,B,-,-,XN
43BF_FFFF RW Region #4
region 6
6000_0000 16MB RW C,B,A,-,- Region #5 RAM
60FF_FFFF
E000_0000 1MB -,-,-,-,XN NVIC,
E00F_FFFF
217
Cortex-M3 14
218
Cortex-M3 15
15
CoreSight
Cortex-M3
15.1
JTAG AVR
bug
CM3
CM3
CM3
a)
b)
c) BKPT
d)
e)
f)
g) ROM (flash patching)
h)
i) ETM
j)
k) ITM
l) profiling
219
Cortex-M3 15
15.2 CoreSight
CoreSight
CoreSight Technology System Design Guide(Ref3)
CoreSight Cortex-M3 TRM CM3
15.2.1
CM3 ARM7/ARM9 CoreSight
ARM JTAG CM3
(DAP)
DAP AMBA APB CM3 JTAG DAP
DAP
CM3 DAP APB
CM3 JTAG
4 SW
15.2.2 DP AP DAP
CM3 15.1
DP SWJ-DP SW-DP 32
DAP SWJ-DP SW JTAG SW-DP SW
CoreSight JTAG-DP JTAG DAP
220
Cortex-M3 15
32 8 DAP 256
CM3
255 AP
DAP
15.1 Cortex-M3
DAP CM3 AHB-AP AP
DAP AHB CM3
CM3 NVIC
CoreSight AP APB-AP
JTAG-APAPB-AP APB JTAG-AP
JTAG ARM7
15.2.3
CoreSight CM3 3
1. ETM
2. DWT
ATB
CoreSight SoC
ATB merger ATB CoreSight
ATB funnel TPIU TPIU
PC PC
15.2.4 CoreSight
CoreSight
221
Cortex-M3 15
JTAG
TAP
PC
CM3 CoreSight
CM3 CM3 ATB 8 CoreSight
32
CM3 TrustZoneARM
CoreSight
CoreSight 15.2
15.2 CoreSight
CM3 15.3
222
Cortex-M3 15
15.3 Cortex-M3
CM3 CoreSight
CoreSight CoreSight CoreSight
CM3 CoreSight TPIU
CM3
15.3
CM3 halt
debug monitor exception
12
1.
SysTick
2.
12
SysTick
223
Cortex-M3 15
31:15 KEY W -
A05F
25 S_RESET_ST R -
24 S_RETIRE_ST R -
19 S_LOCKUP R - 1=
18 S_SLEEP R - 1=
17 S_HALT R - 1=
16 S_REGRDY R - 1=
15:6 - -
5 C_SNAPSTALL RW 0* stalled
4 - -
3 C_MASKINTS RW 0*
2 C_STEP RW 0* C_DEBUGEN=1
1 C_HALT RW 0* C_DEBUGEN=1
0 C_DEBUGEN RW 0*
*DHCSR NVIC
DHCSR
NVIC NVIC
DEMCR 15.2
24 TRCENA RW 0* DWT,ETM,ITM TPIU
23:20
19 MON_REQ RW 0 1=
18 MON_STEP RW 0 MON_EN=1
17 MON_PEND RW 0
16 MON_EN RW 0
15:11
10 VC_HARDERR RW 0* fault
9 VC_INTERR RW 0* /
8 VC_BUSERR RW 0* fault
7 VC_STATERR RW 0* fault
6 VC_CHKERR RW 0* fault
5 VC_NOCPERR RW 0* fault
4 VC_MMERR RW 0* fault
3:1
224
Cortex-M3 15
0 VC_CORERESET RW 0*
*DEMCR NVIC
TRCENA
Vector Catch, VCVC
VC
TRCENA VC
15.4
CM3 both
15.4
15.4
225
Cortex-M3 15
CM3 EDBGREQ
/SoC
C_HALT
15.5
15.5
15.5 Cortex-M3
CM3
FPB
BKPT #im816Thumb0xBExx8
#im8C_DBGEN
NMI
226
Cortex-M3 15
faultBKPT
BKPTBKPT
BKPT
BKPTBKPTBKPT
BKPT
()
BKPTC_DEBUGENMON_EN0
faultfault(HFSR)DEBUGEVT1fault
DFSRBKPT1
FPB6
FPB
BKPTFPB
15.6
NVIC
DCRSRDCRDR15.315.4
15.3 DCRSR0xE00_EDF4
16 REGWnR W - 1=
0=
15:5 - - -
4:0 REGSEL W - 00000= R0
00001=R1
01111=R15
10000=xPSR
10001=MSP
10010=PSP
10100=
[31:24]: CONTROL
[23:16]: FAULTMASK
[15:8]: BASEPRI
[7:0]: PRIMASK
15.4 DCRDR0xE00_EDF8
31:0 DATA R/W -
227
Cortex-M3 15
DCRSR
1.
2. DCRSR160
3. DHCSR.S_REGRDY=1
4. DCRDR
1.
2. DCRDR
3. DCRSR161
4. DHCSR.S_REGRDY=1
DCRSRDCRDR
DCRDRsemihosting
printfputc()putc()
DCRDR
ITM
15.7
NVIC
NVICCM3
faultCM3DFSR
VECTRESETNVIC
0xE000_ED0C
C_MASKINTS0xE000_EDF0
Stalledstall
C_SNAPSTALL
228
Cortex-M3 16
16
(DWT)
(ITM)
(ETM)
(TPIU)
(FPB)
AHB
ROM
16.1
CM3
w
Cortex-M3 Technical Reference Manual(Ref1)
FPB CM3
ITM stimulus
16.1.1 Cortex-M3
CM3 CoreSight
ATB TPIUTPIU
TPA 16.1
16.1 Cortex-M3
CM3 3 ETM, ITM DWTETM
CM3 7 ID ATID
229
Cortex-M3 16
ATID
CoreSight CM3 ATB
CoreSight ATB
ATB funnel
DEMCR.TRCENA 15.2 D.37
TRCENA
16.2 (DWT)
DWT
1. 4
a)
b) ETM ETM
c) PC
d)
e) CYCCNT
2. DWT
a) CYCCNT
b) Folded
c) /LSU
d)
e) CPI
f) overhead
3. PC
4.
ETM PC
3
COMP
MASK
FUNCTION
COMP 32 MASK
16.1
16.1 MASK
MASK
1 [0]
230
Cortex-M3 16
2 [1:0]
3 [2:0]
15 [14:0]
FUNCTION
MASK COMP RUNCTION FUNCTION
FUNCTION
DWT profiling
CYCCNT
CPU
16.3 ITM
ITM
ITM stimulus
DWT ITM
ITM
ITM TPIU
ITM TPIU NVIC
UART
ITM DEMCR.TRCENA ITM
ITM ITM 0xC5AC_CE55
CoreSight ACCESS ITM
ITM ITM
16.3.1 ITM
ITM printf ITM 32
(stimulus)
/
TPIU
TRCENA ITM
231
Cortex-M3 16
live
16.3.3 ITM
ITM ITM FIFO ITM
16.4
ETM
CM3 ETM FIFO
ETM
232
Cortex-M3 16
5. ETM
16.5 TPIU
ITM, DWT ETM TPIU TPIU
CM3 TPIU
(Clocked mode)4
SWVSWVCM3
TPIU
SWVSWV
TPIUDECMR.TRCENA
Cortex-M3 r2p0
SWV SWV 1
SWV
TDO JTAG
DWT ITM
16.6 FPB
FPB
(literal data)SRAM
FPB8
6
2
233
Cortex-M3 16
LDR R0, =0xE000E400
32
PC
LDR R0, [PC, #<immed_8>*4]
; immed_8 = ( PC)/4
...
;
...
DCD 0xE000E400
...
LDRThumb-232
FPBFPB
1
SRAM
REMAPREMAP3[31:29]
0b0010x2000_0000-0x3FFF_FF80
SRAM
REMAP
... what if
ROMflash
flashSRAM
(BL)SRAMBL
234
Cortex-M3 16
ROMSRAM
16.3
16.7 AHB
AHB-APCM3SWJ-DP/SW_DP
CM3AHB-AP3
CSW
TAR
/DRW
AHB-AP16.4
235
Cortex-M3 16
16.4 Cortex-M3AHB-AP
CSW/ TAR
DRWDRW
LSB0x1002DRW[31:16]AHB-AP
AHB-APAHB-AP4bannked
CSWMasterType1AHB-AP
AHB
FIFO
16.8 ROM
CM3ROMCM3
v7-MCM3
Cortex-MCM3
ROMNVIC
ROM0xE00F_F000ROM
ID
CM3ROMNVICROM
ROM0xFFF0F003[1:0]
NVIC2NVIC
0xE00F_F000+0xFFF0_F000=0xE000_E000
ROM16.2
CoreSigthROM
16.2 Cortex-M3ROM
236
Cortex-M3 16
0xE00F_F000 0xFFF0_F003 NVIC NVIC0xE000_E000
0xE00F_F004 0xFFF0_2003 DWT DWT0xE000_1000
0xE00F_F008 0xFFF0_3003 FPB FPB 0xE000_2000
0xE00F_F00C 0xFFF0_1003 ITM ITM 0xE000_0000
0xE00F_F010 0xFFF4_1003/ TPIU TPIU 0xE004_0000
0xFFF4_1002
0xE00F_F014 0xFFF4_2003 ETM ETM 0xE004_1000
0xFFF4_2002
0xE00F_F018 0 End End-Of-Table
0xE00F_F0CC 1 MEMTYPE
0xE00F_F0D0 0 PID4 ID
0xE00F_F0D4 0 PID5 ID
0xE00F_F0D8 0 PID6 ID
0xE00F_F0DC 0 PID7 ID
0xE00F_F0E0 0 PID0 ID
0xE00F_F0E4 0 PID1 ID
0xE00F_F0E8 0 PID2 ID
0xE00F_F0EC 0 PID3 ID
0xE00F_F0F0 0 CID0 ID
0xE00F_F0F4 0 CID1 ID
0xE00F_F0F8 0 CID2 ID
0xE00F_F0FC 0 CID3 ID
(bit[1])(bit[0])
NVIC, DWTFPB1TPIUETM
CoreSight
ROM
NVIC= 0xE00F_F000 + 0xFFF0_F000 = 0xE000_E000
ROMCM3
ROMROM
237
Cortex-M3 16
238
Cortex-M3 17
17
Cortex-M3
Cortex-M3
Cortex-M3 0 1
Cortex-M3 1 2
17.1 Cortex-M3
CM3
CM3 CM3
MPU
ETM
SW, JTAG
1.
2. CM3 KB MB RAM
3. CM3 0.18um 100MHz
4. CM3 CM3
17.2 Cortex-M3 0 1
Cortex-M3 Cortex-M3 0
2006 3 CM3
1 CM3 1
1
1
CM3 Luminary ST
1 CM3 0
1
NVIC_CCR.STKALIGN
NVIC_CCR STKALIGN
1 AUXFAULT fault
239
Cortex-M3 17
DWT
ID
allocated
I-Code AHB D-Code AHB
I-Code AHB D-Code AHB
I-Code D-Code (merge)
ADK
AHB (HTM)AHB CoreSight
NVIC_ICSR.VECTPENDING NVIC_DHCSR.C_MASKINTS
C_MASKINTS VECTPENDING
JTAG-DP SWJ-DP JTAG-DP
CoreSight
0 CM3 ARM RVDS
Keil RVMDK
EABI EABI-
CM3 NVIC CPUID
revison CM3 17.1
17.1 CPUID
PartNo Revision
[31:24] [23:20] [19:16] [15:4] [3:0]
0(r0p0) 0x41 0x0 0xF 0xC23 0
1(r1p0) 0x41 0x0 0xF 0xC23 1
1 (r1p1) 0x41 0x1 0xF 0xC23 1
2(r2p0) 0x41 0x2 0xF 0xC32 0
ST STM32 r1p1
240
Cortex-M3 17
17.3 Cortex-M3 1 2
2008 Cortex-M3 2 2008
2 2
17.3.1
2
1 C
NVIC STKALIGN
0xE000_E008
2 DISFOLD R/W 0 IT (folding) IT
(execution phase)
1 DISDEFWBUF R/W 0
MPU regions
241
Cortex-M3 17
0 DISMCYCINT R/W 0
LDM, STM, 64
17.3.3 ID
NVIC ID NVIC CPUID
CPUID 0xE000_ED00
PartNo Revision
[31:24] [23:20] [19:16] [15:4] [3:0]
2 0x41 0x2 0xF 0xC23 0x0
(r2p0)
17.3.4
2
DWT
17.3.5
r2p0
CM3
WIC NVIC
CM3
2
WIC PMU
2 CM3
2
17.3.6 2
242
Cortex-M3 17
WIC
faults LDM/STM
Cortex-M3
2 2
CM3
0/1
PSR 9
STKALIGN EABI
C EABI
SysTick
CM3
SysTick RTOS
17.4
Cortex-M3
/ C C
ICEprobe
JTAG SW
DWT ITM
243
Cortex-M3 17
17.4.1 C
C 17.3
17.3 Cortex-M3
ARM Cortex-M3 RealView 3.0(RVDS)
www.arm.com RealView-ICE 1.5
ADS1.2 SDT Cortex-M3
KEIL(an ARM company) KEIL 8051
www.keil.com Realview MDK Cortrex-M3
ULINK ULINK2
CodeSourcery Cortex-M3 GNU
www.codesourcery.com www.codesourcery.com/gnu_toolchains/arm
GNU 4.0
Rowley Associates GNU C
www.rowley.co.uk www.rowley.co.uk/arm/index.htm
IAR Systems IAR Embedded Workbench for ARM and Cortex
www.iar.com C/C++ 4.40 IAR AVR
IAR JLINK
Lauterbach JTAG
www.lauterbach.com
17.4.2
OS RTOS OS
Cortex-M3 OS 17.4
244
Cortex-M3 17
17.4 Cortex-M3
FreeRTOS FreeRTOS
www.freertos.org
Express Logic ThreadX RTOS
www.expresslogic.com
Micrium uC/OS-II
www.micrium.com
Accelerated Technology Nucleus
www.acceleratedtechnology.com
Pumpkin Inc. Salvo RTOS
www.pumpkininc.com
CMX Systems CMX-RTX
www.cmx.com
KEIL ARTX-ARM
www.keil.com
Segger embOS
www.segger.com
IAR Systems IAR PowerPac for ARM
ww.iar.com
T-Engine uT-Kernel
www.t-engine.org
245
Cortex-M3 17
246
Cortex-M3 18
18
ARM7 Cortex-M3
C
18.1
CM3 ARM7TDMI
ARM7 CM3
C
18.2
CM3 ARM7
MPU
18.2.1
ARM7
4GB ARM
CM3 4GB
ROM RAM
ARM7 CM3
247
Cortex-M3 18
ARM7
SRAM CM3 NVIC
18.2.2 /
NVIC CM3
(directive)
C
CPSR CM3 CPSR PRIMASK
FAULTMASK
CM3
ARM FIQ
FIQ 4 R8-R11
FIQ push/popFIQ
CM3 FIQ FIQ
CM3 FIQ
FIQ
CM3 NVIC
ARM DAbt, IAbt, Undef 3
CM3 fault faults fault
faults faults fault fault
18.2.3 MPU
MPU CM3 ARM7TDMI
MPU ARM720T MMU
CM3 MPU MMU CM3
18.2.4
CM3
CM3 ARM7
248
Cortex-M3 18
18.2.5
ARM 7 CM3 18.1
ARM7 CM3
(supervisor) +MSP
SWI SVC
FIQ
IRQ
(IAbt) fault
(DAbt) fault
fault
+PSP
+PSP
CM3 ARM7 FIQ FIQ
ARM7 R8-R11 CM3 R0-R3,R12 FIQ
R0-R3,R12 R8-R11
18.3
ARM Thumb
18.3.1 Thumb
thumb
thumb CM3
ARM BLX
SWI SVC
CM3 push pop
249
Cortex-M3 18
18.3.2 ARM
ARM
ARM7 0 CM3
MSP
ARM7
SPLR SPSRCM3
CM3 ARM7 Thumb
ARM7 CPSR.I CM3
PRIMASK FAULTMASKCM3 FIQ F
CM3
ARM7
FIQ CM3
ISR ARM7 S PC
CM3 EXC_RETURN PC
CM3 MOVS SUBS
ARM7 IRQ CM3
FIQ ARM7 FIQ R8-R12 CM3 R0-R3R12
FIQ R8-R11 R8-R11
R0-R3
(SWI)SWI SVC
CM3 SVC ARM7
LR
SWP CM3 SWP
SWP
CPSR SPSR ARM7 CPSR CM3 xPSR SPSR
APSR
xPSR ARM7 SPSR CM3
SPSR
ARM7 Thumb-2
CM3 IF-THEN
IT
/
PC ARM7 PC PC +8
250
Cortex-M3 18
ARM7 PC PC
CM3 CM3 Thumb
PC 4
R13 R13 32 CM3 2 0
R13 2
18.4 C
C
C
RVDS C
RVDS 3.0
__irq ARM7 CM3
__irq RVDS 3.0 RVCT 3.0
__irq CM3__irq
18.5
CM3
CM3
KeilMDK/GCC
18.6
CM3
32 Thumb-2 16 thumb
Thumb-2
16 Thumb
CM3 64
Thumb-2 12 Thumb
Thumb-2
Thumb Thumb-2
251
Cortex-M3 18
BOOL
BOOL 1/32
IT IT
ARM/Thumb Thumb
ARM CM3
Thumb-2
overhead
252
Cortex-M3 19
19
GNU Cortex-M3
GNU
GNU C
19.1
GNU ARM ARM GNU
CM3 GNU CodeSourcery
(www.codesourcery.com) GNU C CM3 2008 3 31
GNU Cortex-M3 WinARM
GNU
GNU GNU AS ARM
the like ARM RealView GNU
19.2 GNU
GNU www.codesourcery.com/gnu_toolchains/arm/
EABI[]OS
WindowsLinux
EABI
19.2.1
ARM GNU
C 19.1
253
Cortex-M3 19
19.1 GNU
19.3
GNU
19.3.1 1
10 GCC 10+9+8++1
255
Cortex-M3 19
00000000 <_start>:
0: 0800 lsrs r0, r0, #32
2: 2000 movs r0, #0
4: 0009 lsls r1, r1, #0
...
00000008 <start>:
8: 200a movs r0, #10
a: 2100 movs r1, #0
0000000c <loop>:
c: 1809 adds r1, r1, r0
e: 3801 subs r0, #1
10: d1fc bne.n c <loop>
00000012 <deadloop>:
12: e7fe b.n 12 <deadloop>
19.3.2 2
example2a.s example2b.s
.global
========== example2a.s ==========
/* */
.equ STACK_TOP, 0x20000800
.global vectors_table
.global start
.global nmi_handler
.code 16
.syntax unified
vectors_table:
.word STACK_TOP, start, nmi_handler, 0x00000000
.end
========== end of file ==========
256
Cortex-M3 19
start:
movs r0, #10
movs r1, #0
/* 10+9+8...+1 */
loop:
adds r1, r0
subs r0, #1
bne loop
/* R1 */
deadloop:
b deadloop
/* NMI */
nmi_handler:
bx lr
.end
========== end of file ==========
1. example2a.s
$> arm-none-eabi-as -mcpu=cortex-m3 -mthumb example2a.s -o example2a.o
2. example2b.s
$> arm-none-eabi-as -mcpu=cortex-m3 -mthumb example2b.s -o example2b.o
3. 2
$> arm-none-eabi-ld -Ttext 0x0 -o example2.out example2a.o example2b.o
4.
$> arm-none-eabi-objcopy -Obinary example2.out example2.bin
5.
$> arm-none-eabi-objdump -S example2.out > example2.list
make
257
Cortex-M3 19
258
Cortex-M3 19
/* R0 = */
push {r1, r2, r3, lr} /* */
ldr r1, =UART0_FLAG
putcwaitloop:
ldr r2, [r1] /* */
tst.w r2, #0x20 /* */
bne putcwaitloop /* */
ldr r1, =UART0_DATA /* */
str r0, [r1]
pop {r1, r2, r3, pc} /* */
.end
========== end of file ==========
.ascii .byte
.align .align
$> arm-none-eabi-as -mcpu_cortex-m3 -mthumb example3a.s -o example3a.o
$> arm-none-eabi-as -mcpu_cortex-m3 -mthumb example3b.s -o example3b.o
$> arm-none-eabi-ld -Ttext 0x0 -o example3.out example3a.o example3b.o
$> arm-none-eabi-objcopy -Obinary example3.out example3.bin
$> arm-none-eabi-objdump -S example3.out > example3.list
19.3.4 4 RAM
RW RAM RAM
========== example4.s ==========
.equ STACK_TOP, 0x20000800
.text
.global _start
.code 16
.syntax unified
_start:
.word STACK_TOP, start
.type start, function
start:
movs r0, #10
movs r1, #0
/* 10+9+1 */
loop:
adds r1, r0
subs r0, #1
bne loop
/* R1 */
ldr r0, =result
str r1, [r0]
259
Cortex-M3 19
deadloop:
b deadloop
/* */
.data
result:
.word 0
.end
========== end of fi le ==========
.data .word
4 Result result C
RAM -Tdata
19.3.5 5 C
GNU C
MSP C
C
========== example5.c ==========
#define STACK_TOP 0x20000800
#define NVIC_CCR ((volatile unsigned long *)(0xE000ED14))
//
void myputs(char *string1);
void myputc(char mychar);
int main(void);
void nmi_handler(void);
void hardfault_handler(void);
//
__attribute__ (( section(vectors) )) void (* const VectorArray[])(void) =
{
STACK_TOP,
main,
nmi_handler,
hardfault_handler
};
//
int main(void)
260
Cortex-M3 19
{
const char *helloworld[]="Hello world\n";
*NVIC_CCR = *NVIC_CCR | 0x200; /* NVIC STKALIGN */
myputs(*helloworld);
while(1);
return(0);
}
//
void myputs(char *string1)
{
char mychar;
int j;
j=0;
do
{
mychar = string1[j];
if (mychar!=0)
{
myputc(mychar);
j++;
}
} while (mychar != 0);
return;
}
void myputc(char mychar)
{
#define UART0_DATA ((volatile unsigned long *)(0x4000C000))
#define UART0_FLAG ((volatile unsigned long *)(0x4000C018))
// Wait until busy fl ag is clear
while ((*UART0_FLAG & 0x20) != 0);
// Output character to UART
*UART0_DATA = mychar;
return;
}
//
void nmi_handler(void)
{
return;
}
void hardfault_handler(void)
{
261
Cortex-M3 19
return;
}
========== end of file ==========
__attribute(( ))
vectors C vectors
vectors
simple.ld
========== simple.ld ==========
/* MEMORY */
/* */
/* */
/* */
MEMORY
{
/* ROM (r)(x) */
rom (rx) : ORIGIN = 0, LENGTH = 2M
/* RAM (r)(w)(x) */
ram (rwx) : ORIGIN = 0x20000000, LENGTH = 4M
}
/* SECTIONS : */
SECTIONS
{
. = 0x0; /* 0x00000000 */
.text : {
*(vectors) /* */
*(.text) /* */
*(.rodata) /* */
}
. = 0x20000000; /* 0x20000000 */
.data : {
*(.data) /* */
}
.bss : {
*(.bss) /* */
}
}
========== end of file ==========
simple.ld
$> arm-none-eabi-gcc -mcpu_cortex-m3 -mthumb example5.c -nostartfiles
-T simple.ld -o example5.o
simple.ld
$> arm-none-eabi-ld -T simple.ld -o example5.out example5.o
262
Cortex-M3 19
19.3.6 6 C C
C C
C GNU
CodeSourcery GNU ARM 2006q3-26
CodeSourcery armv7m-crt0.o
ARM 2006q3-27 bug
GNU
GNU
C 5 C armv7m-crt0
NMI fault _nmi_isr
_fault_isr 5 NMI Fault
//
void myputs(char *string1);
void myputc(char mychar);
int main(void);
void _nmi_isr(void);
void _fault_isr(void);
//
int main(void)
{
const char *helloworld[]="Hello world\n";
myputs(*helloworld);
while(1);
return(0);
}
//
void myputs(char *string1)
{
263
Cortex-M3 19
char mychar;
int j;
j=0;
do
{
mychar = string1[j];
if (mychar!=0)
{
myputc(mychar);
j++;
}
} while (mychar != 0);
return;
}
void myputc(char mychar)
{
#define UART0_DATA ((volatile unsigned long *)(0x4000C000))
#define UART0_FLAG ((volatile unsigned long *)(0x4000C018))
// Wait until busy fl ag is clear
while ((*UART0_FLAG & 0x20) != 0);
// Output character to UART
*UART0_DATA = mychar;
return;
}
//
void _nmi_isr(void)
{
return;
}
void _fault_isr(void)
{
return;
}
CodeSourcery codesourcery/sourcery
g++/arm-none-eabi/lib lm3s8xx-rom.ld
LM3S8XX
Clib
Aside from the current directory, when the C program code is located, a library subdirectory called lib
is also created in the current directory
armvrm-crt0.olib-L lib
lib
264
Cortex-M3 19
C
$> arm-none-eabi-gcc mcpu=cortex-m3 -mthumb example6.c -L lib T
lm3s8xx-rom.ld -o example6.out
example6.out
19.4
CodeSourceryGNU ARM
msr control, r1
mrs r1, control
msr apsr, r1
mrs r0, psr
19.5
GNUGNU
.word
.equ DW_MSR_CONTROL_R0, 0x8814F380
...
MOV R0, #0x1
.word DW_MSR_CONTROL_R0 /* MSR CONTROL, R0 */
...
19.6 GNU C
GNUARM C
__asm (" inst1 op1, op2... \n"
" inst2 op1, op2... \n"
...
" inst op1, op2... \n"
: s /* */
: s /* */
void Sleep(void)
{
// Wait-For-Interrupt
__asm (
WFI\n
);
265
Cortex-M3 19
}
5
__asm ( "mov r0, %0\n"
"mov r3, #5\n"
"udiv r0, r0, r3\n"
"mov %1, r0\n"
: "=r" (DataOut) : "r" (DataIn) : "cc", "r3" );
CDataIn%0
CDataOut%12r3
ccclobbered
GCC-Inline-Assembly-HOWTO
266
Cortex-M3 20
20
Development KitRVMDK
uVision
UART Hello World
20.1
CM3 KEIL RealView
Microcontroller Development Kit RealView MDK RVMDKRVMDK
8051 KEIL RVMDK
uVision
ARM RealView
C/C++
RTX
Flash
RVMDK RVMDK
RVMDK CM3 CM3 uVison
CM3
RVMDK GNU
KEIL KEIL tool
http://www.realview.com.cn/
267
Cortex-M3 20
20.2 uVison
RVMDK Luminary Micro Stellaris
ST STM32
RVMDK v3.03
Luminary Micro LM3S811 RVMDK 3.20
Luminary Micro CM3 ST STM32 CM3
Atmel, TI, NXP CM3
RVMDK uVision
ARM New Project
CortexM3
268
Cortex-M3 20
LM3S811
RVMDK Yes
Startup.s
main C
hello.c
269
Cortex-M3 20
hello.c 2
270
Cortex-M3 20
Reset_Handler Reset_Handler
Startup.s RVMDK 3.20
271
Cortex-M3 20
Hello WorldLM3S811UART0Luminary
Micro LM3S8116MHzPLL50MHz
115,200PCUART
printfretargetfputc
fputcsendcharUART
#include "stdio.h"
#define CR 0x0D //
#define LF 0x0A //
void Uart0Init(void);
void SetClockFreq(void);
int sendchar(int ch);
// 6MHz
#define CLOCK50MHZ
// Register addresses
#define SYSCTRL_RCC ((volatile unsigned long *)(0x400FE060))
#define SYSCTRL_RIS ((volatile unsigned long *)(0x400FE050))
#define SYSCTRL_RCGC1 ((volatile unsigned long *)(0x400FE104))
#define SYSCTRL_RCGC2 ((volatile unsigned long *)(0x400FE108))
#define GPIOPA_AFSEL ((volatile unsigned long *)(0x40004420))
#define UART0_DATA ((volatile unsigned long *)(0x4000C000))
#define UART0_FLAG ((volatile unsigned long *)(0x4000C018))
#define UART0_IBRD ((volatile unsigned long *)(0x4000C024))
#define UART0_FBRD ((volatile unsigned long *)(0x4000C028))
#define UART0_LCRH ((volatile unsigned long *)(0x4000C02C))
#define UART0_CTRL ((volatile unsigned long *)(0x4000C030))
#define UART0_RIS ((volatile unsigned long *)(0x4000C03C))
int main (void)
272
Cortex-M3 20
{
SetClockFreq(); // (50MHz/6MHz)
Uart0Init(); // UART0
printf ("Hello world!\n");
while (1);
}
void SetClockFreq(void)
{
#ifdef CLOCK50MHZ
// BYPASS, USRSYSDIV SYSDIV
*SYSCTRL_RCC = (*SYSCTRL_RCC & 0xF83FFFFF) | 0x800 ;
// OSCSRC, PWRDN OEN
*SYSCTRL_RCC = (*SYSCTRL_RCC & 0xFFFFCFCF);
// SYSDIV, USRSYSDIV Crystal
*SYSCTRL_RCC = (*SYSCTRL_RCC & 0xF87FFC3F) | 0x01C002C0;
// PLLLRIS
while ((*SYSCTRL_RIS & 0x40)==0); // wait until PLLLRIS is set
// bypass
*SYSCTRL_RCC = (*SYSCTRL_RCC & 0xFFFFF7FF) ;
#else
// BYPASS, USRSYSDIV SYSDIV
*SYSCTRL_RCC = (*SYSCTRL_RCC & 0xF83FFFFF) | 0x800 ;
#endif
return;
}
void Uart0Init(void)
{
*SYSCTRL_RCGC1 = *SYSCTRL_RCGC1 | 0x0003; // UART0 & UART1
// clock
*SYSCTRL_RCGC2 = *SYSCTRL_RCGC2 | 0x0001; // PORTA
*UART0_CTRL = 0; // UART
# ifdef CLOCK50MHZ
*UART0_IBRD = 27; // 50MHz
*UART0_FBRD = 9;
# else
*UART0_IBRD = 3; // 6MHz
*UART0_FBRD = 17;
# endif
*UART0_LCRH = 0x60; // 8 bit,
*UART0_CTRL = 0x301; // TX RX, UART
*GPIOPA_AFSEL = *GPIOPA_AFSEL | 0x3; // GPIOUART0
return;
}
// UART0printf
273
Cortex-M3 20
Retargetingfputc()
fputcfputc()
sendchar()sendchar()\n
CR
retargeting
20.4
Flash
1. flash
2.
274
Cortex-M3 20
3. flash
4.
20.5
uVision
JTAG
Debug
USB
275
Cortex-M3 20
IDE
Reset_Handler
main()
Insert/Remove Breakpoint
main()
276
Cortex-M3 20
main()SetClockFreq()25
277
Cortex-M3 20
PUSH r4,lr
20.6
uVison IDECM3
DebugSimulator:
NVIC
278
Cortex-M3 20
SVC
279
Cortex-M3 20
fault
UART
280
Cortex-M3 20
UART0x4000_C000-0x4000_DFFFRVMDK
RVMDK
RVMDKRVMDK
------------
uVision IDE
RVMDK
RVMDKARMRealView MDK
20.7
Startup.s
MSPNMIfault
Startup.s
ISRStartup.sstartup.s
startup.oISRIMPORTIMPORT
Cextern
IMPORT
281
Cortex-M3 20
20.8
SysTickUART0
PCUART
50MHzSysTick100Hz
SysTick50MHz(FCLK)SysTick
1TickCounter
UART
mani()
UART
stopwatch
stopwatch.c
#include "stdio.h"
#define CR 0x0D // Carriage return
#define LF 0x0A // Linefeed
void Uart0Init(void);
void SysTickInit(void);
void SetClockFreq(void);
void DisplayTime(void);
void PrintValue(int value);
int sendchar(int ch);
int getkey(void);
void Uart0Handler(void);
void SysTickHandler(void);
//
#define SYSCTRL_RCC ((volatile unsigned long *)(0x400FE060))
#define SYSCTRL_RIS ((volatile unsigned long *)(0x400FE050))
#define SYSCTRL_RCGC1 ((volatile unsigned long *)(0x400FE104))
282
Cortex-M3 20
283
Cortex-M3 20
break;
default:
CurrState = IDLE_STATE;
break;
} // end of switch
while (KeyReceived == 0)
{
if (CurrState==RUN_STATE)
{
DisplayTime();
}
}; //
if (CurrStateLocal==STOP_STATE)
{
TickCounter=0;
DisplayTime(); //
}
else if (CurrStateLocal==RUN_STATE)
{
DisplayTime(); //
}
if (KeyReceived!=0) KeyReceived=0;
}; // end of while loop
} // end of main
void SetClockFreq(void)
{
// Set BYPASS, clear USRSYSDIV and SYSDIV
*SYSCTRL_RCC = (*SYSCTRL_RCC & 0xF83FFFFF) | 0x800 ;
// Clr OSCSRC, PWRDN and OEN
*SYSCTRL_RCC = (*SYSCTRL_RCC & 0xFFFFCFCF);
// SYSDIV, USRSYSDIV Crystal
*SYSCTRL_RCC = (*SYSCTRL_RCC & 0xF87FFC3F) | 0x01C002C0;
// PLLRIS
while ((*SYSCTRL_RIS & 0x40)==0); // PLLLRIS
// bypass
*SYSCTRL_RCC = (*SYSCTRL_RCC & 0xFFFFF7FF) ;
return;
}
// UART0
void Uart0Init(void)
{
*SYSCTRL_RCGC1 = *SYSCTRL_RCGC1 | 0x0003; // UART0 & UART1
*SYSCTRL_RCGC2 = *SYSCTRL_RCGC2 | 0x0001; // PORTA
284
Cortex-M3 20
*UART0_CTRL = 0; // UART
*UART0_IBRD = 27; // 50MHz
*UART0_FBRD = 9;
*UART0_LCRH = 0x60; // 8 bit,
*UART0_CTRL = 0x301; // TX RX, UART
*UART0_IM = 0x10; // UART
*GPIOPA_AFSEL = *GPIOPA_AFSEL | 0x3; // UART0GPIO
*NVIC_IRQ_EN0 = (0x1<<5); // NVICUART
return;
}
// SYSTICK
void SysTickInit(void)
{
#define NVIC_STCSR ((volatile unsigned long *)(0xE000E010))
#define NVIC_RELOAD ((volatile unsigned long *)(0xE000E014))
#define NVIC_CURRVAL ((volatile unsigned long *)(0xE000E018))
#define NVIC_CALVAL ((volatile unsigned long *)(0xE000E01C))
*NVIC_STCSR = 0; // SYSTICK
*NVIC_RELOAD = 499999; // 50MHz100Hz
*NVIC_CURRVAL = 0; //
*NVIC_STCSR = 0x7; // SYSTICK
return;
}
// SYSTICK
void SysTickHandler(void)
{
if (CurrState==RUN_STATE) {
TickCounter++;
}
return;
}
// UART0 RX
void Uart0Handler(void)
{
userinput = getkey();
//
KeyReceived++;
// UART
*UART0_ICR = 0x10;
//
switch (CurrState)
{
case (IDLE_STATE):
CurrState = RUN_STATE;
285
Cortex-M3 20
break;
case (RUN_STATE):
CurrState = STOP_STATE;
break;
case (STOP_STATE):
CurrState = IDLE_STATE;
break;
default:
CurrState = IDLE_STATE;
break;
} // end of switch
return;
}
//
void DisplayTime(void)
{
unsigned long TickCounterCopy;
unsigned long TmpValue;
sendchar(CR);
TickCounterCopy = TickCounter; //
// SysTick ISR
TmpValue = TickCounterCopy / 6000; //
PrintValue(TmpValue);
TickCounterCopy = TickCounterCopy - (TmpValue * 6000);
TmpValue = TickCounterCopy / 100; //
sendchar(':');
PrintValue(TmpValue);
TmpValue = TickCounterCopy - (TmpValue * 100);
sendchar(':');
PrintValue(TmpValue); // 1/100
sendchar(' ');
sendchar(' ');
return;
}
// 10
void PrintValue(int value)
{
printf ("%d", value);
return;
}
// UART0printf
int sendchar (int ch)
{
if (ch == '\n')
286
Cortex-M3 20
UARTSysTickSysTick
UART0_ICR
startup.sstartup.s
IMPORT
287
Cortex-M3 20
COM
COMbugRVMDK
PC
288
Cortex-M3 20
4
C
.s
movmovtpush/popC
MovMovTTest.h.c
void MovMovTTest(void);
ARM
Add3
add r0, r0, r1
add r0, r0, r2
bx lr
C
int Add3(int a, int b, int c); //a+b+c
4C
289
Cortex-M3 20
290
Cortex-M3 A
Cortex-M3
Cortex-M3C
U8unsigned char16
U16unsigned short16
S8signed char8
S16signed short16
charshort
CRn[Rm]Rn+Rm
32
C/
Rn[Rm]
*( (U32 *) (Rn+Rm) )Rn,Rm32
{S}SAPSR
1-1 16 Cortex-M3
Rd+= Rm+C ADC <Rd>, <Rm>
Rd= Rn+Imm3 ADD <Rd>, <Rn>, #<immed_3>
Rd+= Imm8 ADD <Rd>, #<immed_8>
Rd=Rn+Rm ADD <Rd>, <Rn>, <Rm>
Rd+=Rm ADD <Rd>, <Rm>
Rd=PC+Imm8*4 ADD <Rd>, PC, #<immed_8>*4
Rd=SP+Imm8*4 ADD <Rd>, SP, #<immed_8>*4
291
Cortex-M3 A
<contd> B<cond> <target address>
B<tartet address>
Rd &= ~Rs BIC <Rd>, <Rs>
BKPT <immed_8>
BL <Rm>
292
Cortex-M3 A
Rd=Rn MOV <Rd>, <Rn>
Rd= ~Rm
MVN <Rd>, <Rm>
Rd= ~Rm + 1 NEG <Rd>, <Rm>
NOP <C>
Rd|= Rm ORR <Rd>, <Rm>
POP <>
PC POP <PC>
PUSH <registers>
8 SVC <immed_8>
293
Cortex-M3 A
[15:0] UXTH <Rd>, <Rm>
32
Rd= (U16) Rm
WFE <c>
WFI <c>
Rd=Rn+Imm12+CS ADC{S}.W <Rd>, <Rn>,
S #<modify_constant(immed_12>
Rd= RnRmC ADC{S}.W <Rd>, <Rn>, <Rm>{, <shift>}
Rd= Rn+Imm12 ADD{S}.W <Rd>,
<Rn>,#<modify_constant(immed_12)>
Rd=RdRm ADD{S}.W <Rd>, <Rm>{, <shift>}
Rd= Rn+Imm12 ADDW.W <Rd>, <Rn>, #<immed_12>
Rd= Rn & Imm12 AND{S}.W <Rd>, <Rn>,
#<modify_constant(immed_12>
Rd=RnRm AND{S}.W <Rd>, <Rn>, Rm>{, <shift>}
Rd = Rn>>RmS ASR{S}.W <Rd>, <Rn>, <Rm>
B{cond}.W <label>
BL<c> <label>
B.W <label>
294
Cortex-M3 A
LDR.W PC, #<+/-<offset_8>
Rxf= *Rn; LDR.W <Rxf>, [<Rn>], #+/<offset_8>
Rn+= ofs8;
295
Cortex-M3 A
Rn+ofs12 LDRSB.W <Rxf>, [<Rn>, #<offset_12>]
Rxf
Rn MSR<c> <psr>_<fields>,<Rn>
Rd= Rn*Rm MUL.W <Rd>, <Rn>, <Rm>
NOP.W
Rd= Rn | ~Imm12 ORN{S}.W <Rd>, <Rn>,
#<modify_constant(immed_12)>
Rm ORN[S}.W <Rd>, <Rn>, <Rm>{, <shift>}
Rd= Rn | ~Rm
Rd= Rn | Imm12 ORR{S}.W <Rd>, <Rn>,
#<modify_constant(immed_12)
296
Cortex-M3 A
Rm ORR{S}.W <Rd>, <Rn>, <Rm>{, <shift>}
Rd= Rn | Rm
SEV<c>
*( (U16*) (Rn+ofs8) ) = (U16) Rxf STRH{T}.W <Rxf>, [<Rn>, #+/<offset_8>]{!}
Rn+=ofs8
WFE.W
WFI.W
298
Cortex-M3 B-D
16 Thumb
B.1 ARM 16
299
Cortex-M3 B-D
Cortex-M3
C.1
0 N/A N/A
1 -3
2 NMI -2 NMI
3 fault -1 fault
(escalation) fault
FAULTMASK fault
Fault
PRIMASK/BASEPRI
4 Mem faultMPU NVIC SHCSR.16
Manage E000_ED18 E000_ED24
fault fault
5 fault NVIC SHCSR.17
E000_ED19 Abort E000_ED24
6 NVIC SHCSR.18
Fault E000_ED1A E000_ED24
ARM
7-10 N/A N/A
11 SVCall SVC
E000_ED1F
12 NVIC DEMCR.16
E000_ED20 E000_EDFC
13 N/A N/A
14 PendSV
E000_ED22 pendable request
15 SysTick SysTick CTRLSTAT.1
E000_ED23 E000_E010
16- IRQ E000_E400 240 NVIC SETENA
255
300
Cortex-M3 B-D
C.2 SP
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
SP
((OLD_SP-4) AND 0xFFFF_FFF8)
301
Cortex-M3 B-D
NVIC
D.1 ICTR 0xE000_E004
4:0 INTLINESUM R - 32
0=1 32
1=33 64
2=65 96
D.2 SysTick0xE000_E010
16 COUNTFLAG R 0 SysTick
0 1
2 CLKSOURCE R/W 0 0=(STCLK)
1=(FCLK)
1 TICKINT R/W 0 1=SysTick 0 SysTick
0= 0
0 ENABLE R/W 0 SysTick
D.3 SysTick0xE000_E014
23:0 RELOAD R/W 0
D.4 SysTick0xE000_E018
23:0 CURRENT R/Wc 0
SysTick
COUNTFLAG
D.5 SysTick0xE000_E01C
31 NOREF R - 1=STCLK
0=
30 SKEW R - 1= 10ms
0= 10ms
302
Cortex-M3 B-D
D.6 SETENA/CLRENA
SETENA0 R/W 0xE000_E100 0 0-31 32
[n]#n 16+n
SETENA1 R/W 0xE000_E104 0 32-63 32
SETENA7 R/W 0xE000_E11C 0 224-239 16
CLRENA7 R/W 0xE000_E19C 0 224-239 16
D.7 SETPEND/CLRPEND
[n]#n 16+n
303
Cortex-M3 B-D
[n]#n 16+n
ACTIVE0 RO 0xE000_E300 0 0-31 32
[n]#n 16+n
ACTIVE1 RO 0xE000_E304 0 32-63 32
ACTIVE7 RO 0xE000_E31C 0 224-239 16
PRI_0 R/W 0xE000_E400 08 #0
PRI_1 R/W 0xE000_E401 08 #1
PRI_239 R/W 0xE000_E4EF 08 #239
31:24 R 0x41 ARM=0x41
304
Cortex-M3 B-D
23:20 R 0x0/0x1/0x02
19:16 R 0xF
15:4 R 0xC23 Part
3:0 R 0x0/0x1
31 NMIPENDSET R/W 0 1 NMI NMI
NMI
28 PENDSVSET R/W 0 1 PendSV PendSV
27 PENDSVCLR W 0 1 PendSV
26 PENDSTSET R/W 0 1 SysTick PendSV
25 PENDSTCLR W 0 1 SysTick
23 ISRPREEMPT R 0 1
22 ISRPENDING R 0 1= NMI
21:12 VECTPENDING R 0 ISR
11 RETTOBASE R 0 (base level)
1
fault
0
9:0 VECTACTIVE R 0 ISR
ISRNMI
fault
16,
/
7-28 TBLOFF RW 0
29 TBLBASE R - Code 0 RAM 1
305
Cortex-M3 B-D
31:16 VECTKEY RW -
0x05FA
0xFA05
15 ENDIANESS R - 1(BE8)0
10:8 PRIGROUP R/W 0
2 SYSRESETREQ W -
1 VECTCLRACTIVE W -
OS
0 VECTRESET W - CM3
D.14 0xE000_ED10
4 SEVONPEND RW -
WFE
WFE
WFE
3 - - -
2 SLEEPDEEP R/W 0 SLEEPDEEP
1 SLEEPONEXIT R/W - SleepOnExit
0 - - -
D.15 0xE000_ED14
9 STKALIGN RW 0(r1 SP
) 0
1(r2
)
8 BFHFNMIGN RW 0 fault NMI
fault
7:5 - - -
4 DIV_0_TRP RW 0 fault
3 UNALIGN_TRP RW 0 fault
2 - - -
1 USERSETMPEND RW 0 1, STIR
0 NONBASETHRDENA RW 0 1,
306
Cortex-M3 B-D
EXC_RETURN
0xE000_ED18 PRI_4 fault
0xE000_ED19 PRI_5 fault
0xE000_ED1A PRI_6 fault
0xE000_ED1B - - - -
0xE000_ED1C - - - -
0xE000_ED1D - - - -
0xE000_ED1E - - - -
0xE000_ED1F PRI_11 SVC
0xE000_ED20 PRI_12
0xE000_ED21 - - - -
0xE000_ED22 PRI_14 PendSV
0xE000_ED23 PRI_15 SysTick
18 USGFAULTENA R/W 0 fault
17 BUSFAULTENA R/W 0 fault
16 MEMFAULTENA R/W 0 fault
15 SVCALLPENDED R/W 0 SVC SVC
14 BUSFAULTPENDED R/W 0 fault
13 MEMFAULTPENDED R/W 0 fault
12 USGFAULTPENDED R/W 0 fault
11 SYSTICKACT R/W 0 SysTick
10 PENDSVACT R/W 0 PendSV
9 - - - -
8 MONITORACT R/W 0 Monitor
7 SVCALLACT R/W 0 SVC
6:4 - - - -
3 USGFAULTACT R/W 0 fault
2 - - - -
1 BUSFAULTACT R/W 0 fault
0 MEMFAULTACT R/W 0 fault
307
Cortex-M3 B-D
7 MMARVALID - 0 =1 MMAR
6:5 - - - -
4 MSTKERR R/Wc 0
3 MUNSTKERR R/Wc 0
2 - - - -
1 DACCVIOL R/Wc 0
0 IACCVIOL R/Wc 0
7 BFARVALID - 0 =1 BFAR
6:5 - - - -
4 STKERR R/Wc 0
3 UNSTKERR R/Wc 0
2 IMPRECISERR R/Wc 0 violation
1 PRECISERR R/Wc 0
0 IBUSERR R/Wc 0
9 DIVBYZERO R/Wc 0 DIV_0_TRP
8 UNALIGNED R/Wc 0 fault
7:4 - - - -
3 NOCP R/Wc 0
2 INVPC R/Wc 0 EXC_RETURN
PC
The return PC
PC
1 INVSTATE R/Wc 0 ARM
0 UNDEFINSTR R/Wc 0
4 EXTERNAL R/Wc 0 EDBGREQ
3 VCATCH R/Wc 0
2 DWTTRAP R/Wc 0 DWT
1 BKPT R/Wc 0 BKPT
0 HALTED R/Wc 0 NVIC HALT
31:0 MMAR R - fault
31:0 BFAR R - fault
31:0 AFAR R -
23:16 IREGION R 0 MPU region ARMv7-M
MPU
15:8 DREGION R 0 MPU MPU 8,
0 SEPARATE R 0
309
Cortex-M3 B-D
2 PRIVDEFENA RW 0
region
1= region
0= region
region fault
1 HFNMIENA RW 0 1= NMI fault MPU
0= NMI fault MPU
0 ENABLE RW 0 MPU
7:0 REGION RW - region 8
region[2:0]
4 VALID RW - REGION
1=MPU regionREGION
0=MPU region
310
Cortex-M3 B-D
31:29 3 -
28 1 XN 1=
2=
27 1 -
26:24 3 AP
0b000
0b001 RW OS
0b010 RW RO
0b011 RW RW
0b100 n/a n/a n/a
0b101 RO OS
0b110 RO RO
0b111 RO RO
23:22 2
21:19 3 TEX
18 1 S Sharable
1=
0=
17 1 C Cachable
1=
0=
16 1 B Buffable
1=
0=
15:8 8 SRD regionSRDregion
128region8region128
regionRegion
7:6 2 -
5:1 5 REGIONSIZE Region1<<(REGIONSIZE+1)32
0 1 SZENABLE 1=region 0=region
31:15 KEY W -
A05F
311
Cortex-M3 B-D
25 S_RESET_ST R -
24 S_RETIRE_ST R -
19 S_LOCKUP R - 1=
18 S_SLEEP R - 1=
17 S_HALT R - 1=
16 S_REGRDY R - 1=
15:6 - -
5 C_SNAPSTALL RW 0* stalled
4 - -
3 C_MASKINTS RW 0*
2 C_STEP RW 0* C_DEBUGEN=1
1 C_HALT RW 0* C_DEBUGEN=1
0 C_DEBUGEN RW 0*
D.32 DCRSR0xE00_EDF4
16 REGWnR W - 1=
0=
15:5 - - -
4:0 REGSEL W - 00000= R0
00001=R1
01111=R15
10000=xPSR
10001=MSP
10010=PSP
10100=
[31:24]: CONTROL
[23:16]: FAULTMASK
[15:8]: BASEPRI
[7:0]: PRIMASK
D.33 DCRDR0xE00_EDF8
31:0 DATA R/W -
DCRSR
24 TRCENA RW 0* DWT,ETM,ITM
312
Cortex-M3 B-D
TPIU
23:20
19 MON_REQ RW 0 1=
18 MON_STEP RW 0 MON_EN=1
17 MON_PEND RW 0
16 MON_EN RW 0
15:11
10 VC_HARDERR RW 0* fault
9 VC_INTERR RW 0* /
8 VC_BUSERR RW 0* fault
7 VC_STATERR RW 0* fault
6 VC_CHKERR RW 0* fault
5 VC_NOCPERR RW 0* fault
4 VC_MMERR RW 0* fault
3:1
0 VC_CORERESET RW 0*
*DEMCR NVIC
8:0 INTID W - INTID
8 IRQ #8
PERIPHID4 R 0xE000_EFD0 0x04 ID 4
PERIPHID5 R 0xE000_EFD4 0 ID 5
PERIPHID6 R 0xE000_EFD8 0 ID 6
PERIPHID7 R 0xE000_EFDC 0 ID 7
PERIPHID0 R 0xE000_EFE0 0 ID 0
PERIPHID1 R 0xE000_EFE4 0 ID 1
PERIPHID2 R 0xE000_EFE8 0x0B/0x1B ID 2
PERIPHID3 R 0xE000_EFEC 0 ID 3
PCELLID0 R 0xE000_EFF0 0x0D ID 0
PCELLID1 R 0xE000_EFF4 0xE0 ID 1
PCELLID2 R 0xE000_EFF8 0x05 ID 2
PCELLID3 R 0xE000_EFFC 0xB1 ID 3
313
Cortex-M3 B-D
314
Cortex-M3 E
Cortex-M3
E.1
CM3 faults
faults
CM3 faults
fault fault
0xE000_ED28 MMSR MemManage fault
0xE000_ED29 BFSR fault
0xE000_ED2A UFSR fault
0xE000_ED2C HFSR fault
0xE000_ED30 DFSR fault
0xE000_ED3C AFSR fault
E.1 fulat
MMSR, BFSR UFSR
fault fault (CFSR)
PC
fault PC (SP-0x24) CM3 fault
fault MSP PSP
fault fault
MMAVALID/BFARVALID fault fault MMAR
fault BFAR MMAR BFAR
315
Cortex-M3 E
fault
E.2
0xE000_ED34 MMAR MemManage fault
0xE000_ED38 BFAR fault
fault LR fault
fault EXC_RETURN fault LR
EXC_RETURN Fault LR
EXC_RETURN
E.2 Fault
fault
fault fault
fault
fault fault
dump fault
PendSV PendSV
fault
PendSV fault
E.2.1 fault
Fault fault
E.2.2 PC
PC
316
Cortex-M3 E
E.2 PC
TST LR, #0x4 ; EXC_RETURN.2=0?
ITTEE EQ ;
MRSEQ R0, MSP ; MSPR0
LDREQ R0,[R0,#24] ; MSPPC
MRSNE R0, PSP ; , PSPR0
LDRNE R0,[R0,#24] ; PSPPC
RVMDK
E.2.3 fault
MMARVALID BFARVALID 1
MMARVALID/BFAVRALID fault
BFAR/MMAR BFARVALID/MMARVALID
BFARVALID/MMARVALID
fault
1. BFARVALID/MMARVALID
2. VALID BFAR/MMAR
3. fault fault fault
4. fault BFARVALID/MMARVALID BFAR/MMAR
5. fault BFAR/MMAR
VALID BFAR/MMAR
BFAR/MMAR
fault
fault FSR fault fault
FSR fault fault fault
317
Cortex-M3 E
fault BFAR/MMAR
E.2.4
fault LR fault
LR R3-R0 R12
LR
SRAM fault
E.3 C fault
CM3 C C
C SP C fault
SP fault
MDK ARM __builtin_frame_address()
GNU
12 SVC C SVC
RealView MDK
fault
R0 C
// fault
//
// C
__asm void hard_fault_handler_asm(void)
{
IMPORT hard_fault_handler_c
TST LR, #4
ITE EQ
MRSEQ R0, MSP
MRSNE R0, PSP
B hard_fault_handler_c
}
C
fault
// C fault
//
void hard_fault_handler_c(unsigned int * hardfault_args)
{
unsigned int stacked_r0;
unsigned int stacked_r1;
unsigned int stacked_r2;
318
Cortex-M3 E
exit(0); // terminate
return;
}
SP
C C
E.4 fault
E.3- E.7 faults
319
Cortex-M3 E
E.4 fault
STKERR
1.
2.
3. PSP
UNSTKERR STKERR
SP
IMPRECISERR
LDM/STM fault
PRECISERR BFAR fault
IBUSERR MemManage fault IACCVIOL
E.5 fault
DIVBYZERO DIV_0_TRP fault
PC
UNALIGNED UNALIGN_TRP fault PC
320
Cortex-M3 E
NOCP fault PC
INVPC 1. EXC_RETURN
1) EXC_RETURN=0xFFFF_FFF1
2) EXC_RETURN=0xFFFF_FFF9 handler
2.
1)
VECTCLRACTIVE SHCSR
2)
3. IPSR INVPC fault PC
fault
ITM
4. ICI/IT LDM/STM
PC ICI
ICI PSR fault
INVSTATE 1. PC LSB=0 PC
2. LSB=0
3. PSR ARM
UNDEFINSTR 1. CM3
2.
3. ARM
4. GNU .ascii .align
E.6 fault
DEBUGEVF fault
1. /
2. fault MON_EN=0
C_DEBUGEN=0 BKPT
C BKPT
FORCED fault
1. SVC/ SVC/BKPT
SVC/BKPT
2. fault
3. fault
4. fault
VECTBL
1. fault
2.
E.7 fault
321
Cortex-M3 E
EXTERNAL EDBGREQ
VCATCH
DWTTRAP DWT
BKPT 1. BKPT
2. FPB
322