你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】【stm32】stm32f1代码中core_cm3、system_stm32f10x、stm32f10x_conf、stm32f10x等文件的作用

[复制链接]
STMCU小助手 发布时间:2021-11-28 22:00
1. 前言: n# X  e) S' v) _$ r) u5 E
随便找了一个以前写的Stm32的demo来练练手。
0 k) d+ I! F( H1 L顺便先整理一下工程里面一些文件的作用,一直都是从DEMO中直接拿来用,还没有认真的理过。
5 C: m. @" ]+ ?* x9 lmisc.c
; M7 c8 i9 n3 A/ {3 n; Wcore_cm3.c/h: s$ p& H5 s9 S! I3 I: E
startup_stm32f10x_hd.s  {# X4 f6 l  c9 f( n( u9 j9 Z
stm32f10x_conf.h  q5 B# }. E) L7 v/ H4 z
stm32f10x_it.c/h
4 A6 `7 p1 d. X: N* o# q& hsystem_stm32f10x.c/h9 s4 `4 y) n; N
stm32f10x.h* R  t4 _  M& x
2. ST一些容易混淆的文件作用, B& y# R& h9 s( ?- X# c: Z7 I
2.1 ST 3.5标准库: V2 C  f7 f' b5 X
标准库3.5可以从官网下载,也可以从CSDN(搜STM32F10x_StdPeriph_Lib_V3.5.0即可)下载。注意,要下载原版,而不是别人移植过的,这样对比你才知道改了什么。5 U& H4 g0 w+ M/ f

4 p% L2 x4 w3 a6 Z1 w( V5 ^; Z在ST3.5库的使用中,大家会发现,除了把STM32F10x_StdPeriph_Driver的官方发布的库中的一些类似于stm32f10x_adc.c这样的stm32f10x_xxx.c和.h导入工程之外,还有另外几个文件,也需要导入工程才能使用,类似下图:! r( o7 R0 p+ S9 N7 o" Z
20200205154125515.png

; p) F: D2 N1 {) H. n5 {& p
: z7 |8 s7 p, O' \; L1 v% j# I( |6 E类似misc.c,命名比较特殊,还有core_cm3.c,system_stm32f10x.c等等?
& n  ^7 ~2 i, W4 ~7 i0 q' y8 Y0 J9 r2 m( ]
那这几个文件,是从哪里来的?做什么用的?
7 k' S& N2 X( k8 x1 y9 k
7 m5 w  L: l* f4 E8 S* n" i; x; j让我们把这些特殊的文件列一下,缕一下来龙去脉。
% S9 T  j+ c& W- ^/ cmisc.c
# l- n/ c: A' [+ q& ^+ Pcore_cm3.c/h! u3 k/ Y: o5 ?- V+ c& x
system_stm32f10x.c/h; Z0 v% [$ ?* p% N
startup_stm32f10x_hd.s+ P& D, J8 H# G1 m2 z( `( ]8 C
stm32f10x_conf.h( M! I( Z- V. j6 f3 l; Y4 c9 C8 `
stm32f10x_it.c/h+ v+ t0 l) E) l9 {  r
stm32f10x.h
) j/ O9 U: b* p6 G8 S3 D# b一张别人的图。
' G% G9 \5 Y- S0 m' H9 d
1 n- \8 a' w  y6 c
20200205165614129.png
0 ]# P6 {  X. O; ]: ~! Y4 J9 ~6 t

( n% H( w4 r1 U" E1. misc.c7 g# V* f; K4 ^0 K! g. x6 S
misc.c的关系比较好理,是属于3.5标准库的一员。8 r* G% e/ y$ |3 l) }, L/ x# e  P
因为STM32 V3.5版本的库函数中没有原来版本中单独对于NVIC(中断向量嵌套)的外设驱动,把NVIC的外设驱动放在了misc.c中,实际上是代替原来的stm32f10x_nvic.c。/ l5 B0 o8 f! P1 B
从misc.c的发布位置就能看出,这个文件是和其他的stm32f10x_xxx.c是在一起的,只是名字风格不同而已。路径在:
2 j0 W6 |; F: K" ~/ t5 N+ D- c
" B( O4 L. V% q& mSTM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver\src  z, a" H3 K2 J- H5 J

8 N2 ?9 K# ^! i
20200205153624434.png
$ `* W/ W/ m0 p( v4 }7 z" j
4 ?" I" b% k3 z  ?% }
2. core_cm3.c/h 和 system_stm32f10x.c/h/ a- g' e& u' O1 n! m
core_cm3.c/h和 system_stm32f10x.c/h是内核支持API,由内核公司(ARM)提供,随着3.5的标准库同步发布,路径分别在
6 y) ^- L3 Y# c7 {' i9 L* |1 f; G  U! E6 n' f  @
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport
8 Y6 C2 s: B8 r3 M0 e& i& jSTM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x
7 R' ?8 ~. h& W3 Z插一段话介绍下作用:) A: V) e" n  y4 w& w7 i3 E
! d' x9 W+ l" F+ o; Q4 K4 C# W
CMSIS是Cortex微控制器软件接口标准(Cortex MicroController Software Interface Standard)的缩写,这个是ARM定制的一个用于Cortex-M系列的一个标准,主要是为了提供通用api接口来访问内核和一些片上外设,提高代码的可移植性。
' w& y" T3 x* G$ s! H+ hCMSIS有三个层:核内外设访问层Core Peripheral Access Layer(CPAL),中间件访问层Middleware Access Layer(MWAL),设备访问层(Device Peripheral Access Layer)。
0 S* A( E1 n5 L4 I* e8 x4 GCPAL用于访问内核的寄存器和组件,如NVIC,调试系统等。该层是由ARM实现的。( r; [- y) l1 q! F6 _3 ?8 o
MWAL用于对中间件的访问,现在该层还未实现。(也不知道所谓的中间件是什么东西)。4 }: D3 a8 L* H5 \- c$ a: g8 W
DPAL用于定义一些硬件寄存器的地址和一些外设访问函数,由芯片制造商实现。" f3 J( ~5 U' I2 d$ R
CPAL层的实现就是Core_cm3.c文件,DPAL层的实现就是system_stm32f10x.c文件(似乎还应该加上外设的函数库)8 L  [) }9 @3 k! \" i
. c  V; {5 @! g! Z
3. startup_stm32f10x_hd.s
' @" m6 J3 N% Z启动代码,由内核公司(ARM)提供,随着3.5的标准库同步发布,路径在:7 I2 }/ _# V+ P0 t/ i0 Q
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm: `0 `, y# y" h+ B
可以使用提供的,也可以自己修改。
3 S) l; \, S& b* B
" G+ Q( s0 L: D: R4. stm32f10x_conf.h + stm32f10x_it.c/h8 B: r* V% c" m) L" a" C6 G  l' e
这几个文件在ST官方发布3.5库的时候,并没有放在库代码里,而是放在工程应用层代码里。
% N! }0 r/ W, u7 w比如:( ^$ \3 J+ s, M
3 d6 g. }. P! Z
STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\USART\Printf
) ?& f- Z! M, }6 b8 u即放在了对应的项目工程中。. I9 I$ z( B+ A" e! Q* d
这么放其实是对的,因为其他的库函数接口是不会变化的,在用户实际使用过程中是不需要改动的,但是,这几个文件,虽然也是ST提供的,但是实际使用中,要根据不同项目做改动的,是和应用有关的。
7 ~$ ~" p/ F5 B) N2 ]
5 h# w2 d- |4 ^$ o: A1 `所以在实际使用中,所以只是移植了3.5库,还需要另外把这几个文件放进来。9 |) G! F. M" ^8 n

: u( |# }( J6 t' g, i$ xstm32f10x_conf.h8 y! O8 B5 x0 j" s
相当于是把所有的ST的3.5库的头文件都包含了一下,用户在上层调用的时候,不需要挨个去调用头文件,只需要打开这个文件的注释即可。
' L2 O; c3 g6 k& w4 d9 P9 e! Mstm32f10x_it.c/h
/ A; B. |( m7 q, R相当于所有中断函数入口,stm32f103的中断入口名称都是固定的,统一写在这里,方便移植。实际上,用户也可以不需要这个文件,把各自的中断函数放在各自的模块中即可,都是一样的。
) F0 R! \- K. m" Z, I) O0 x- b; F/ o
5. Stm32f10x.h
9 a  R  J7 q9 v( t2 r+ [: w9 Z5 p这个文件比较重要,看源码分析,主要功能是
6 B) e9 ]" q. U% e3 Q$ H0 |& `8 u. u1. 依据stm32的类型(主要是flash的大小),定义各种中断向量表的顺序
3 J% ]) w- P2 y" x2. 定义数据类型* T0 ]! b8 V7 S/ @: x1 p+ j
3. 定义MCU外设相关的结构体& r% L( m4 s0 S
4. 定义外设在FLASH中的地址
* X& M6 T+ k. B7 a( d5. 进行外设寄存器的位定义3 k- ]: J. K" h7 Z) g4 [7 `

! s' S) ?: ~% C( E, a4 ?- f那这个文件从哪来的?谁提供的?# ?& I; [% _+ a' {' x: s6 R  ?
Stm32f10x.h是ST公司提供的,在3.5的库的DeviceSupport中可以找到
7 Q* {) F1 h! G& x- u! G) n
4 N/ |8 _5 c! USTM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x
7 I9 _) A+ B/ |  z5 w
2 s) O9 w3 V- y+ M, `8 s5 g. f. L2.2 ST HAL库

这部分在做stm32f7的时候用过,还没细整理,暂时略过。


7 s( a. F$ M" R7 J- `/ i; u3 J: ^% B# x8 w, U$ @! a) I' D
0 i& [. x4 f7 _# H! ~- j1 p

- A$ m8 [7 f" b9 b2 M8 i
收藏 评论0 发布时间:2021-11-28 22:00

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版