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

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

[复制链接]
STMCU小助手 发布时间:2021-11-28 22:00
1. 前言3 l9 X2 L+ n, h
随便找了一个以前写的Stm32的demo来练练手。
; N. z# W) i. V4 S+ h- _- S顺便先整理一下工程里面一些文件的作用,一直都是从DEMO中直接拿来用,还没有认真的理过。3 R4 Z' i6 P- d2 F
misc.c$ L4 L2 \( i4 O: N$ F% s6 c0 ?
core_cm3.c/h
$ {; `3 U1 ~8 k- ?; gstartup_stm32f10x_hd.s
& _$ d! A  D7 T/ e  Nstm32f10x_conf.h& Q$ ^( x3 I) Q  u% @
stm32f10x_it.c/h' i4 a, ]8 O. Q5 Z* j; X, K  [& z
system_stm32f10x.c/h
$ o& U" Q$ x" Cstm32f10x.h% K2 t: W: X6 }, Z, K
2. ST一些容易混淆的文件作用, p% N7 g, }7 t* c+ u% R! Z: |8 U# M
2.1 ST 3.5标准库
4 r5 d, B8 j8 n标准库3.5可以从官网下载,也可以从CSDN(搜STM32F10x_StdPeriph_Lib_V3.5.0即可)下载。注意,要下载原版,而不是别人移植过的,这样对比你才知道改了什么。9 R+ N5 Y& m* Z% t

0 y) [6 X% `( M/ W在ST3.5库的使用中,大家会发现,除了把STM32F10x_StdPeriph_Driver的官方发布的库中的一些类似于stm32f10x_adc.c这样的stm32f10x_xxx.c和.h导入工程之外,还有另外几个文件,也需要导入工程才能使用,类似下图:
1 m* D! G9 K# {0 J6 Y( N+ U
20200205154125515.png
) S6 B& F+ J( Y& c0 u% w- O
* S( O4 L$ e8 N9 ]  i" ~4 ?- u9 b
类似misc.c,命名比较特殊,还有core_cm3.c,system_stm32f10x.c等等?5 X1 t0 C) O- A( m$ I" K) m

7 O1 f8 A: O0 j. o% V# a那这几个文件,是从哪里来的?做什么用的?
) i/ H: m* \8 w1 S
- {! S$ L! [; t* h+ H9 ?, Z. r# @让我们把这些特殊的文件列一下,缕一下来龙去脉。% I9 a6 u( U" y1 ?# E! O  p
misc.c3 ~0 R7 ?- k+ x0 O& n
core_cm3.c/h: n  e; Z3 q# E0 N  F) d
system_stm32f10x.c/h
" l9 p# s) G6 l2 \6 f! y. x, X( C  Cstartup_stm32f10x_hd.s. k/ [5 z  C" H3 G
stm32f10x_conf.h
3 ~3 P# d; g1 D3 [stm32f10x_it.c/h
; ?& g( G7 e3 w/ Rstm32f10x.h
5 N) O) R' `0 {一张别人的图。: A7 g, `2 ?! A& D# H; @
/ D. i/ ?, v5 g% O. ^: {
20200205165614129.png
3 t4 e2 ]& a; V) J! v* d% _

5 k/ o! w  L& ]9 n4 v6 O1. misc.c
8 ^4 P, C! {$ X# h2 Fmisc.c的关系比较好理,是属于3.5标准库的一员。
* q, N( E& u7 C7 v3 U7 g因为STM32 V3.5版本的库函数中没有原来版本中单独对于NVIC(中断向量嵌套)的外设驱动,把NVIC的外设驱动放在了misc.c中,实际上是代替原来的stm32f10x_nvic.c。/ N, P7 V6 r+ [6 \& L8 L
从misc.c的发布位置就能看出,这个文件是和其他的stm32f10x_xxx.c是在一起的,只是名字风格不同而已。路径在:+ p! E7 W: k8 o! [( Q. D
; M: v# U7 j0 p5 s6 M
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver\src3 t4 x; p- ~( I$ ^! \. U8 {4 u
4 \; ^* W6 b: V2 i8 i
20200205153624434.png
% F+ N% A% P1 ?; q: I" K

0 W6 D& |; b5 E, |6 e( a2. core_cm3.c/h 和 system_stm32f10x.c/h7 }: G$ m6 D- y) Q6 [
core_cm3.c/h和 system_stm32f10x.c/h是内核支持API,由内核公司(ARM)提供,随着3.5的标准库同步发布,路径分别在
& J. G8 E7 ^/ ^4 P) V% L8 V) d; Z4 x+ m. `2 U* d
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport
: Y& _0 r' ?% pSTM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x
& I! I0 C3 @8 c$ g# N" o插一段话介绍下作用:
& f4 y+ t! E6 J/ a  j" k, L1 k5 h: g# s+ m2 i- p: ^+ Y& t
CMSIS是Cortex微控制器软件接口标准(Cortex MicroController Software Interface Standard)的缩写,这个是ARM定制的一个用于Cortex-M系列的一个标准,主要是为了提供通用api接口来访问内核和一些片上外设,提高代码的可移植性。$ h: {, o# v; n# i- y( f/ y1 f- A
CMSIS有三个层:核内外设访问层Core Peripheral Access Layer(CPAL),中间件访问层Middleware Access Layer(MWAL),设备访问层(Device Peripheral Access Layer)。7 i' _% p, `4 a! |3 J  ?4 x: @% O
CPAL用于访问内核的寄存器和组件,如NVIC,调试系统等。该层是由ARM实现的。
: b. z5 f# Z# N! e# qMWAL用于对中间件的访问,现在该层还未实现。(也不知道所谓的中间件是什么东西)。
8 C& b! ]& R; R$ [" @; m, jDPAL用于定义一些硬件寄存器的地址和一些外设访问函数,由芯片制造商实现。
. O1 Y6 i* s* [$ c# p1 _% `; MCPAL层的实现就是Core_cm3.c文件,DPAL层的实现就是system_stm32f10x.c文件(似乎还应该加上外设的函数库)
0 h( I: o$ _6 K5 s# k( ]: u
* ~, |7 l, J5 _( A/ `3. startup_stm32f10x_hd.s9 |9 U9 D& g# M+ h' ^* L
启动代码,由内核公司(ARM)提供,随着3.5的标准库同步发布,路径在:7 w9 x8 M4 }5 [- X4 h3 j0 W1 [! ^
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm
) e- z) |% m7 p6 E4 i" x可以使用提供的,也可以自己修改。
" b( I' B% I+ S- A( S8 G: W) M4 t% }7 y5 v
4. stm32f10x_conf.h + stm32f10x_it.c/h4 l4 m9 m/ Z, ]2 ^5 O: d0 `0 S5 e
这几个文件在ST官方发布3.5库的时候,并没有放在库代码里,而是放在工程应用层代码里。) b  R" G# Q' Y& o2 d) H
比如:3 z" n% X0 V) i9 y6 u* ~: w" R

7 q* F- C. p( qSTM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\USART\Printf, |$ I+ u& l* {; `6 R8 s; |
即放在了对应的项目工程中。% y, W% z; j; I! r" {: p
这么放其实是对的,因为其他的库函数接口是不会变化的,在用户实际使用过程中是不需要改动的,但是,这几个文件,虽然也是ST提供的,但是实际使用中,要根据不同项目做改动的,是和应用有关的。4 |" c5 ^' @" b8 D
% b  C' v) Z+ L! P2 z
所以在实际使用中,所以只是移植了3.5库,还需要另外把这几个文件放进来。
! S1 S+ q: N; M3 c! b, `* R; U4 ^$ `8 R: g) h
stm32f10x_conf.h9 g& P) s0 Q6 O
相当于是把所有的ST的3.5库的头文件都包含了一下,用户在上层调用的时候,不需要挨个去调用头文件,只需要打开这个文件的注释即可。) r1 l  j( X0 Y6 N6 a: d6 t1 C
stm32f10x_it.c/h0 [; W) T8 D9 p1 }2 Z$ q9 h6 N
相当于所有中断函数入口,stm32f103的中断入口名称都是固定的,统一写在这里,方便移植。实际上,用户也可以不需要这个文件,把各自的中断函数放在各自的模块中即可,都是一样的。
& [$ C5 ~! e  p. m9 c" O4 D8 E" j
5. Stm32f10x.h9 ~5 o6 n- ~* ^. R
这个文件比较重要,看源码分析,主要功能是. `6 a" R3 }. U. G3 n; g. }" c/ I
1. 依据stm32的类型(主要是flash的大小),定义各种中断向量表的顺序1 y- D( B5 i2 r% \- o1 P5 p6 V
2. 定义数据类型
/ P& \& V& q5 C& b1 w! k  J  K- t& D3. 定义MCU外设相关的结构体
/ x& o6 y" Q) \5 n5 b7 W# u4. 定义外设在FLASH中的地址
6 _3 }1 U/ j2 j4 I5. 进行外设寄存器的位定义3 O/ F- t6 F' e) q: X4 I7 @# l
$ `* F4 c) w( Q2 }1 U
那这个文件从哪来的?谁提供的?  X; A) _; o! q
Stm32f10x.h是ST公司提供的,在3.5的库的DeviceSupport中可以找到
2 a* Q" _- h. }6 A
" \- s0 s, J4 a  HSTM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x
6 l, {1 i) D0 ?7 c) k( W0 S2 {) [# e* H% q
2.2 ST HAL库

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

+ O4 F4 o6 f+ U) r! F

/ T% Q8 q! G, D1 F# T6 `$ F
/ Z) B6 e& g3 {: I& ?/ U2 n3 x( c8 n1 H" E1 m- S
收藏 评论0 发布时间:2021-11-28 22:00

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版