EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
;/******************************************************************************
7 {. [! R- R/ A; |; * @file startup_Nano100Series.s
- R- _9 \5 E' O+ k$ d1 m/ u; * @version V1.00& `5 w, ]7 @1 n$ h8 \) r3 `; }% s2 A
; * $Revision: 3 $' V, L# D/ n$ ^! ]
; * $Date: 14/01/14 4:17p $ $ P- A2 f$ Q( R: R
; * @brief CMSIS ARM Cortex-M0 Core Device Startup File2 j0 R4 _, X# ^: ~" q+ c
; *
9 _, x/ i" L$ p1 W% B; * @note
) N/ K$ z+ y4 d3 K$ F% _: M/ J" S; * Copyright (C) 2013 Nuvoton Technology Corp. All rights reserved.
/ B! S6 b4 Z N, g;*****************************************************************************/ . R0 k: ]9 ~+ a; p) O! B* k
;首先对栈和堆的大小进行定义,并在代码区的起始处建立中断向量表,& {; y. j! G. L; l, U% P/ M
;其第一个表项是栈顶地址,第二个表项是复位中断服务入口地址。1 C& i$ W0 a$ Z7 b0 F0 S
;然后在复位中断服务程序中跳转C/C++标准实时库的__main函数。9 ^9 g& z0 n- T0 q4 E1 B. {& g
;复位中断服务入口地址存放于0x0000_0000处。当M0遇到复位信号后,
% |2 X7 A0 d P;则从0x0000000处取出复位中断服务入口地址继而执行复位中断服务程序. t/ n9 i: F6 }/ k: n2 H1 D, y
;然后跳转__main函数,最后来到C的世界。
% o4 i6 \6 b3 P/ k2 y" p; <h> Stack Configuration栈配置,为后期跳转到C语言代码存放参数,地址做准备
q+ X5 n* ^+ K8 X2 H; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>5 ]0 p) O) J; o0 h+ z
; </h>
4 K. T: v: h3 |;EQU相当于C语言的define
# ?) ^6 O' a4 F+ G \0 K1 b/ GStack_Size EQU 0x00000500;,共1280个字节% _1 K ~7 @* ]& a3 h) [4 V1 `
;定义一片区域名为STACK,未初始化段,可读可写,8字节对齐
( r1 @9 P- H. ?; y AREA STACK, NOINIT, READWRITE, ALIGN=3
4 [+ \8 P; y \) C( r;此指令用于分配一片连续的存储区域并初始化为0。表达式为要分配的字节数。
6 i6 z: E- q! Q% t3 n+ a;SPACE可用“%”来代替
+ u- w" h e3 ZStack_Mem SPACE Stack_Size
% M" a0 L0 U& z8 `;__initial_sp表示一个标示,编译器计算这个标示的地址.
- _) ?. u1 H3 I0 Z7 b K2 h0 t__initial_sp
; ?* ?) b7 I6 f( @; <h> Heap Configuration% ^4 I; n% s' i. \: J/ T
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
( Y% N3 j7 z# K- o; </h>
$ ^: r5 D' N+ ~: y
Heap_Size EQU 0x00000500
1 y" U! E+ h( L8 ~ AREA HEAP, NOINIT, READWRITE, ALIGN=3
) ~9 z! Z2 i; T1 N! G, d( P__heap_base
0 w) ]- Z x( Y" u5 g3 gHeap_Mem SPACE Heap_Size# @' Q5 B' b2 n# c5 @8 i3 f
__heap_limit
+ J" C5 b5 g# D7 s0 {3 Z' o8 a; l PRESERVE8
) q3 t6 C+ d7 N$ o G+ K THUMB
- x6 q5 G- I+ s2 D6 ?; Vector Table Mapped to Address 0 at Reset
8 Z5 R$ P$ o8 G- e. B& x8 Q;中断向量表映射到0x00,
* K. M4 p' y4 J, X! \9 U AREA RESET, DATA, READONLY
" o8 ]; e9 T) ^, s; C! [ ;使编译器指定一段只读的数据段,段名为reset
. M2 t* X2 s7 H, r% f, O& Y ;EXPORT __Vectors
0 K9 S: u9 P- ~ ;EXPORT相当于GLOBLE关键字,声明一个全局变量__vector,9 X v7 U! x$ e
;DCD指令:作用是开辟一段空间,其意义等价于C语言中的地址符“&”& M x/ Z n7 \% e7 T/ J) Y
;异常向量表从0x0000_0000开始,初始位置为Stack_Point所在地,
s* t6 V$ m! o; u1 ~: O9 ~;自动取传入的地址存入SP寄存器中,其他中断存放中断程序地址,
+ L" K6 N% j' A- | e6 d% r;跳转到ISR中执行程序,具体查看datasheet page 111中描述
__Vectors DCD __initial_sp ; Top of Stack
8 e F5 R2 ?, _/ b2 \1 @;取__initianl_sp地址放入0x00000000,
+ R- i% g: Q* n DCD Reset_Handler ; Reset Handler" m8 D6 |7 j* T! h* i) s4 ]
DCD NMI_Handler ; NMI Handler, [ O, K9 ~# i9 o' z6 M
DCD HardFault_Handler ; Hard Fault Handler) F: S- R6 f$ n; f
DCD 0 ; Reserved
% m/ S7 T$ g; a DCD 0 ; Reserved
/ g) v7 n' W7 N3 ]; M DCD 0 ; Reserved
9 }( d* y8 B8 U1 `+ [* K( L DCD 0 ; Reserved% B/ G. @% ]9 a( h
DCD 0 ; Reserved
3 m$ i. }: N9 v {# k, I# c( ^. ` DCD 0 ; Reserved
7 _1 U6 T( C t. f- V) S DCD 0 ; Reserved' a( u3 c8 e% f' C+ p2 b* V0 `
DCD SVC_Handler ; SVCall Handler
( @: d3 d) A e$ \9 B/ ` DCD 0 ; Reserved
- b* w* \% z# y/ W7 l0 A% J q7 q DCD 0 ; Reserved
% ]9 x' M* M2 B DCD PendSV_Handler ; PendSV Handler
8 ?( n5 j4 {: ]7 @: H DCD SysTick_Handler ; SysTick Handler 2 g) a2 n w2 w# e9 o% U
; External Interrupts
5 Q% V( F7 \/ z% G8 Z) r" I1 j+ m DCD BOD_IRQHandler ; Brownout low voltage detected interrupt
, d, M( @/ y ?. z DCD WDT_IRQHandler ; Watch Dog Timer interrupt
+ m+ U( \7 i3 q: `( d. F% J DCD EINT0_IRQHandler ; External signal interrupt from PB.14 pin
+ }$ G) ]+ ]5 z DCD EINT1_IRQHandler ; External signal interrupt from PB.15 pin% R0 j o: F+ Q
DCD GPABC_IRQHandler ; External interrupt from PA[15:0]/PB[15:0]/PC[15:0] - w6 h6 ?* b0 t3 o
DCD GPDEF_IRQHandler ; External interrupt from PD[15:0]/PE[15:0]/PF[7:0]
# X$ ^- y& O w. e3 w+ E+ o1 y3 q DCD PWM0_IRQHandler ; PWM 0 interrupt
+ H$ W! x* L! C* m1 t DCD PWM1_IRQHandler ; PWM 1 interrupt
$ b3 @, x3 q& _* l! ~9 d DCD TMR0_IRQHandler ; Timer 0 interrupt/ [. g& U9 Q R6 G4 h: \
DCD TMR1_IRQHandler ; Timer 1 interrupt
) p0 c0 |' ]) t' b DCD TMR2_IRQHandler ; Timer 2 interrupt 3 i1 Y" [8 Y3 ?9 w
DCD TMR3_IRQHandler ; Timer 3 interrupt
* s1 S0 s6 ]9 F3 {9 |( b* y DCD UART0_IRQHandler ; UART0 interrupt4 r: j7 Z$ \ C* A
DCD UART1_IRQHandler ; UART1 interrupt$ {1 D% l. {! ?5 u; z" D$ \
DCD SPI0_IRQHandler ; SPI0 interrupt
0 {8 {, `. p4 g! ]4 P8 n; a% p DCD SPI1_IRQHandler ; SPI1 interrupt
) P: D' o$ O0 h; K* O* J& V DCD SPI2_IRQHandler ; SPI2 interrupt
/ N) U2 y/ f% v' K) S1 Q DCD HIRC_IRQHandler ; HIRC interrupt
/ O( g7 |. f9 n) ` DCD I2C0_IRQHandler ; I2C0 interrupt ) z) |$ x6 y/ }
DCD I2C1_IRQHandler ; I2C1 interrupt , f6 A9 P# L: t2 x8 t) Y& A- N6 S
DCD SC2_IRQHandler ; SC2 interrupt
. h7 R' o4 l3 h. Q& E o* I DCD SC0_IRQHandler ; SC0 interrupt
4 |1 V d P8 _* S$ ^/ _2 [1 \5 I DCD SC1_IRQHandler ; SC1 interrupt" E9 i: p+ g5 E! @4 `- A
DCD USBD_IRQHandler ; USB FS Device interrupt ) d% F& U/ e" S+ w
DCD 0 ; Reserved , [9 K+ s7 Y7 Z& @
DCD LCD_IRQHandler ; LCD interrupt
" p4 }. H9 t2 N+ D2 L7 c% w) ^ DCD PDMA_IRQHandler ; PDMA interrupt
: O% g7 v8 O6 k/ ?5 G0 W3 ~ DCD I2S_IRQHandler ; I2S interrupt
5 d6 r+ f8 ]7 d DCD PDWU_IRQHandler ; Power Down Wake up interrupt1 v) X6 n( J% F1 o0 S# |- k9 t
DCD ADC_IRQHandler ; ADC interrupt
3 _- m" B1 Y+ A( f# G: x* Q0 i5 s DCD DAC_IRQHandler ; DAC interrupt+ z* a. K8 K. N1 I3 _' ]
DCD RTC_IRQHandler ; Real time clock interrupt
- N* S) m% c& i* c. ~ AREA |.text|, CODE, READONLY
x: r3 W: E% {" y1 W9 _; Reset Handler
y3 ~% K) [" {; O;汇编伪指令PROC ENDP 提示编译器子程序开始和结束
O7 C" q6 }4 M: l9 vReset_Handler PROC+ L- C- s6 x/ P+ [5 u/ `# [) Q
;定义全局变量 Reset_Handle [WEAK]表示弱定义可在其他地方优先/ F) ^5 b9 G) R7 G
;以便在C中调用Reset_Handle,有利于后期编写复位程序
* B+ f8 }* h7 ? EXPORT Reset_Handler [WEAK] ; a! C* k/ H: n8 c$ Y- h
;申明main,main在外部定义
. x; ~" d0 P: H IMPORT __main
D' a( V1 x$ f( p- U' c) N ;伪指令,提示编译器main标示在外部定义5 x, q1 N. l" {, j" @) ?
; 解锁保护寄存器。向RegLockAddr连续写入0x59,0x16,0x88解锁2 b/ P* [: r k/ W' Z
LDR R0, =0x50000100
( k& t% Y; c" s LDR R1, =0x59) q1 v. D5 Z/ P* O! `. G& |
STR R1, [R0], b, o# A) A; S, l) I' O5 M
LDR R1, =0x165 [- o2 U2 a9 f, x$ g4 Q* \' l
STR R1, [R0]# I9 e. m- r7 o( G8 a2 R
LDR R1, =0x882 ?4 f3 ]' x3 [% x* F! A" C
STR R1, [R0]
& G5 I x( S- K; W$ D% v9 V6 z
; Init POR具体看手册,
) f1 {1 f& u( u2 a, J2 Y6 H% O LDR R2, =0x50000060
2 O7 z: N$ G' f- [) D3 [2 _$ \ LDR R1, =0x00005AA5
. E1 J4 q* s5 k5 Z STR R1, [R2] ! p0 V$ k; P& ~/ N! p2 P0 a
; Lock register写0,锁住保护寄存器
' i& Y4 H1 a$ J* K+ Z MOVS R1, #09 h& R9 ^; P% M. p% q( M0 j3 i f
STR R1, [R0]
0 z/ ]7 k% K8 x; N( r3 H. t LDR R0, =__main, t& Y$ Z3 @* Q" V
;伪指令,将main地址存入R0中0 m. H% |/ X b
BX R0
5 q2 _7 H+ W; @" e' I ;跳转到R0所在地址的位置,即__main所在程序,BX跳转且切换指令集
5 @$ J" V. k# H( M6 ]% b5 b ENDP
# Q- `! \4 y4 [6 r% g; Dummy Exception Handlers (infinite loops which can be modified)
: w8 P3 L$ u% p0 _;其他中断入口程序,弱定义,进入死循环,以便后期C程序编写中断子程序! E* O) D/ j8 m* Z
NMI_Handler PROC" K, a( e1 w9 g* I9 S) r% {9 M3 f
EXPORT NMI_Handler [WEAK]
6 y }/ w5 a9 R B .
$ r/ z% f3 w Z3 Z ENDP
; w- y( o* p, r. T- `: }3 HHardFault_Handler\;连接符9 t- }) Y. G+ O
PROC
5 ]! H+ s3 x3 D$ |' G$ p EXPORT HardFault_Handler [WEAK]$ T1 U: r& {. j p0 [0 v
B .
7 v0 L w n" L, k9 C/ J: c) U ENDP
) X1 S. L3 N! a; E) B, cSVC_Handler PROC
. v: v2 o# G1 U( b" M6 a/ d$ d7 K EXPORT SVC_Handler [WEAK]
! N' Z( w' Q% g, a! p B .# o. r; F3 ?6 z$ R
ENDP
1 T& ?5 _# `6 I3 ?# MPendSV_Handler PROC
) ?3 K" w+ K" _2 v EXPORT PendSV_Handler [WEAK]. i) {/ E) X _* n; r
B . }$ l. |) T- {' \; p
ENDP! E( f. T' p& x/ Q" s3 t6 p
SysTick_Handler PROC/ ^- B7 l" ?$ W$ D
EXPORT SysTick_Handler [WEAK]
) B' E% H9 L" S* E: x B .9 T! P) ]% b$ U2 T! j( x( @
ENDP
4 ?+ L6 ~! @0 B& o* G8 N;缺省中断。不写
: X* L1 x) E2 e# {Default_Handler PROC
9 G- x- P" \( l7 P/ _) l
EXPORT BOD_IRQHandler [WEAK]1 S0 \) e$ c8 Z7 T0 K
EXPORT WDT_IRQHandler [WEAK]
: s; h9 z q5 j0 H: P EXPORT EINT0_IRQHandler [WEAK]
/ x8 J- r5 x; ]2 U& d4 B U( K EXPORT EINT1_IRQHandler [WEAK]
3 ^; j7 @7 E. n" ^( q EXPORT GPABC_IRQHandler [WEAK]
0 m* w/ f* W& q- W, k& { EXPORT GPDEF_IRQHandler [WEAK]
5 L7 g5 U8 T5 G) [2 X& m( ] EXPORT PWM0_IRQHandler [WEAK]
4 K4 N1 @" E+ P EXPORT PWM1_IRQHandler [WEAK]
2 r- `5 @2 U z$ [6 ~- O EXPORT TMR0_IRQHandler [WEAK]
3 @/ _, {/ M8 W& S& u$ C EXPORT TMR1_IRQHandler [WEAK]
; q: j0 o/ D% h2 K& O EXPORT TMR2_IRQHandler [WEAK]$ y$ m: O" f( T+ T2 k B4 O
EXPORT TMR3_IRQHandler [WEAK]2 q. c8 T6 Q9 I* E( g5 T
EXPORT UART0_IRQHandler [WEAK]
6 C, x7 y0 l7 Y/ K% d1 ]4 u/ y, D EXPORT UART1_IRQHandler [WEAK]
) c' b7 F& m/ o# z/ c0 Z3 P5 } EXPORT SPI0_IRQHandler [WEAK]; m3 |" W) p, T* l B
EXPORT SPI1_IRQHandler [WEAK]
9 Q, h! q1 Y5 M6 F% m EXPORT SPI2_IRQHandler [WEAK]
4 G+ i5 r& f$ I$ j+ T EXPORT HIRC_IRQHandler [WEAK]
8 S. G0 X, W% R B& y- [+ _7 n EXPORT I2C0_IRQHandler [WEAK]
. f1 x- Z7 b1 p/ X$ z/ C EXPORT I2C1_IRQHandler [WEAK]
' R/ a u, ^3 c/ Y! J; T. U" x EXPORT SC2_IRQHandler [WEAK], L9 h; E4 d! W( _: u
EXPORT SC0_IRQHandler [WEAK]
: k- b7 X3 ^+ d6 ^! k9 Z' D: _1 k; D EXPORT SC1_IRQHandler [WEAK]' _4 z8 Q- s7 g+ N c
EXPORT USBD_IRQHandler [WEAK]/ Q( i9 b1 Y1 ^, o" W2 G/ |
EXPORT LCD_IRQHandler [WEAK]' i9 H9 ~, c2 B2 c$ ?: W
EXPORT PDMA_IRQHandler [WEAK]% h5 W( K; u# T# e. v9 u
EXPORT I2S_IRQHandler [WEAK]
3 Q* p2 L, A6 L1 m! S EXPORT PDWU_IRQHandler [WEAK]
. j" o6 G4 R y8 o9 e3 W5 ?, C+ h2 O# s EXPORT ADC_IRQHandler [WEAK]
* f3 G+ ]& o1 k8 e. L( M" K EXPORT DAC_IRQHandler [WEAK]* x6 k3 F" F6 a% ]. ?
EXPORT RTC_IRQHandler [WEAK]
, {* T* ]( n1 ^$ z! y
1 K) @9 V# K, b8 tBOD_IRQHandler
1 r9 y( G& s: sWDT_IRQHandler3 m3 Y7 Q0 q$ o& m" Y6 x; d
EINT0_IRQHandler
, `( y" U G2 r$ I( ^EINT1_IRQHandler
/ M/ N1 _- o# o: ^1 J( fGPABC_IRQHandler8 K: j, ?* R8 T2 m. H/ W
GPDEF_IRQHandler; b* }2 w. I) N
PWM0_IRQHandler
& \9 l! f9 e! Z- HPWM1_IRQHandler
0 k8 k4 z; `% P3 i0 V* t1 J8 gTMR0_IRQHandler8 e% f6 y& @3 _% `0 M* Z
TMR1_IRQHandler
2 P _4 b3 ?6 xTMR2_IRQHandler. Y1 u5 ]" c6 O1 h, J
TMR3_IRQHandler
3 k8 q* B- j" }. y) cUART0_IRQHandler7 T" r; W3 z" M; l+ d, E
UART1_IRQHandler: b+ o- m( f8 g1 ^) i+ z
SPI0_IRQHandler0 B5 Y h: k7 ~9 I3 V
SPI1_IRQHandler. n9 v% h& B s( D; r
SPI2_IRQHandler) e l2 @0 j$ r0 [/ ~- l" s! H
HIRC_IRQHandler
1 |! y& I8 u- \% M c0 n# A# Z! C: GI2C0_IRQHandler6 b6 L3 p: J, H; W# R. U
I2C1_IRQHandler
3 Q O. h" `; {2 DSC2_IRQHandler3 d( _7 b. ^+ i# ?% ~9 z: e: a
SC0_IRQHandler
' r0 H0 |, }7 Y7 ]% Y; jSC1_IRQHandler
3 k! I6 _0 I; p; a* E% m7 iUSBD_IRQHandler
3 r) ]. ~7 U4 t3 wLCD_IRQHandler' B- t/ o \8 R3 h
PDMA_IRQHandler6 W; U4 C. Y, l' O s
I2S_IRQHandler+ r/ D: ~" Y$ q/ K. @8 F; v1 L
PDWU_IRQHandler
6 t' i7 F; F' Z" a- FADC_IRQHandler* s i, l$ T/ H' {0 R
DAC_IRQHandler2 I) c" G, V) I6 j8 a- b( Q2 N
RTC_IRQHandler
3 p+ }) t2 v3 ]& h. O1 O& e B .
+ Y T) x9 a/ f2 O0 s
ENDP & z4 A4 L4 v$ O
;缺省对齐方式,具体对齐字节平台相关7 i/ T" k% Y, c; h9 w( e
ALIGN * A3 O0 d2 S, V- A
; User Initial Stack & Heap
1 S' k3 J' o" ?; v" t/ ?;宏开关,相当C语言IFDEF,定义__MICROLIB则执行,由于为定义执行ELSE分支* Q" U1 Z7 z+ C( ?7 V
IF : DEF:__MICROLIB0 @% M; T4 a4 s. g1 N
n5 T1 `$ D- c: m) K5 m EXPORT __initial_sp9 e+ G. p- I3 K# d; K
EXPORT __heap_base
; O2 R% n2 v( C$ H9 b7 X" @& v EXPORT __heap_limit
. D& c) E3 i" X / W: x g3 r+ {% ]
ELSE
, ~% P' \+ r# q* c2 o) [ ;外部申明,可用于其他地方初始化栈和堆,调用C之前必须初始化栈! C7 ?9 G( }; L6 t9 a
IMPORT __use_two_region_memory
i9 E& s: n5 Y" L, R EXPORT __user_initial_stackheap
8 ~5 N0 c9 i- Z% N1 `__user_initial_stackheap LDR R0, = Heap_Mem2 G6 P: @2 T8 J
LDR R1, =(Stack_Mem + Stack_Size)
9 m/ d$ t/ q: Z9 i. ^9 Y LDR R2, = (Heap_Mem + Heap_Size). N9 q$ k5 [0 E
LDR R3, = Stack_Mem
( @) I. g" a/ b$ s, V5 S! x7 V BX LR
, |8 } Q2 Q9 V A" I9 p ALIGN
& D/ i$ g' ]( W7 c ENDIF
: h" c* S5 D/ ]3 R7 u! U
END1 i6 U( x! K; s* R' G% W& g( [: m
( U3 _8 T- U3 G9 h! `! |" i" l0 w2 M |