|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
在ARM程序的开发中,需要大量读写硬件寄存器,尽量缩短程序的执行时间,因此部分初始化代码一般使用汇编语言来编写,比如ARM的启动代码,ARM的操作系统的移植代码等,除此之外,绝大多数代码可以使用C语言来完成。7 u7 [+ g/ W+ }6 S0 ]
; E$ S) G' v5 ]6 B: s
C语言使用的是标准的C语言,ARM的开发环境实际上就是嵌入了一个C语言的集成开发环境,只不过这个开发环境和ARM的硬件紧密相关。
! E2 T6 r6 W$ @* a6 c. ~5 X4 o9 G% m4 I
ARM使用C语言编程基本规则- c( L3 g9 N& @3 ?9 i
" ?" P4 _# d- I. s# V1 S: F) O2 V在应用系统的程序设计中,若所有的编程任务均由汇编语言来完成,其工作量巨大,并且不易移植。由于ARM的程序执行速度较高,存储器的存储速度和存储量也很高,因此,C语言的特点充分发挥,使得应用程序的开发时间大为缩短,代码的移植十分方便,程序的重复使用率提高,程序架构清晰易懂,管理较为容易等等。因此,C语言的在ARM编程中具有重要地位。
4 \8 j$ F' U' y; E6 U. z
4 j, G& d2 S: I( Q: u3 T在ARM程序的开发中,需要大量读写硬件寄存器,尽量缩短程序的执行时间,因此部分初始化代码一般使用汇编语言来编写,比如ARM的启动代码,ARM的操作系统的移植代码等,除此之外,绝大多数代码可以使用C语言来完成。1 T, R6 S* ^$ L; H2 c
/ e7 v: Q! v6 r- G2 G! T; v Z: X
C语言使用的是标准的C语言,ARM的开发环境实际上就是嵌入了一个C语言的集成开发环境,只不过这个开发环境和ARM的硬件紧密相关。) W) z" y; t/ B8 n |1 a% w
/ j3 C/ ~& F2 z6 p5 r8 w2 @
在使用C语言时,有时要用到和汇编语言的混合编程。当汇编代码较为简洁,则可使用直接内嵌汇编的方法,否则,将汇编程序以文件的形式加入项目当中,通过ATPCS(ARM/Thumb Procedure Call Standard)的规定与C程序相互调用与访问。, p+ W* X9 Q% t5 I1 W. h+ j
2 d+ }* i, t- C
ATPCS,就是ARM、Thumb的过程调用标准,它规定了一些子程序间调用的基本规则。如寄存器的使用规则,堆栈的使用规则,参数的传递规则等。* r" \9 Y h+ T8 N& Y+ y5 G/ S6 X" A* C
3 m* j6 O1 b3 z9 D" z在C程序和ARM的汇编程序之间相互调用必须遵守ATPCS。而使用ADS的C语言编译器编译的C语言子程序满足用户指定的ATPCS的规则。但是,对于汇编语言来说,完全要依赖用户保证各个子程序遵循ATPCS的规则。具体来说,汇编语言的子程序应满足下面3个条件:( B" C! d7 T, w" |% ]* Y5 j
# r# B& E# p6 N F' a
. 在子程序编写时,必须遵守相应的ATPCS规则;
. x/ m; z& R) N* S$ V4 }
5 F( U( [" f8 E2 C& F* S& `. 堆栈的使用要遵守相应的ATPCS规则;5 g3 B% |- s4 H7 b \& ]1 L
q$ u6 B7 S% S+ r H. 在汇编编译器中使用-atpcs选项。: q Q% o& t+ G4 s
# I& V+ a/ D$ f9 D! O9 O基本的ATPCS规定,详情请见相关PDF文档,简单说明就是:% X7 a# ~ \7 f
- _6 d. V( G0 D1. 汇编程序调用C程序
: g5 E0 @, [6 @$ V: U
6 M e+ I- F* L g. 汇编程序的设置要遵循ATPCS规则,保证程序调用时参数正确传递。
. U2 i3 @' b& e& j0 Z$ U* y
3 u( K3 _& \) C: q. 在汇编程序中使用IMPORT伪指令声明将要调用的C程序函数。
' I* ] S/ N. O. R, a( D' E* R, J! c' F7 I
. 在调用C程序时,要正确设置入口参数,然后使用BL调用。" f& x8 ^# c5 F* _1 b4 ?$ \
( o1 ]+ s5 z' d7 r5 _9 V
2. C程序调用汇编程序, h5 p& d+ K- z; X' l5 _# `
8 L% {5 O% e6 \- V: R: K* I. 汇编程序的设置要遵循ATPCS规则,保证程序调用时参数正确传递。+ Y/ ~9 a1 \8 Y0 i
: x; s1 S& }0 M1 G& U% V* x- ^9 p. 在汇编程序中使用EXPORT伪指令声明本子程序,使其他程序可以调用此子程序。0 @0 G: F: H* L B+ I
+ ?: _* s: x1 m. b) p# u; \0 v# W( B. 在C语言中使用extern关键字声明外部函数(声明要调用的汇编子程序)。
, G- ? [% g2 ?0 X% _5 n7 Y3 g* T7 C1 r9 ?9 q
在C语言的环境内开发应用程序,一般需要一个汇编的启动程序,从汇编的启动程序,跳到C语言下的主程序,然后,执行C程序,在C环境下读写硬件的寄存器,一般是通过宏调用,在每个项目文件的Startup2410/INC目录下都有一个2410addr.h的头文件,那里面定义了所有关于2410的硬件寄存器的宏,对宏读写,就能操作2410的硬件,具体的编程规则同标准C语言。
1 K( t6 }+ q2 k( z
. M' }0 ]8 l8 T) R) Q! ]7 P
0 \1 ^) k* l7 y& g& v5 [- V8 Q9 @' }2 f. V
ARM Cortex™ 微控制器软件接口标准(CMSIS:CortexMicrocontroller Software InteRFace Standard) 是 Cortex-M 处理器系列的与供应商无关的硬件抽象层。: K9 V( a4 R7 F! A1 [
- s5 V8 V* w; A$ S$ E% F& ^1 c6 C6 H# j! x6 e5 w2 ?6 e4 Y
# M0 L' T" W+ p4 L, w' K
+ G& e8 O) w* Y, P( z+ t7 v8 ], }% ?% ]3 i+ }* M" r; V1 K4 X5 C! ?
基于CMSIS标准的软件架构主要分为以下4层:用户应用层、操作系统及 D8 m4 Z; _2 D: V
; M9 u) G$ l: q7 h. U中间件接口层、CMSIS层、硬件寄存器层。其中CMSIS层起着承上启下的作用:一方面该层
- i6 S8 Y) Y, ^- U9 U
' o' A7 J0 w8 }/ t6 d( |- B' g% F对硬件寄存器层进行统一实现,屏蔽了不同厂商对Cortex‐M系列微处理器核内外设寄存器6 l2 G3 u" H) Q5 D: p) v- M
4 I" Q6 H* P0 T1 n9 X2 T
的不同定义;另一方面又向上层的操作系统及中间件接口层和应用层提供接口,简化了应用* z6 s, H9 z- c! ~3 V, H
, ^3 m8 N! c( Z" e程序开发难度,使开发人员能够在完全透明的情况下进行应用程序开发。也正是如此,CMSIS
4 b. E) I# J1 M9 `4 v0 D1 U8 U5 |! M* S& h& y' s g- n0 \
层的实现相对复杂。
9 w) F+ \3 Z8 |6 [; a" L9 T( ^5 T) F! i5 w" @4 e) g- c7 \1 m" h h+ P
! i, w: @2 Z/ ?) ~, n
" ^, @8 Q/ p) Kstm32f10x.h:CMSIS 的
h& l: B& \: A# k
/ e+ W$ S. h7 z! VCortex‐M3 STM32f10xxx微* c2 R" O( p4 y" k0 A; I8 G! z
: v/ T" h$ m5 L; r4 e控制器外设访问层头文件
, e. F; A, O. Q6 |2 m( G/ ^: D# [9 u
system_stm32f10x.h :
. J# E4 B* D& k I! \6 C8 G; W) h& y. a! v
CMSIS 的 Cortex‐M33 s( F Z' M$ f! v K& l
, B* ?) T% t. sSTM32f10xxx 微控制器外
* V' @. ^) N2 G G/ D4 n% |& M" J* F7 e- x0 z6 Y% l! s) Q
设访问层头文件
9 t D' t& J6 y7 h" R% ^9 h4 n" b/ p( |$ ?2 u. g8 T2 ~
system_stm32f10x.c :
7 D+ I0 H9 U; |! o9 u5 g" _% Q- B; @# ?7 V
CMSIS 的 Cortex‐M3
0 R! D" R- C. N+ C- N' W% g& Z- Q1 g1 ~
STM32f10xxx 微控制器外. Q' {" P7 N$ _8 b
& ^9 b$ O- H, A9 ~; B2 \设访问层源文件
9 a* W6 x& f" j5 Z+ m5 ? s& k9 t; _7 m1 u2 t
/ [4 {) R4 P) V2 ~2 d! Y, `5 `% j/ O4 I f
首先新建一个项目并设置工具链对应的启动文件,可以使用标准外设库中提供的模板,也可9 a6 L2 `7 ^+ h; b: N! b a
) c. k3 x& G5 b) l+ ^' a: J
以自己根据自己的需求新建。标准外设库中已经提供了不同工具链对应的文件,位于6 Y4 F) P& | [& R. G! E
6 c( x: }; u. N
STM32F10x_StdPeriph_Lib_V3.4.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup: W7 V! p# z% }$ a, R1 }
$ p( v' d4 L e I; F* U' A
3 f$ F' k1 B- v+ I
0 D' a- X5 m/ g& A目录下。/ D& X, }8 x+ a0 u3 T
6 M8 w; x- C: e* c( a1 A, X! J: v3 L其次按照使用产品的具体型号选择具体的启动文件,加入工程。文件主要按照使用产品的容 n5 R8 f2 Z# s# K, y7 c, N$ i
) }9 p0 Y. ?; s! P8 c* M( O量进行区分,根据产品容量进行选择即可。2 U3 e% v" t7 g4 F: f; B
. G+ l0 h3 A# i3 w0 f* j- d
# l; `8 ]7 f/ M/ ^7 j1 B3 _% J0 h: @' f0 @& F. t
+ Y/ A6 p9 x7 P2 q# h& d z A8 `
/ t/ p! x& I9 r' n" ~stm32f4xx_it.h外设中断函数文件 用户可以相应的加入自己的中断程序的代码,对于指向同一个中断向量的多个不同中断请求,用户可以通过判断外设的中断标志位来确定准确的中断源,执行相应的中断服务函数
/ ^3 _; b, b3 k│ system_stm32f4xx.c 文件 函数Sysem_ExtMEMCtl,用来配置外部存储器控制器。它位于文件startup_stm32f10x_xx.s /.c,在跳转到main前调用 SystemFrequncy,该值代表系统时钟频率 % F1 t& @* p/ J8 y# r a
P5 D0 v1 Z& `+ e+ A$ Z. m' T
1 e9 y8 d* L. D( x1 O5 Q! F4 r# @/ j
. @1 q. n4 Q4 q3 T% U! C' U% E: M, D% _1 X. ~
% j5 R! g$ C2 z4 S8 R* S+ TLibraries\STM32F10x_StdPeriph_Driver\下的内容很好理解就是stm32的各个) V, Z: u- w# D
8 C n5 S. k+ j3 j外设模块驱动代码。
5 ~8 N9 K: Z) X* D0 X. l
1 ~, G! |0 j# R* u7 o misc.h和misc.c是和CM3内核有关的NVIC和SysTick的驱动代码。
& e. s8 A, F- g/ x
( j4 {* u8 _# c& O& ~6 t Libraries\CMSIS下是什么呢?cmsis英文全称:CortexMicrocontroller
/ E7 D$ j; i9 a4 T7 O; Z$ R" @+ c: I- |: e; z# b$ x( E
Software Interface Standard,是Cortex系列处理器硬件抽象层,可以理解为cortex
# W. o0 o# Y# A* L: o+ U9 ?4 N! b
" U* K! i/ ]% q% a9 J. `+ S内核的软件接口。
! }: s0 U w" p# `) x
' {* l/ N! b9 i( m/ _ core_cm3.c, core_cm3.h
3 S* d) E2 }8 J! |7 Q- r5 B' d
' r) e& ]& Z( B) u, S- X. z8 R它们的目录名为CoreSupport,说明这两个文件是CM3内核支撑文件,其他使" c4 [6 l Q! e. E* @
8 }- V( T$ J6 x用CM3内核的芯片也可以用,不一定是stm32。这两个文件用来获取设置CM3内
+ W: w6 o- C# b8 m
6 R# L+ A) j9 c5 V! V0 u" X核,配置一些内核寄存器。* Q! C# P, e4 s' ~( M: T
' R" F8 d ^" c) r% pstm32f10x.h, system_stm32f10x.c,system_stm32f10x.h和
4 P5 T% J! C# B- U8 M0 _ F7 r, I* W& r2 D4 c
startup_stm32f10x_hd.s在DeviceSupport目录下,说明这几个文件是和具体的芯7 H+ E8 `$ S1 e$ }3 H' E6 @; p
0 p- U+ w$ G; J z# x K: C+ p" P
片有关的,也就是stm32芯片的支撑文件。其中stm32f10x.h是标准外设库的入口,
5 {1 V7 R' F" P1 `4 n3 [, |5 `
# Y9 f0 b' T `使用标准外设库的代码中必须包含该头文件。system_stm32f10x.c,, ^6 k& W# {1 h8 U: I4 H
: G; W/ E- B! D. S( i" D7 bsystem_stm32f10x.h这两个文件提供函数用来初始化stm32芯片,配置PLL、系: ]5 l( ~! }: e8 m" I" \
4 J) w1 s4 V: K% b2 U8 L
统时钟和内置flash接口。startup_stm32f10x_hd.s是大容量型stm32芯片的启动
% h8 ?0 q! z) w. |4 l2 J. Z8 o
文件
5 ]) B, t4 ~' R6 P+ G
7 n6 I; D. d9 H; P* U5 k5 {; b* ?6 s7 Z7 Q- ~$ f) {4 Q
8 V' k4 q d0 K/ r# X) B0 zstm32f10x_it.c,stm32f10x_it.h是中断服务程序文件。stm32f10x_conf.h是标/ {2 f; h- C' |
1 }( Y1 t: R5 w' X# ]1 Y6 t( q2 m
准外设库的配置文件,对于工程中不需要的外设,可以注释掉里面的包含的头文件。
. ?( }) Q. ^+ S& v* D' b8 n# m' a- s
# v1 [9 E4 C: P* u7 U: @/ `2 _这里我建议先仅留下stm32f10x_gpio.h,stm32f10x_rcc.h,misc.h,用到什么再打
l" _" Y+ W3 ^2 \5 e9 |9 T6 O; b/ e' I; V# S' L
开什么,这样编译起来快一点,当然也可都留着。8 @$ h. Y9 f" o2 m- U8 g
2 E' {. S" B5 c
2 D6 Z- U* W- G3 Q W3 m' b0 d
& N7 P& L! m- G9 X t5 u |
|