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

STM32F030 Nucleo-开发环境的搭建和工程建立

[复制链接]
STMCU小助手 发布时间:2023-1-6 16:49
环境搭好后,为了验证,我就迫不及待的解压前面下载的标准外设库STM32F0xx_StdPeriph_Lib_V1.5.0,然后再路径:......\STM32F0xx_StdPeriph_Lib_V1.5.0\Projects\STM32F0xx_StdPeriph_Templates\MDK-ARM 中打开标准外设库提供的工程模板,然后就是编译了!: b8 j' K* t8 C
2 S3 `" c$ C, n2 @
然后,然后,悲催的事情出现了:报错!报错!报了很多的错!!但是基本上都是一个错误如下:
& @. a2 H# o7 Z

& G- n; A$ }2 b; C  B..\..\..\Libraries\CMSIS\Device\ST\STM32F0xx\Include\stm32f0xx.h(479): error: #5: cannot open source input file "core_cm0.h": No such file or directory
. c( B# Q; t+ Z6 K) s8 \- b) l: O9 [) x- x7 d: ~! S9 U
#include "core_cm0.h"1 C/ i# |9 L3 J6 j
9 g  A3 K( V0 v, T- ~
..\system_stm32f0xx.c: 0 warnings, 1 error, K7 R2 B0 a, _, |% ^* f8 A6 \" c
# h0 ?4 d; N! K& a
从错误中来看!很明显:找不到这个core_cm0.h头文件1 [! }9 G$ Z1 C
# B8 Z5 M/ Z. R. R
双击错误然后就可以看到出错的地方:. P: M* `- }/ `0 X6 m+ u- Q9 Q' r

% b4 k/ M1 i2 K

* |# s& Q6 K3 x' C  i% A注意一点:#include "core_cm0.h"使用的是””号,而不是<>尖括号。所以在库里面找到添加即可!6 O. z3 {: \7 K0 Q& }8 X$ w

1 p2 N/ @; f7 G1 ~4 E; B添加之后!再编译!又来了!错误如下:7 l: Y- _6 g( D, r% _( H& M9 r
' a# K" s6 D! n
..\Libraries\CMSIS\core_cm0.h(127): error: #5: cannot open source input file "core_cmInstr.h": No such file or directory
6 B/ l6 @* g4 g& c! h, `5 g
* {: P; q& N2 u0 E) p: p#include /* Core Instruction Access */
1 I7 d9 A, b0 v. g2 F. }. H$ x' v5 M) H' u& [- a' y; I
进去之后如下:
9 q+ i7 @7 J0 y5 v8 d4 o1 T, J

8 a' W8 a4 i! L$ @9 V% T' H这个文件是<>尖括号包含的,那么就是说是从Keil的库中包含的,而不是我们自己添加的!(当然,要解决这个问题也可以自己添加头文件,然后将<>改成“”,但是这么多文件都包含了这个头文件,这种傻缺的事咱还是别玩了!所以另想办法!!)。于是乎我进如我的Keil5安装目录,在路径:D:\Program Files\Keil_v5\ARM\Pack\ARM\CMSIS\4.2.0\CMSIS\Include找到了core_cmInstr.h这个头文件(我在D盘安装的keil5),那么说明在keil路径下是存在这个文件的,但是为毛就是没有被调用呢?
. U* z% s  c1 P, D! y$ N/ N# x# G8 ?; R; q* w9 G. z) b- Y* _
百度了一下,找到了很多相关的东西,但是都是解释这是啥??有的哥们是用了上面的方法编译通过了!反正就是没明说!0 O# Z6 Q8 m# F
; R( Y7 I/ H' q
然后,我才想起来,这个问题早在好久以前我就在我的笔记本解决过了!那时候没记录下来,所以现在又忘了!但是我想起了,之前经过跟踪代码发现一个问题,在keil工程中,core_cm3.c/core_cm0.c这个文件里面的内嵌汇编代码根本就没有调用,调用的是core_cmInstr.c和core_cmFunc.c这两个文件的内容,是作为内核处理的依据,所以,不用说了,就是和它俩有关系!!而且经过实际验证core_cm3.c/core_cm0.c等这个文件再keil工程中可以干掉。( B4 c) r8 ^, ~2 s8 T3 t
; ~. A, \" v3 d$ V8 E  W; E5 F5 Z
那么随着又想起了一个问题,keil472以前的keil在安装的时候,在安装目录下X:\Program Files\Keil\ARM\目录下存在CMSIS文件夹,而在keil5安装好之后,是不存在这个文件夹的所以才出现以上的错误!于是乎!我将
/ _8 g6 y) I5 L4 u
( z% J% p% D( X1 M6 D- G! CD:\Program Files\Keil_v5\ARM\Pack\ARM\CMSIS\4.2.0\目录下的CMSIS文件夹拷贝到了D:\Program Files\Keil_v5\ARM\目录下,这个文件夹整整有239M哇(我磁盘空间不多了,小小蚂蚱也是肉)!果断的将CMSIS\目录下的除了Include文件夹之外的所以文件/文件夹都干掉了!在编译!。。。。。0错误0警告通过了!- c' H2 L. N+ t) x( J2 i8 Q7 R( E

- V! o3 \& h% x$ o$ r- m7 U  f迫不及待的就从标准外设库STM32F0xx_StdPeriph_Lib_V1.5.0中将必要文件拷贝出来,自己建一个工程!!!建好之后!同样编译!哇靠!好长的警告!
# a' A  J9 m% b; E
! Z5 X2 w% P9 A$ E) s  ?5 s& D
..\Libraries\FWlib\src\stm32f0xx_wwdg.c(152): warning: #223-D: function "assert_param" declared implicitly
# [  ~* C3 e; L7 g+ _" H# k- \  ]: R0 Y" R# J6 W
进去一看!就是找不到这个函数!啥情况呢??文件添加不完全??其实不是的,我相信只要是玩过ST的MCU的人都知道,ST的库在编译的时候,可以可控的选择编译一些必要的驱动文件,一些用不到的可以不编译!就是这个stm32f0xx_conf.h头文件了!进入这个头文件就可以看到(1)驱动文件的头文件!
3 k( ?: D  i8 @9 F  i! r1 t1 Q1 L) a* E% [4 {$ t
(2)上面报警告的“函数”,其实它是个宏!先不管他!编译通过再说!+ \8 J7 Z% |! X4 O& @- \" I
, {3 |* f3 X8 b  \) }) Q
那么也就说明stm32f0xx_conf.h这个头文件没有被包含在工程中,但是一查看
& M& D# n9 {' y  _* @
1 Y. O" ?: v* U5 I0 R  Y
确实是包含了!而且头文件也在keil的C/C++->Include添加了!" _/ A9 f" @2 C/ O

0 D9 o: p. k9 ^0 P那么啥情况呢??看来还没有找到最根本的问题所在!
& ^* N6 ?4 l4 c5 d! L9 ^

! s% N% Q# I* @# S# _同样的我也是凭着经验的记得!这个stm32f0xx_conf.h头文件是在stm32f0xx.h头文件下包含的!于是乎,找到文件就可以查找到了如下图:
# ?4 W* K# V. ~( G/ V# _4 N( k* a在stm32f0xx.h头文件的最底部找到了这句话:
0 X7 D/ k* ]. ]5 m# N# v8 }2 X# B
0 Z& h0 r- I# H9 E. z
#ifdef USE_STDPERIPH_DRIVER& J) o; c" e# f

) o' Z- G; _( n! ^' h2 W: `#include "stm32f0xx_conf.h"& b, v+ A! l: r5 U1 j& C7 L
/ U$ q5 {- }; p' u* ^5 y
#endif, s, I) F0 ^. M! O/ l
3 c0 U1 V/ |. ]' d2 Q0 `; L
如果定义USE_STDPERIPH_DRIVER这个宏,那么stm32f0xx_conf.h头文件将被包含!那么问题就解决了!我们只需要定义这个宏就好!' C; F6 |. ^% q% V) S/ A

