|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
在ARM程序的开发中,需要大量读写硬件寄存器,尽量缩短程序的执行时间,因此部分初始化代码一般使用汇编语言来编写,比如ARM的启动代码,ARM的操作系统的移植代码等,除此之外,绝大多数代码可以使用C语言来完成。
' [$ }# f' l2 X( I% ^
6 Y* q/ S5 b/ IC语言使用的是标准的C语言,ARM的开发环境实际上就是嵌入了一个C语言的集成开发环境,只不过这个开发环境和ARM的硬件紧密相关。! A6 X$ }7 I) I3 J
0 o V6 X( p" K; i' l
ARM使用C语言编程基本规则+ u* y" l4 o1 s( t/ G E
: }/ @- \2 S- p' }* T! f4 ~在应用系统的程序设计中,若所有的编程任务均由汇编语言来完成,其工作量巨大,并且不易移植。由于ARM的程序执行速度较高,存储器的存储速度和存储量也很高,因此,C语言的特点充分发挥,使得应用程序的开发时间大为缩短,代码的移植十分方便,程序的重复使用率提高,程序架构清晰易懂,管理较为容易等等。因此,C语言的在ARM编程中具有重要地位。3 A* _5 c/ ~3 W s, M
7 D9 D/ S! o% E7 W
在ARM程序的开发中,需要大量读写硬件寄存器,尽量缩短程序的执行时间,因此部分初始化代码一般使用汇编语言来编写,比如ARM的启动代码,ARM的操作系统的移植代码等,除此之外,绝大多数代码可以使用C语言来完成。
$ U ?! E% H7 |, C
$ O7 Q& G0 Z/ s: FC语言使用的是标准的C语言,ARM的开发环境实际上就是嵌入了一个C语言的集成开发环境,只不过这个开发环境和ARM的硬件紧密相关。3 @1 Y2 L: u1 v4 i4 m" A
0 S# J1 M' p" D7 }+ t U: Y
在使用C语言时,有时要用到和汇编语言的混合编程。当汇编代码较为简洁,则可使用直接内嵌汇编的方法,否则,将汇编程序以文件的形式加入项目当中,通过ATPCS(ARM/Thumb Procedure Call Standard)的规定与C程序相互调用与访问。
, f& S3 s4 M. U! w9 q- G) f8 d8 D W* ~
ATPCS,就是ARM、Thumb的过程调用标准,它规定了一些子程序间调用的基本规则。如寄存器的使用规则,堆栈的使用规则,参数的传递规则等。- D$ G$ Q7 G6 L. U
# c [+ c) D5 D3 b# q; o! n
在C程序和ARM的汇编程序之间相互调用必须遵守ATPCS。而使用ADS的C语言编译器编译的C语言子程序满足用户指定的ATPCS的规则。但是,对于汇编语言来说,完全要依赖用户保证各个子程序遵循ATPCS的规则。具体来说,汇编语言的子程序应满足下面3个条件:4 N$ W7 N2 k* b& i8 _; e- S6 o2 \
: m$ Z8 o9 N0 M
. 在子程序编写时,必须遵守相应的ATPCS规则;
Z6 G1 j4 W; T/ ~( N5 n! q
; g/ Z1 ~& b+ E2 p) X: J. 堆栈的使用要遵守相应的ATPCS规则;' d8 Q+ c$ x* b7 d6 b* s
4 T* g( m" u$ a6 `: @9 p7 y# B1 J5 R. 在汇编编译器中使用-atpcs选项。
* g7 `6 x* p- M w/ T! y, L$ P3 A
% b& V4 f2 R+ g2 u& z基本的ATPCS规定,详情请见相关PDF文档,简单说明就是:- l4 ?$ S) X1 K }) h
/ r4 m, Z% y: Q
1. 汇编程序调用C程序2 ?! T; h4 \. f- m! v5 E
6 G' E I h5 k& P. F
. 汇编程序的设置要遵循ATPCS规则,保证程序调用时参数正确传递。$ w$ O( ?; G5 E5 @
6 r) [9 ~$ z* g. t" D
. 在汇编程序中使用IMPORT伪指令声明将要调用的C程序函数。( ]- `) p0 ]# M
0 {5 b+ v. i. c2 D. 在调用C程序时,要正确设置入口参数,然后使用BL调用。
. S3 E, Z, a0 e. [1 Y7 |- L2 l' Q E' @! f8 A9 n
2. C程序调用汇编程序
0 g+ v0 A4 d, H% i: h5 } j& ~3 A
! R- H6 n" c% o2 [" [. 汇编程序的设置要遵循ATPCS规则,保证程序调用时参数正确传递。
- f( [) x; C8 U1 B; T5 R" j, D/ d% E* E) N8 C. b# u& [: \) O! \# G
. 在汇编程序中使用EXPORT伪指令声明本子程序,使其他程序可以调用此子程序。
+ L3 i& g- F; ]7 G6 P4 r' i! @
1 w$ M9 K ^+ ~' C; ^" h* M, H. 在C语言中使用extern关键字声明外部函数(声明要调用的汇编子程序)。
D& t$ l- o( s5 K% {
; ]" x4 h% Y( g3 D: C7 }( h在C语言的环境内开发应用程序,一般需要一个汇编的启动程序,从汇编的启动程序,跳到C语言下的主程序,然后,执行C程序,在C环境下读写硬件的寄存器,一般是通过宏调用,在每个项目文件的Startup2410/INC目录下都有一个2410addr.h的头文件,那里面定义了所有关于2410的硬件寄存器的宏,对宏读写,就能操作2410的硬件,具体的编程规则同标准C语言。4 s$ R" k8 A( |
# K! b$ r$ y; a
# N6 s2 ]0 A; X0 \6 P+ c& m: _% P* H% c: k6 Q8 m; S
ARM Cortex™ 微控制器软件接口标准(CMSIS:CortexMicrocontroller Software InteRFace Standard) 是 Cortex-M 处理器系列的与供应商无关的硬件抽象层。
% z: F* l9 ]# @! g
) }! I4 ]* Q8 ~ |0 Z- Y, @9 E4 }3 Y
; [( V0 B6 V: H- {/ J5 R j; y$ J7 u! d) Q; e! E% z$ [/ q
5 M$ \% E \( G# d基于CMSIS标准的软件架构主要分为以下4层:用户应用层、操作系统及
0 c; }3 p. `+ i1 o' |" B- t" s& [3 g/ u! u) C4 G2 m3 F
中间件接口层、CMSIS层、硬件寄存器层。其中CMSIS层起着承上启下的作用:一方面该层
# P) [" U1 M/ h: | Q/ y
, ~5 @) w; E' V7 j6 Q( F对硬件寄存器层进行统一实现,屏蔽了不同厂商对Cortex‐M系列微处理器核内外设寄存器
# v) I) i$ X3 h" E. ^/ Z0 W
( Q+ Z/ c1 @9 A" A) X, O的不同定义;另一方面又向上层的操作系统及中间件接口层和应用层提供接口,简化了应用! E: A( I* {# h6 d3 d4 L0 I* W
M0 D3 p. H; M( J3 h+ I2 I0 ^程序开发难度,使开发人员能够在完全透明的情况下进行应用程序开发。也正是如此,CMSIS% `2 t( F8 Z+ R0 J1 C
* C! }. `; L5 Q7 Y2 g9 f层的实现相对复杂。: o. g* b; P# F
1 _3 |6 o- i% O$ G/ i" b. \8 M' Y' p
1 I2 V4 @) r q( A4 z& b
C- V" K0 I. L* n2 o6 u& U* \: wstm32f10x.h:CMSIS 的
9 E9 J; s5 D- l4 I, Y
4 S5 X8 ], t; u- @: g4 T7 rCortex‐M3 STM32f10xxx微3 z% f, r9 }% k* y& U1 M7 P
3 Q5 v7 k6 [ u2 ~. V控制器外设访问层头文件0 y; g- ]9 n* j% I& a: t
. [5 E3 q% s* Y8 v9 Z7 N+ Q: G
system_stm32f10x.h :
, E. A5 F: T: d1 X& G6 `% ~- n% u0 `0 J$ i
CMSIS 的 Cortex‐M3
& m% G; K; A# X# X4 y* f: b9 a: q) i$ a: f
STM32f10xxx 微控制器外. v. m0 @. m3 b
2 |& V6 X7 g7 k设访问层头文件
, B" s' ?/ ~' ?! [
; C! _3 b5 v3 J" ^' fsystem_stm32f10x.c :
5 U3 \. c2 e) X0 s8 _# P% L- x7 |* X' w
CMSIS 的 Cortex‐M3. {# Y% Q7 g" _" x* G
* C, }" m8 e8 Z3 h. u2 S
STM32f10xxx 微控制器外
: _; E0 q; d( L+ ^# p1 M
* o5 ]+ @# u5 S; t/ T6 b# a* P设访问层源文件
V! B$ q- k/ F) g0 S' u, y
( U: l/ t5 h4 A& E& o
; B0 }6 ]2 b @+ t0 {- A7 @4 F5 ?. F/ Q; y
首先新建一个项目并设置工具链对应的启动文件,可以使用标准外设库中提供的模板,也可# x# x5 j) C- u2 Z- Y! Y
) S. n9 T* s9 D' m) ], P2 |
以自己根据自己的需求新建。标准外设库中已经提供了不同工具链对应的文件,位于9 N- l' r1 F9 u8 w. t+ R
" |: r2 d9 ~, r! l. ^& _STM32F10x_StdPeriph_Lib_V3.4.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup3 P( k3 |3 M6 B, Q' N# U5 e( h' P
3 I$ P# u3 L& F1 H, H9 a9 J4 e9 x. K
- a/ ?" E% _: u @9 a0 f+ l目录下。0 V6 W% V. V: b+ ]
$ k* {9 n6 j- o2 r) @. D其次按照使用产品的具体型号选择具体的启动文件,加入工程。文件主要按照使用产品的容
7 @8 ~# Q A5 B
! [3 r, \) i% c! ~) V" g量进行区分,根据产品容量进行选择即可。
- F* H) j' F `* w" o& l
' B" P! }' q* M9 x3 K' l( ^7 V
1 a) z L# j% _/ e! a( h, [# h7 F7 x% i$ a& F6 n: `/ @; q
4 z% X c) Q& @$ z# [: Y
stm32f4xx_it.h外设中断函数文件 用户可以相应的加入自己的中断程序的代码,对于指向同一个中断向量的多个不同中断请求,用户可以通过判断外设的中断标志位来确定准确的中断源,执行相应的中断服务函数) M7 F1 }6 s- @) l. Z) D& r7 z) T
│ system_stm32f4xx.c 文件 函数Sysem_ExtMEMCtl,用来配置外部存储器控制器。它位于文件startup_stm32f10x_xx.s /.c,在跳转到main前调用 SystemFrequncy,该值代表系统时钟频率 * j3 |$ _. N* N
3 p5 ?* K: z. A% T" d% P) g$ U
/ @* S5 X2 F% i/ |
) z; p+ Y6 p) Z( v8 ?; X2 h; n& ~9 h+ T3 \
x8 O l& z- L$ F. ]Libraries\STM32F10x_StdPeriph_Driver\下的内容很好理解就是stm32的各个( y! T1 g2 m6 m9 L
8 `' T2 i" R# w2 ]. G外设模块驱动代码。
! L+ O$ o* v$ v
1 o% J* B e+ B" E3 I misc.h和misc.c是和CM3内核有关的NVIC和SysTick的驱动代码。
5 q" b$ y$ v6 J7 v6 {% g2 K* f* J6 s* \- q' r0 y( b
Libraries\CMSIS下是什么呢?cmsis英文全称:CortexMicrocontroller. E" \; w5 l; s. P$ v* W1 j
l- U2 B [/ b+ d$ V
Software Interface Standard,是Cortex系列处理器硬件抽象层,可以理解为cortex5 l. m4 M$ z+ {. Q- g
0 E y/ `" ]+ @
内核的软件接口。& Z$ }( v& X+ y! b+ t+ W( [7 t& X& c( ^
+ S3 h" b5 ~ B$ l* r+ |
core_cm3.c, core_cm3.h, z7 f1 N( i6 w8 N. b
6 P) e5 b# d/ b# R. {
它们的目录名为CoreSupport,说明这两个文件是CM3内核支撑文件,其他使( N) u4 w1 J( y; Q. R4 G8 U
- \% E" y! C& k0 N( f
用CM3内核的芯片也可以用,不一定是stm32。这两个文件用来获取设置CM3内
: ~) F2 \8 _" u) L% U8 v# @2 F9 n! Q# o+ Q" K2 V
核,配置一些内核寄存器。
6 X. x' i/ ~6 W- {& r$ C
& O9 z) V9 k9 v' Fstm32f10x.h, system_stm32f10x.c,system_stm32f10x.h和
& K3 @# ?! ^& o" G: [; d+ G, d! i9 `+ f
startup_stm32f10x_hd.s在DeviceSupport目录下,说明这几个文件是和具体的芯
# c8 X+ u- P3 A* l1 F; M4 {0 B: S' I. q4 B7 t
片有关的,也就是stm32芯片的支撑文件。其中stm32f10x.h是标准外设库的入口,' V( r% E: p, \+ M, D: E; L6 r$ R
$ a/ c$ H# P% A' y. o# m& M使用标准外设库的代码中必须包含该头文件。system_stm32f10x.c,$ Y8 b" n: i0 ^
% s! z* Q+ k* y! Y4 ^0 v' I ?1 K
system_stm32f10x.h这两个文件提供函数用来初始化stm32芯片,配置PLL、系
( C+ i8 R. g2 }/ w" T9 E e4 x; k* ^
统时钟和内置flash接口。startup_stm32f10x_hd.s是大容量型stm32芯片的启动
* q; X. D& @# D9 y, B* r8 A2 u2 R1 N. r9 ]# V
文件
5 _. r" l" W* P( U, l& ~! P4 u2 Q0 p9 m& P
" l- `/ X; n Z, [% a
( M/ F; P/ |1 _; mstm32f10x_it.c,stm32f10x_it.h是中断服务程序文件。stm32f10x_conf.h是标) B1 F# l8 }2 H) z. e- T1 S1 ^1 L6 h, ~
! m) E7 f, x2 z, [
准外设库的配置文件,对于工程中不需要的外设,可以注释掉里面的包含的头文件。
6 v8 e7 y2 b% E; o @' @( }: a
" Q2 L' q1 N% ]* D; A这里我建议先仅留下stm32f10x_gpio.h,stm32f10x_rcc.h,misc.h,用到什么再打# W9 H( {( u( ?5 F
3 k2 W* N( Z/ O/ H6 `7 g7 b! Y开什么,这样编译起来快一点,当然也可都留着。
9 N9 m$ c' I: A$ `- A# x3 b0 Q6 |* q
) p! t" J7 `$ R- }$ H
! c: U% q" y, H |
|