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

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

[复制链接]
STMCU小助手 发布时间:2021-11-28 22:00
1. 前言* x1 @' ]+ q- s  R! {: x
随便找了一个以前写的Stm32的demo来练练手。6 \7 i2 w* ]  `0 W$ X6 ]
顺便先整理一下工程里面一些文件的作用,一直都是从DEMO中直接拿来用,还没有认真的理过。
$ [; P8 c! y4 s5 }7 Gmisc.c: }9 W6 q$ E$ H
core_cm3.c/h: q( }4 Q! i& y8 {3 \
startup_stm32f10x_hd.s6 \2 \9 J, W9 H
stm32f10x_conf.h5 R6 _' @- n% A
stm32f10x_it.c/h0 N  s$ K, J) Y
system_stm32f10x.c/h
. n" y' U" w, qstm32f10x.h
; Q6 H6 ^- B) W& u1 g2. ST一些容易混淆的文件作用
- V: Y' B$ i: o5 o2.1 ST 3.5标准库5 o. y3 w. O; C
标准库3.5可以从官网下载,也可以从CSDN(搜STM32F10x_StdPeriph_Lib_V3.5.0即可)下载。注意,要下载原版,而不是别人移植过的,这样对比你才知道改了什么。; W! r" G+ e) U! a2 ~+ \: i

- w% J$ m  z4 p! W" H在ST3.5库的使用中,大家会发现,除了把STM32F10x_StdPeriph_Driver的官方发布的库中的一些类似于stm32f10x_adc.c这样的stm32f10x_xxx.c和.h导入工程之外,还有另外几个文件,也需要导入工程才能使用,类似下图:! B- v4 y' E# @% ^" E
20200205154125515.png

0 P7 h1 N* N, L! _2 d( I: F0 T+ K  I& p
类似misc.c,命名比较特殊,还有core_cm3.c,system_stm32f10x.c等等?  k6 \6 t. z7 w( S

. |" w  R! \3 k2 N那这几个文件,是从哪里来的?做什么用的?8 O2 J! s" g$ K. t5 `
$ z/ w2 J% r6 \5 s: y# L3 [
让我们把这些特殊的文件列一下,缕一下来龙去脉。) b* U4 I( W" j
misc.c
. v! t! Z( `$ [% P0 [) Y4 j0 Z: vcore_cm3.c/h
" w( A# d1 r# z- Y# Z3 J2 lsystem_stm32f10x.c/h$ i( Z% a: X! v  K8 W
startup_stm32f10x_hd.s# k" o1 `4 F5 X* D9 ?
stm32f10x_conf.h# o! L+ R) ?+ z2 B; V
stm32f10x_it.c/h0 {/ [! ?3 s+ B0 O: O& R7 M
stm32f10x.h. |7 O% k4 a3 t0 g
一张别人的图。
6 v* Q6 S# M0 A; [( ^+ j) h% O* e0 M  B8 {9 K( g
20200205165614129.png

' R! g1 A% a$ `4 h+ P. J5 u& m6 I5 o. R
1. misc.c
# z, c4 M. U8 p% N2 ^# tmisc.c的关系比较好理,是属于3.5标准库的一员。
; {& H2 A; J4 T8 F8 h& @8 f7 I因为STM32 V3.5版本的库函数中没有原来版本中单独对于NVIC(中断向量嵌套)的外设驱动,把NVIC的外设驱动放在了misc.c中,实际上是代替原来的stm32f10x_nvic.c。$ D. s8 p- ?4 L! Q- `
从misc.c的发布位置就能看出,这个文件是和其他的stm32f10x_xxx.c是在一起的,只是名字风格不同而已。路径在:
% I: n0 X% v! \4 q. ?# b. n
" M7 Z& m: H( `, e0 [% t) VSTM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver\src  F/ k/ d' L: h" ^$ B

5 t# U& S% \1 J+ |: e
20200205153624434.png

2 s. D3 ], g/ ~0 _5 g* P/ ~. ^
! h0 W# h; w8 [2 E- s8 M2. core_cm3.c/h 和 system_stm32f10x.c/h2 z' E+ _% Z( z
core_cm3.c/h和 system_stm32f10x.c/h是内核支持API,由内核公司(ARM)提供,随着3.5的标准库同步发布,路径分别在
# r& j2 l( B: ]  u% N2 E
  L! I2 q" d, X* k4 b5 SSTM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport
" h4 c  @( m4 eSTM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x5 C! Z: a" U" B) `# }3 Q) I( h
插一段话介绍下作用:9 q0 H! _$ P. X) {

. ]  ^0 I. a/ A3 v0 m( hCMSIS是Cortex微控制器软件接口标准(Cortex MicroController Software Interface Standard)的缩写,这个是ARM定制的一个用于Cortex-M系列的一个标准,主要是为了提供通用api接口来访问内核和一些片上外设,提高代码的可移植性。
7 }' U+ o; w7 N( _  Q3 rCMSIS有三个层:核内外设访问层Core Peripheral Access Layer(CPAL),中间件访问层Middleware Access Layer(MWAL),设备访问层(Device Peripheral Access Layer)。" {% \9 r, i' A/ ]( @' {! Y
CPAL用于访问内核的寄存器和组件,如NVIC,调试系统等。该层是由ARM实现的。, C" d; P+ p! ^  O9 y
MWAL用于对中间件的访问,现在该层还未实现。(也不知道所谓的中间件是什么东西)。5 m( F8 z. q6 |
DPAL用于定义一些硬件寄存器的地址和一些外设访问函数,由芯片制造商实现。4 `5 ^( N# w* |/ S
CPAL层的实现就是Core_cm3.c文件,DPAL层的实现就是system_stm32f10x.c文件(似乎还应该加上外设的函数库), k# h% O+ U: y

( k! ?. `* q+ K0 Y! ^/ I" [3. startup_stm32f10x_hd.s
: l7 ^8 L7 D  p* R$ W2 I( M启动代码,由内核公司(ARM)提供,随着3.5的标准库同步发布,路径在:+ ?5 b6 ]  `* b( u& B& a
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm, Q/ K4 Q7 x1 J( h; t
可以使用提供的,也可以自己修改。
* h* R0 w) _1 i( E: _
0 K7 u6 b* h' \& _$ x  r4. stm32f10x_conf.h + stm32f10x_it.c/h
7 v( ^1 l' E/ J  z1 r这几个文件在ST官方发布3.5库的时候,并没有放在库代码里,而是放在工程应用层代码里。4 Y) F7 N$ P* z% t6 C: ?
比如:5 P; x6 Z6 P0 Z+ q% h( Q" }

5 D$ t+ [+ Y4 E3 Z" j: v7 r) m3 ySTM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\USART\Printf
0 e& Z% }) s2 P7 O- ]! ]  t即放在了对应的项目工程中。4 ^  F1 t2 l( Z. T  Q
这么放其实是对的,因为其他的库函数接口是不会变化的,在用户实际使用过程中是不需要改动的,但是,这几个文件,虽然也是ST提供的,但是实际使用中,要根据不同项目做改动的,是和应用有关的。
+ I5 n! [9 z/ K+ H, L+ n5 v! Z2 a2 n" d' n. O0 ^. d
所以在实际使用中,所以只是移植了3.5库,还需要另外把这几个文件放进来。% ?0 F5 j# c, ?# u5 ?0 U7 ?
5 g  i' z" M) t- K9 ^  t
stm32f10x_conf.h
$ f$ }$ }7 Q; L  ~" l  X相当于是把所有的ST的3.5库的头文件都包含了一下,用户在上层调用的时候,不需要挨个去调用头文件,只需要打开这个文件的注释即可。
! I. v" s4 \9 B: `stm32f10x_it.c/h
( p) g# p4 {* q9 Z相当于所有中断函数入口,stm32f103的中断入口名称都是固定的,统一写在这里,方便移植。实际上,用户也可以不需要这个文件,把各自的中断函数放在各自的模块中即可,都是一样的。
, S1 p5 y4 ]7 n/ }5 A) `: o8 l  |/ S3 I% ^/ L: O/ z% N) o
5. Stm32f10x.h# _  Z4 x* z" p* C  j1 `
这个文件比较重要,看源码分析,主要功能是. W; k0 l, K7 g& u$ B9 h; q
1. 依据stm32的类型(主要是flash的大小),定义各种中断向量表的顺序6 Z( f% w  G. i; o+ Y3 B9 [
2. 定义数据类型
4 v+ Z0 r7 [" Z/ D& |/ T0 X3. 定义MCU外设相关的结构体
  d/ Q1 T6 F3 g8 e8 y9 a9 }2 d1 Z4. 定义外设在FLASH中的地址
$ g7 n# f/ |$ a! H5 F4 N! o5. 进行外设寄存器的位定义
( v* E: l' O+ f+ L, J4 {
' D' C/ r0 G- O# k* t那这个文件从哪来的?谁提供的?
% ^7 S& s# b9 R4 K9 q& I$ TStm32f10x.h是ST公司提供的,在3.5的库的DeviceSupport中可以找到/ @& A! w5 j$ M7 }

: D6 c% o) p0 i( W3 DSTM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x" y8 ^/ d/ K& H* ?

" ?" ~4 z! u: C- }! W2 X' J5 U2.2 ST HAL库

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


" J% Z+ d- ~5 V0 D
  j% Z) y. L7 c$ c/ t- o
: n0 p$ O1 o2 f  }) L
+ s( f" z3 M* c( P( B2 i, a& p, Q; {
收藏 评论0 发布时间:2021-11-28 22:00

举报

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