- d! d* O- p+ b* v7 g5 ]0 O" n* }这里提供两种解决办法!* Y3 H! u0 ~7 |' L7 C8 g
6 t( q# a7 H3 v( \1 e
(1)如下图
: r' K4 `3 i3 [
% u2 p, a; r1 M, u6 _- E+ H5 S
直接在上面添加宏定义语句:
9 Q5 }6 k5 d: h' E, L
; _2 w4 j- ]8 w2 }( [* J
#define USE_STDPERIPH_DRIVER
1 E8 \! F7 ?% c% {6 n4 b9 f6 w% ~- m. L- ~
之后编译!0错误0警告!
) F! A% K( |, O6 G0 J. ?7 k
; H" D* t' P$ c: P$ s# o) i/ l! j; W但是本人不推荐使用这种方法!推荐使用方法(2)
$ O/ e  V& v( p" j0 P

. ~' t* z/ K/ C8 ~5 A* g(2)如下图# J4 @# N: a2 D& Z

# }/ {9 M6 w* t1 ^! j' f, B! q在上图页面Define添加宏:USE_STDPERIPH_DRIVER  z* _/ V& h- S9 W# v
6 K. I+ d: \) \2 k. N
确定!再编译!同样的0错误0警告!
! y7 Y! O( o; X& C* J2 q! |# H* m! m4 k  ~0 u
那么为什么不建议使用第一种方法呢?
. g. A: s4 I" {3 @* l: U
( C2 U* a! y" X* r( R因为对于库来说为了更灵活的使用(有些东西是没必要时时存在的),当需要某部分的库时,在添加即可,在keil上添加是全局的,而且不改变库的源文件!并且容易修改!如果是第一种方法!可能那天就忘了!有时候想关个东西都得找半天!其实言下之意就是,这样的宏在库中还存在着很多!. Y4 n; x1 t1 g: p; Q9 @9 \4 J: W

5 R! f3 ?) Y9 c& @OK了!STM32F030牛客板卡的第一个工程就建好了!我是个懒人!将其作为模板!以后直接拷贝它使用就好!  _5 @( Q1 `! l* }1 ^6 m
. Q! ~" X1 e- k+ t
当然!对于不想使用库进行开发的童鞋,可能犹豫!因为STM32F103系列的,有很多大神写好了在直接操作寄存器时候的一些封装,所以可以直接用,但是这里,就不同了!那么咋办呢?) q% i4 y% M8 k  P, u5 u

6 Q- I, @( W/ g2 g! j其实只需要添加stm32f0xx.h文件和startup_stm32f030.s启动文件,再包含必要的内核文件/头文件即可!这才是操作寄存器了!哈哈!那么有人可能不理解了,在F103的时候,我们自己写的中断函数还有一个什么函数,并且中断函数随意命名!哈哈!!建议自己去研究M0内核的中断向量表吧!
6 i$ n4 _3 S- i" h+ z% }- |————————————————6 F' r2 V! l9 Y
版权声明:华清远见嵌入式学院, q& ~8 ~9 a1 e* N9 E

4 x* ]4 S- M+ s( v: z+ o# ]$ Y
赞 收藏 评论0 发布时间:2023-1-6 16:49

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版