EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
一、序言
' H) f5 A4 v+ F% _" B在学习51单片机的时候,经常会使用keil+protues的方式来做一些实验,这样的模拟仿真为我们节省了很多硬件和时间成本,可以更直观的看到代码的执行过程。那么当切换到STM32系列单片机的时候,protues明显不支持了,但是keil的模拟功能还是有很大的用处,例如stm32f103单片机,在keil中可以实现很好的模拟效果,我们可以在其中使用中断、定时器、PWM等功能,可以观测到GPIO的输出情况。然而keil对stm32系列单片机不是很好的支持,如果换一个型号,你会发现完全无法模拟! ( {# e6 e: K1 R$ s) \7 a: i8 w. N6 K
二、配置keil,模拟stm32系列单片机 1 _0 {9 Q3 n. q6 s( O5 i) `3 v
我们可以通过修改某些地方来实现keil对stm32的模拟功能。
% U$ k# p4 l7 D1)首先来修改“debug”标签的内容 ( A+ O" Z: q& \8 v
1 x$ Z2 H1 M O“Use simulaor”代表要使用软件模拟仿真 ; J$ e7 \$ s9 W: w7 H, x
“dialog DLL”的内容是“DARMSTM.DLL“,表示使用stm系列
2 \) F( {; C) k" w' Y* P“parameter”的内容是“-pSTM32F051C8“,这里匹配的是当前单片机的型号
* Q9 U6 Z" p' t6 S7 W+ Z2)initialization file : R5 e- }: Z/ b" ` \
先来看一下这个文件的内容
9 B- j$ s% O+ I& m* B" @9 _map 0x40000000,0x4000ffff read write
7 j* M( \" {1 ]' a) O( ?; emap 0x40010000,0x4001ffff read write + {6 s+ R5 `9 b7 p n- x& g# M9 p
map 0x40020000,0x4002ffff read write . f+ I5 L) T2 Y8 X& u( T1 ?9 s
map 0x48000000,0x4800ffff read write 1 z, c O# q9 n* L
这段内容其实是在设置单片机的内存地址的读写特性,上面的这几段地址都是可读可写的。C语言就是在存储器里不停的寻址,然后执行指令,那为什么会是上面这些地址呢?可以查看stm32f051单片机的存储器映射 ! Y: O; _) q: P* `5 o5 C8 [
! V# ~1 o9 n9 h! O) C& j上面只是截取部分存储器的映射情况,这是AHB2的地址。例如你要使用RCC功能,那么可以看到0x40021000•0x400213ff这部分地址需要有读写属性。 $ z F- B" t9 [( H4 y
三、跟踪某个变量 ! j! H2 \6 q7 O$ c7 b! R5 l
1)找到逻辑分析仪 3 t }; W0 ~5 A& P1 s% J( X) G l
完成了基本的配置以后,我们就可以debug了
]# G8 c$ y2 k) D0 p# K9 P/ U1 }
5 H4 G! N& e V( Z
9 @2 k' ~! n2 D( B% r& JDebug按钮就不用多说了,中间有一个按钮时逻辑分析仪,我们可以点击它,唤醒逻辑分析功能。逻辑分析仪可以帮助我们以图形的方式来观测某个型号。 ' L M: J3 t/ Y! E' t; ?
2)给逻辑分析仪添加变量
$ o. |1 _. }& ]: q! }+ j2 X' Y9 v4 ^3 b
将鼠标定位到全局变量x的左侧,右键-->add x to-->logic analyzer,这样就可以将变量x添加到逻辑分析仪窗口,此时如果点击运行,可以在窗口看到x变量的曲线 . g, v* i% _/ I0 @9 k/ r
( n. ~4 K* m! { $ \! r' j5 ~- O, Q
3)修改显示效果 & c Q% h- y/ p4 D
从上面的图可以看到,由于x是一个uint8类型的变量,因此取值范围是0~255。但是这样有时候看不出x的变化情况,因此我需要修改逻辑分析仪的显示效果。点击setup,弹出下面的对话框,我们可以修改去x的显示颜色和显示范围
5 X0 F+ A2 x0 o! ~
5 [9 ]4 c3 [" P g2 ]3 x - W; l( M: ], ^( E9 g0 W
修改之后的显示效果,可以看出来x每2s增加一次,这也正符合代码的逻辑
8 P6 `' ?4 o, }4 O* ^3 R* k1 m4 X* t
四、使用systick
( g; J$ @: \* W; B0 M8 j. y4 ?上面的x变量显示2s增加一次,原因是我们在代码里面使用了cube库的HAL_Delay函数做了延时,来看一下代码 8 }9 V9 ~& I! J6 Y1 B. x0 ?, U
D1 ?* ~: l2 y+ H在cube库中,这个延时函数使用的是systick功能,也许你模拟出的图像显示x不会变化,那是因为你的systick功能没有配置好 , @1 A: p {2 V; r# ?
1)点击peripheral---core peripheral---system tick timer
1 U" n3 n3 ~- D
! W4 f4 t( q( Y) k * h$ d) s$ a- t" J% r* U( |
2)按照下面的方式,使能systick
& v9 a+ G* M, p b L* ~ 0 A4 F* w& o" W2 J7 \; z4 i6 I$ c
( u, j; A2 K& ?( ]3 |
3)去掉代码中的等待
4 q0 z9 H7 ]2 f: |9 {6 L如果你在配置时钟代码的时候,有一些状态的等待,那么你需要关掉它,否则无法模拟仿真的 / ^1 s5 B4 T9 x j- D
4 }: [/ [: e* _- C: G: P五、追踪GPIO
, o0 @/ @) o* H# U6 `* u如果你的代码中要输出一个pwm波,那么逻辑分析仪是最好的结果勘测仪器,但是你没有逻辑分析仪,那么还是来软件模拟一下吧。现在假如我使用stm32f051c8这个芯片,在PB2口输出一个pwm波形,那么我们来模拟仿真一下
' ~% |4 J& Y i* Z 4 d/ ^! z- m$ \1 p0 Z" ?9 q
3 w' ^: U: U E, C. y( y
我们在keil软件的最下方可以看到一个command窗口,在其中输入一条指令:
: Y/ Q+ Q: _' `+ o' k- ULa (*((volatile unsigned int *)0x48000414))>>2 ! g. l& J3 q8 I! l7 ?7 @
上面的指令是在逻辑分析仪中跟踪某个变量,这个变量的地址是0x48000414的bit2, " I$ N- T s* t! y g6 x( z
翻阅手册你可以看到,这个地址正好是PB2。。。这样我们就看到下面的结果
8 t, M; W: i* o t3 R! V( m+ y
& x% n7 w# q0 p9 X |