EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
;/******************************************************************************
1 @" _" N( B. W$ o2 U: Z9 p; * @file startup_Nano100Series.s8 V, L; p# m3 U* a0 L; [
; * @version V1.00
# l- V/ R0 V' R4 T. T; * $Revision: 3 $
; b7 l8 q8 ]' q$ N/ S: {; * $Date: 14/01/14 4:17p $
1 e! G1 R! c4 \4 G' s; * @brief CMSIS ARM Cortex-M0 Core Device Startup File
- J5 Y1 A f4 w \% L2 y+ j; *' B: W8 m# ?# G# A: a
; * @note
5 c+ R* g; ], K, @6 {9 H' X; * Copyright (C) 2013 Nuvoton Technology Corp. All rights reserved.3 ]* m, b6 U* D( L# D
;*****************************************************************************/ 6 U' n! U. }) j+ v
;首先对栈和堆的大小进行定义,并在代码区的起始处建立中断向量表,
1 l% R! X0 S9 n' G; \5 r;其第一个表项是栈顶地址,第二个表项是复位中断服务入口地址。
8 N8 i: ?' U: _2 g$ P0 h/ W8 H, k;然后在复位中断服务程序中跳转C/C++标准实时库的__main函数。
* H2 ~. h B9 ~;复位中断服务入口地址存放于0x0000_0000处。当M0遇到复位信号后,& G0 V: Z: l& c& f" [' L |
;则从0x0000000处取出复位中断服务入口地址继而执行复位中断服务程序
5 k' P. W9 e, ~* c3 u4 }2 V6 X6 f;然后跳转__main函数,最后来到C的世界。 0 T$ N- @6 n0 y: U% E0 r
; <h> Stack Configuration栈配置,为后期跳转到C语言代码存放参数,地址做准备
! r* h( Z8 ?' u0 D$ ^4 Z7 g+ K; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>' @- H6 X8 B1 O5 e0 a9 W
; </h>
7 z1 p8 C9 ?# i;EQU相当于C语言的define# X; L1 e. U# V; T5 N) r
Stack_Size EQU 0x00000500;,共1280个字节) q1 h( `. Q8 o5 N
;定义一片区域名为STACK,未初始化段,可读可写,8字节对齐1 o( u0 @6 U! n d) k
AREA STACK, NOINIT, READWRITE, ALIGN=3
3 {5 e2 ^/ A G2 O4 t# G;此指令用于分配一片连续的存储区域并初始化为0。表达式为要分配的字节数。+ T2 G* q) B2 \: ?) L7 H* N
;SPACE可用“%”来代替
: z: A+ V# j3 W' k3 rStack_Mem SPACE Stack_Size% L+ ?( ]1 |+ W. U
;__initial_sp表示一个标示,编译器计算这个标示的地址.
: ~$ R1 K; e# E/ j/ A* j__initial_sp 8 D6 `$ }" ]7 b. y& M, x2 C
; <h> Heap Configuration
3 O# h4 \+ Q6 n" n |7 Z; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
7 o8 o8 V Y/ n# z+ z9 U; </h> # Q. ^* w: t3 h. w I
Heap_Size EQU 0x00000500 ( r# b0 [; B( ~( Z( q* b; }' _+ i6 d% @
AREA HEAP, NOINIT, READWRITE, ALIGN=34 a" {: S) j+ }
__heap_base
$ s l$ W4 `9 J5 q, c# ]$ @; h V/ vHeap_Mem SPACE Heap_Size4 ?( g1 R" Z3 w1 W; x0 X9 c! _ A
__heap_limit $ e- u/ _+ e5 j/ m$ o! M' M, t
PRESERVE8
( Z# W2 o' [8 }1 v3 |4 y+ Q THUMB 3 ]( p7 c( F* i8 [, b/ F2 q
; Vector Table Mapped to Address 0 at Reset
U6 U; A; m @- e. S' e1 `;中断向量表映射到0x00,+ T0 b; F3 o1 }6 i; r
AREA RESET, DATA, READONLY
$ u: O% a$ s0 W$ ~6 y ;使编译器指定一段只读的数据段,段名为reset
! D n8 O; P2 W! y1 o/ N ;EXPORT __Vectors3 ~) I; a3 U) } c! f2 _- q5 F
;EXPORT相当于GLOBLE关键字,声明一个全局变量__vector,1 S( z3 E" J/ Z+ _; G
;DCD指令:作用是开辟一段空间,其意义等价于C语言中的地址符“&”
/ ]. C5 B8 b4 o' {;异常向量表从0x0000_0000开始,初始位置为Stack_Point所在地,
9 l0 \) a+ J4 w0 q;自动取传入的地址存入SP寄存器中,其他中断存放中断程序地址,
% E0 \ _9 Q. e0 f) M;跳转到ISR中执行程序,具体查看datasheet page 111中描述 __Vectors DCD __initial_sp ; Top of Stack
3 I# t6 w$ R& V( i/ d;取__initianl_sp地址放入0x00000000,! Y) H3 e) ^' z6 f- C, K& j
DCD Reset_Handler ; Reset Handler B0 y; j0 d! O/ \* p3 e
DCD NMI_Handler ; NMI Handler: D# z' _4 s, g$ c, ]& s) _
DCD HardFault_Handler ; Hard Fault Handler
3 T6 N( u( c1 B" Y- c DCD 0 ; Reserved: z5 m5 S! ^; ]# V8 X) T
DCD 0 ; Reserved
, Y+ z* R' E8 [9 Z% b9 s4 W DCD 0 ; Reserved
/ h" C( w3 K ~ DCD 0 ; Reserved: ^3 ?0 d O0 X$ u. K) r
DCD 0 ; Reserved6 m9 L. Q( Z8 L8 `" P% X% {: L# h- p
DCD 0 ; Reserved
& C2 o% `7 x% D( {$ v/ Z2 d" [0 H DCD 0 ; Reserved
5 l% S" w* I. ` DCD SVC_Handler ; SVCall Handler+ D, Q* r" S r; ?$ f Q- b& B
DCD 0 ; Reserved6 l' R ]! Y: y: W j2 l
DCD 0 ; Reserved
+ d# f6 M1 V8 i6 X% _% z DCD PendSV_Handler ; PendSV Handler# M8 H, b+ I) G7 e
DCD SysTick_Handler ; SysTick Handler & m. `! \" A0 f. `7 S/ @
; External Interrupts
* L6 P( ?: {* T8 G R+ E3 G DCD BOD_IRQHandler ; Brownout low voltage detected interrupt
" {) j& e" f2 w n( ?) D7 s DCD WDT_IRQHandler ; Watch Dog Timer interrupt * L' A% M3 @) c' x
DCD EINT0_IRQHandler ; External signal interrupt from PB.14 pin6 ^5 [' e# ^9 f: R% \: f
DCD EINT1_IRQHandler ; External signal interrupt from PB.15 pin
' t1 p6 s' z: u( r6 w. w3 C DCD GPABC_IRQHandler ; External interrupt from PA[15:0]/PB[15:0]/PC[15:0] 3 M. [ f" H" c. V& L Y. w
DCD GPDEF_IRQHandler ; External interrupt from PD[15:0]/PE[15:0]/PF[7:0]+ r7 T. [9 Z8 t8 x' h
DCD PWM0_IRQHandler ; PWM 0 interrupt
8 q9 y/ j0 ?+ |% ~ DCD PWM1_IRQHandler ; PWM 1 interrupt
2 i. w7 N6 P! }! p6 o, {6 F DCD TMR0_IRQHandler ; Timer 0 interrupt
% m4 e- E1 U* I3 o& ^ DCD TMR1_IRQHandler ; Timer 1 interrupt : B' k* h- }2 \6 @
DCD TMR2_IRQHandler ; Timer 2 interrupt . H4 j. s R' K+ Y# C
DCD TMR3_IRQHandler ; Timer 3 interrupt
8 C$ `) E3 Z* f1 }" x DCD UART0_IRQHandler ; UART0 interrupt( f( @0 G7 Z; c5 ~8 x5 ^. g' B" W
DCD UART1_IRQHandler ; UART1 interrupt) R+ h' v4 b3 @4 P2 N3 v
DCD SPI0_IRQHandler ; SPI0 interrupt
6 h, R% q9 C2 j% O+ d2 t' ~ DCD SPI1_IRQHandler ; SPI1 interrupt
/ ]8 x! V% n9 j DCD SPI2_IRQHandler ; SPI2 interrupt
' \% q9 j. J; b3 q! I/ a) F DCD HIRC_IRQHandler ; HIRC interrupt
5 a+ j2 `* O! Q9 l8 ? DCD I2C0_IRQHandler ; I2C0 interrupt 4 Q$ W6 I- K0 B5 V6 p: B3 U
DCD I2C1_IRQHandler ; I2C1 interrupt , r1 U9 ?" z) z# D/ D
DCD SC2_IRQHandler ; SC2 interrupt5 a. Z: v$ ^* u2 S9 w
DCD SC0_IRQHandler ; SC0 interrupt+ X, d8 {* u+ Y2 Q- e8 |7 c
DCD SC1_IRQHandler ; SC1 interrupt* x. ^) v1 y) a2 J: K3 E) a4 Y
DCD USBD_IRQHandler ; USB FS Device interrupt 1 Z0 w, \) `& v2 x
DCD 0 ; Reserved
1 h+ Z- P4 j6 {7 b DCD LCD_IRQHandler ; LCD interrupt
7 Y _" G* S* _" U3 U B6 i DCD PDMA_IRQHandler ; PDMA interrupt* i {' ^4 M% h2 {# u! N; i
DCD I2S_IRQHandler ; I2S interrupt ' l/ x1 [- c. Y# U0 G/ D
DCD PDWU_IRQHandler ; Power Down Wake up interrupt
- y0 T/ H5 B: \+ w# R0 M DCD ADC_IRQHandler ; ADC interrupt6 D! P' Y% _3 w5 J. B
DCD DAC_IRQHandler ; DAC interrupt/ a; @1 x5 m3 N. t3 k i
DCD RTC_IRQHandler ; Real time clock interrupt
0 j5 l# O* f' L8 H/ h AREA |.text|, CODE, READONLY 9 s% m% \& a7 h
; Reset Handler
/ H/ g1 c6 \, t6 p8 p$ n, F;汇编伪指令PROC ENDP 提示编译器子程序开始和结束 5 g4 X9 E0 l" A# _" D
Reset_Handler PROC* } z7 N( ^) y$ z# [3 ]* z
;定义全局变量 Reset_Handle [WEAK]表示弱定义可在其他地方优先6 e# d; s2 D2 G" B9 e" w4 z
;以便在C中调用Reset_Handle,有利于后期编写复位程序7 e; m3 @8 y0 H
EXPORT Reset_Handler [WEAK] $ h6 p7 T/ A8 s. \! h' n2 G" y
;申明main,main在外部定义 7 S0 R# E6 m- K$ o# l; g( |
IMPORT __main
5 C2 z* G$ {! J" Y0 n ;伪指令,提示编译器main标示在外部定义- C1 A5 E9 ?+ { @- j8 N. @
; 解锁保护寄存器。向RegLockAddr连续写入0x59,0x16,0x88解锁
' O% T4 x! g8 r& B LDR R0, =0x50000100
/ e8 B0 W ?6 A; V LDR R1, =0x59
+ m Z/ n: U. ? STR R1, [R0]
; ?; z2 G9 c D( x M4 F- U LDR R1, =0x16; R& o& \9 _' E' Q
STR R1, [R0]! ~, Y: h1 t8 y" q$ S7 e K: F1 p
LDR R1, =0x889 l' n3 ~0 P: n. W* [5 K
STR R1, [R0] * \9 W! G2 [, B( `, ]4 A
; Init POR具体看手册,4 ~# r6 \' g5 Q- p
LDR R2, =0x500000603 j7 E6 V' e% V. w9 s7 w- E
LDR R1, =0x00005AA5" ~" K7 Q1 H1 p) l3 O0 d! j
STR R1, [R2] : H& R- m! f% j' U4 w; E" c: e( m
; Lock register写0,锁住保护寄存器
4 S- s9 ~$ h: c3 K4 R9 f) |( j7 j MOVS R1, #00 L/ t7 i4 f. d
STR R1, [R0]
6 N* c" Y6 G- Y9 J8 u3 z LDR R0, =__main- T6 O$ z* }1 G+ M
;伪指令,将main地址存入R0中
! B; V' v# D+ ]) j+ K) o* R9 R' C BX R0
& A; V9 n7 t' b ;跳转到R0所在地址的位置,即__main所在程序,BX跳转且切换指令集" d/ w% t E- X
ENDP
* N2 E9 J3 b& y$ [
; Dummy Exception Handlers (infinite loops which can be modified)
9 `: Q% _; u/ I% d5 ?( B0 H0 M;其他中断入口程序,弱定义,进入死循环,以便后期C程序编写中断子程序1 l/ [5 K+ n9 J; ]" B( {. j! x& k
NMI_Handler PROC
- \5 }6 m! w: P1 r. b! b4 w% b2 K EXPORT NMI_Handler [WEAK]
3 P% D- V ?0 N+ g+ W B .
7 b5 ]) ?; I1 ~9 ~+ _ ENDP$ Z4 e- U# ~9 P1 L3 L) Q
HardFault_Handler\;连接符1 p+ r! T3 N$ ]- }$ B2 |: V
PROC* D6 H( m: a V% W H
EXPORT HardFault_Handler [WEAK]
$ B3 E) c& j, } B .
; I* e8 W: W! x1 S* y7 B/ R ENDP
( | P) F- U9 u: E% c) N! a. PSVC_Handler PROC
1 K" e: F: C9 N* r1 l0 ^ EXPORT SVC_Handler [WEAK], W7 F5 M) w& m8 N
B .) z& k3 y& z. j
ENDP# E# u4 i) U9 l1 S3 ?6 z7 w
PendSV_Handler PROC4 E8 e- t- m; a" s
EXPORT PendSV_Handler [WEAK]3 a5 s7 |2 ~+ A( f
B .
' S' p4 `& v" G$ k' V. o ENDP
6 _) U2 L9 g9 X- w$ g& F. I5 KSysTick_Handler PROC4 ~1 m, m0 J3 X5 Y6 v6 V
EXPORT SysTick_Handler [WEAK]
% v* M5 L+ l6 w8 T! Y" A6 k B .0 a5 h7 U) O# Y1 y; B
ENDP" C9 M6 P7 S0 e. ]8 b% X% C
;缺省中断。不写
% Q& } t4 I% Q# ^% @Default_Handler PROC , y: p: Y& ^3 x- U( w* N
EXPORT BOD_IRQHandler [WEAK]) ]" B$ ?% D/ T* g! f* F! R5 \+ d
EXPORT WDT_IRQHandler [WEAK]1 [8 m* w% ]. x- X: J" l
EXPORT EINT0_IRQHandler [WEAK]
9 O) @7 ]. T" N% x& Y1 a EXPORT EINT1_IRQHandler [WEAK]6 O$ ]7 s4 _3 p$ \' L% p
EXPORT GPABC_IRQHandler [WEAK]
) a, D% v3 G1 I EXPORT GPDEF_IRQHandler [WEAK]
2 ^5 e0 i2 ~% ^% c5 @& w, S EXPORT PWM0_IRQHandler [WEAK]7 ^6 D0 c1 }& k1 O0 A" U6 o; a
EXPORT PWM1_IRQHandler [WEAK]' n. g" }$ R" D+ _" n4 M: a
EXPORT TMR0_IRQHandler [WEAK]* C) x" B6 ~* n0 o; D; t3 y
EXPORT TMR1_IRQHandler [WEAK]1 W' _4 ?- t- ~
EXPORT TMR2_IRQHandler [WEAK]: \6 \3 M9 M: R' R1 X& w
EXPORT TMR3_IRQHandler [WEAK]
) ~* w% `3 @0 c [" ~/ o0 a1 m EXPORT UART0_IRQHandler [WEAK]* W( S8 L" H& c5 B2 t7 |
EXPORT UART1_IRQHandler [WEAK]3 P5 x3 x8 O, q. q& [6 K# [
EXPORT SPI0_IRQHandler [WEAK]: a6 @0 R: w; }& L* |1 J
EXPORT SPI1_IRQHandler [WEAK]' M0 D- {( f* I# q5 ]) X
EXPORT SPI2_IRQHandler [WEAK]
0 M+ L2 O* `5 l+ E& X+ i4 M EXPORT HIRC_IRQHandler [WEAK]) F0 A0 B" W' L' i. M- D% ?
EXPORT I2C0_IRQHandler [WEAK]
4 ^9 a5 u( i! h EXPORT I2C1_IRQHandler [WEAK]
! d; X; G% D7 e EXPORT SC2_IRQHandler [WEAK]% n) V! v1 C$ o4 t1 a
EXPORT SC0_IRQHandler [WEAK], K, o3 e2 E8 }
EXPORT SC1_IRQHandler [WEAK]. M9 r$ s a# G1 J% i
EXPORT USBD_IRQHandler [WEAK]
6 D" J! Q$ U' m EXPORT LCD_IRQHandler [WEAK]4 v% \' {9 Z+ q8 A9 Z( L* H
EXPORT PDMA_IRQHandler [WEAK]
7 g* c6 X4 n' |. J7 s: K( q EXPORT I2S_IRQHandler [WEAK]$ X$ V4 n# O$ L3 F r: L
EXPORT PDWU_IRQHandler [WEAK]
/ C# p; ?+ P: d6 r8 m; U9 ` EXPORT ADC_IRQHandler [WEAK]5 _! o1 A* T1 w, E) F% {1 L
EXPORT DAC_IRQHandler [WEAK]# x5 Y6 X s, L( }& G
EXPORT RTC_IRQHandler [WEAK]
) Q! m! e) y$ L# k! t # b' u3 o4 I7 f7 `8 H
BOD_IRQHandler+ n y% i% v5 w, ^# I2 u: v0 R
WDT_IRQHandler
# X3 i( N9 |" z& Z5 \. dEINT0_IRQHandler0 u2 I7 Y. W% K; O4 f
EINT1_IRQHandler+ R- A! l' O. _3 w4 k9 b6 p+ v
GPABC_IRQHandler/ ^# Y! ~+ b9 _, b1 B8 ~: Z! q
GPDEF_IRQHandler
' U, R! I- r; i1 e# HPWM0_IRQHandler
" u9 M/ G8 r- v* R" Z# y1 H" }PWM1_IRQHandler
3 I' o: T+ r! m6 u0 T2 fTMR0_IRQHandler7 n# E" M9 z0 {1 k
TMR1_IRQHandler# K0 y2 Y0 z; |- a0 a
TMR2_IRQHandler9 |; A6 d: k' \) F! n$ @
TMR3_IRQHandler" p$ X3 a% {' R$ G1 j; J
UART0_IRQHandler
1 ` O! P5 j1 A. u) ~UART1_IRQHandler
$ D7 N: Q- k* u$ T* iSPI0_IRQHandler/ P1 R7 f5 d Q; a$ | u7 Q
SPI1_IRQHandler
+ E W$ }# W" gSPI2_IRQHandler i* g+ V2 y) Q; [. _) U9 l
HIRC_IRQHandler
; v/ D7 W+ r6 x4 |# o2 j8 V2 fI2C0_IRQHandler
$ D! s5 Y0 S* k/ |- |I2C1_IRQHandler
' P0 J. y' G6 M8 B! |SC2_IRQHandler
} h: R+ C* aSC0_IRQHandler : F2 g9 H E% T5 b7 h0 f: t3 E% ~
SC1_IRQHandler2 M" J" s) L0 j& X7 t& W; C
USBD_IRQHandler! S# d7 L. |! `6 v5 V: f5 Q
LCD_IRQHandler( K) M: d5 c, c& ~) A" |3 x$ F
PDMA_IRQHandler7 f( v% @2 C4 R6 b7 _
I2S_IRQHandler
* T2 g9 ~9 G; U$ VPDWU_IRQHandler- B6 y( |3 q! S, c7 a3 a A" _, e* ~
ADC_IRQHandler8 [$ x- e$ Q( d7 h/ m r Q/ R" B
DAC_IRQHandler
7 j. I# V0 C* S6 x7 ^ VRTC_IRQHandler 8 P3 b2 i/ j7 e
B . 7 Q; b8 w7 L4 d. T
ENDP
8 ]. y8 [* t4 `6 R. r; x0 j* c# I6 g;缺省对齐方式,具体对齐字节平台相关' n/ e( X( N# C4 R8 D9 a1 G- k
ALIGN
7 d1 s3 ?8 Y) N8 q6 Q) P. x O5 i
; User Initial Stack & Heap
( p' [$ o/ c, g. c/ o. M9 |; I;宏开关,相当C语言IFDEF,定义__MICROLIB则执行,由于为定义执行ELSE分支
9 p F/ X+ U8 Z# V IF : DEF:__MICROLIB
* i# D9 d! R; H3 S
2 D8 c& g+ ~; s2 x, _+ A- X% M/ h EXPORT __initial_sp5 U1 a) X5 A& I$ A p; b& ^
EXPORT __heap_base
4 S* ~2 O( c6 ]- F EXPORT __heap_limit
! |/ `4 R0 A1 D: [0 U8 L3 u" r7 b 5 ^9 I/ Z) a9 k) i# t: h% G/ T$ K% S/ A
ELSE
% E4 _# x& }1 e- `/ L ;外部申明,可用于其他地方初始化栈和堆,调用C之前必须初始化栈
2 G, I4 ]% W, I1 [7 M; Z IMPORT __use_two_region_memory6 ]. [5 [$ H& j1 x
EXPORT __user_initial_stackheap
7 L7 q# t6 s8 ]3 X! H7 g8 O a- C__user_initial_stackheap LDR R0, = Heap_Mem) [1 y6 y" K2 t3 S# z
LDR R1, =(Stack_Mem + Stack_Size)
- A6 |. B; y$ M. a! r LDR R2, = (Heap_Mem + Heap_Size)! @* p2 x3 g9 c: R
LDR R3, = Stack_Mem
! h- q7 T7 U _. H6 L7 K5 u BX LR
4 k' D$ _3 H5 x! i6 X ALIGN
! K: Q" t% h1 W! ]3 f ENDIF
2 X/ @7 ^& P& o. e$ H
END
2 n' P& @/ P+ I4 R3 P* u- O4 Z 1 G1 }6 d) o E& h3 z& C
|