请选择 进入手机版 | 继续访问电脑版

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

基于STM32CUBEMX的NUCLEO-L496ZG任务创建、信号量、队列实例测评

[复制链接]
tsuibeyond 发布时间:2018-5-19 22:09
本帖最后由 tsuibeyond 于 2018-5-19 22:14 编辑 1 e& Q0 g" j8 a& |

4 Q8 o  @( v5 o7 ]! G: g) ?准备工作:
$ L7 f$ Q1 l8 k4 VNUCLEO-L496ZG开发板; v- m& W% H" N' L1 Q/ ]
一根micro USB线
- |! F* @( O9 Y! e+ D预装STM32CubeMX
8 Z3 ~6 t. C) `. e& Y$ T7 k* N预装IAR8.22% F* a; c8 k. H3 r& a* ~1 t( F

  L# M/ Y& ~3 C  z& g/ m: k% L/ Y0 f实验任务:2 Q2 D$ P' v6 f; D. @1 c
  • 用STM32CubeMX完成代码基本框架的生成
  • 借助FreeRTOS完成前后台任务运行机制,涉及内容包括任务创建、信号量、队列等。. U2 m5 E/ i! n7 m+ E

3 |+ K1 S: P7 p8 e/ ~* V; x实验内容:. q( S4 |. L; k0 X3 Y/ S6 X0 P! c$ k
  • 用STM32CubeMX进行配置,直接新建工程,选择L496ZG的板子* G3 T$ ~* d) R0 j5 B
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image.png
1 v# F+ c& X! J% v 1.png 2 k1 @' P/ u. y4 @# X3 l7 k* T* \
弹出对话框,选择默认设置模式4 n  z& Q; F- K: j  s1 ]6 z
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(1).png
9 L  B2 c" y4 o' ]8 ]* v1 a3 A: I 2.png
6 ]+ t' a0 h/ U# \* l5 u$ X进入界面如下:
6 o5 w9 A1 R+ P0 ]5 E 3.png
: U/ l9 Z  m" @4 n# W7 F7 dfile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(2).png* Z! X, x& ~( n  B7 Y
修改时钟配置
& X3 A: [" u9 p# k2 E1 k9 \+ ` 4.png 6 q; S/ S2 a/ @& |; T! b
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(3).png5 r/ N1 |& U4 _' `( E: ?
使能FreeRTOS
3 w# e; w5 t* }1 h 5.png # _, t* e7 Y& ?+ n! P
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(4).png0 U7 T6 F" T2 a0 @: P5 H+ x0 h
修改TimeBase Source) b# q$ s, s" h; N+ R8 C8 y/ T! k3 L* o
6.png / x# s2 a4 F0 y) c0 U! j# e
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(5).png
9 q/ q, f7 h  w5 N) r: r时钟树配置:
6 X4 W3 N' n' h" f8 x; q 7.png
9 t; h- i$ V; z$ N% qfile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(6).png; D7 F7 a/ F4 L: U+ c# u4 j
然后生成代码
' d( C8 d* Y& N% j4 B$ Y6 G* Mfile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(7).png9 d* q% z$ b$ E. |
8.png
4 J8 I2 |& `3 Z0 o: T6 k) k; d不明白为什么,这个流程生成的代码有个时钟不能配置通过,需要将其注释掉,才能正常启动(求大神解释)/ r) t" M: \, A* U
  /*
, |6 X: p7 s9 T5 ?; h- k  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
$ A7 m: ]+ d' W" N4 p  {
; G& e% y8 e$ G    _Error_Handler(__FILE__, __LINE__);
% o/ I0 g, N4 a; n. x  }
" J. M$ h4 k2 ?1 Y- j7 K  */
  J( F3 \, e0 A4 o) P& j) _
' ]0 F, o5 r/ f7 V  }
  i" p  v7 a/ s9 w! T& _

( P. |5 m8 n4 T& l* P6 Z实验1:创建任务( I9 o: G& o& a$ o
这里,我们采用图形化界面创建任务! Q; G2 ~7 Y# W2 p/ m8 k
9.png
: H$ v# e8 K% jfile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(8).png
$ |; i  a8 s, t手动输入任务参数:
6 e$ D/ W9 `( X; p9 b" D  j; Z 10.png
* @$ Y8 ]3 g9 }6 I& I% ufile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(9).png
; I$ L/ o- ]( i# C5 u. y1 T8 @" Z" j生成代码(注意还要注释前面的那个时钟配置判断),添加必要的头文件
' i" u: z5 V5 p1 R$ w' d 11.png
/ S, F# o5 Q0 a8 R) ~. b+ `file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(10).png
$ h& q+ |4 g. ~( ^3 v编译运行,就可以观察到LED灯在闪; G. h9 X& x' f. d; m# N5 F$ ~; p! y  ^
( g: W- i2 x% D
然后创建第二个任务 串口打印) M( J2 ~1 v, T$ I
首先配置串口参数
4 H/ x  `( \5 m6 L/ E! B 12.png
. n( C6 W: ?, M& c" Ifile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(11).png3 x" D$ O0 K+ \" U4 ^7 m
然后手动添加任务
' W, V5 \' G5 T  A6 m4 ~, q 13.png & k6 ?0 x: ~5 O1 ?3 A) Z( t/ P
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(12).png
3 X- I  u( p* [/ ?. I0 S同上一步一样,生成代码
; P( F3 |3 A: ^8 \. g, I/ V 14.png
& ^9 M7 ^8 R4 ~7 I添加printf支持代码
! E7 J, b+ P6 M6 j4 _2 C#include "stdio.h"  
6 h/ ^, x) X7 U5 _" a#ifdef __GNUC__  ) Q5 l& Q% Z( G/ Q* n
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)  1 f+ ]- F2 D% @+ ~
#else  $ [4 s4 @, _- @
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)    P! v' n; G' H
#endif /* __GNUC__ */  
# D) E+ d5 C& f4 _3 q( ZPUTCHAR_PROTOTYPE  4 d; W: Z  N. `/ {- E( m
{  
7 P4 _! L) w6 A( }5 a    HAL_UART_Transmit(&hlpuart1 , (uint8_t *)&ch, 1, 0xFFFF);  
. G, y2 V$ T+ ]  u# |0 S. u# q+ H    return ch;  - R- D- p4 r" b7 ?
}
3 b( I/ ~1 @" |0 {% h0 h
) _8 c/ ^7 ]6 d
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(13).png7 W1 {  b7 c- ~
在freertos.c中添加任务代码7 [5 k. t3 R9 r/ W( T
15.png
4 [9 J* |- J9 X4 @7 Bfile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(14).png
. h8 w* `0 P- ~: w编译运行,可以观察到串口打印出信息$ v: e9 w8 U6 h

/ b" |  ^" I3 j5 g( P2 ]- y2 ]* S! f
实验2:信号量的使用' S/ t9 ?- a' l$ {
同样使用图形化界面进行配置,如下图所示:7 O  l, }" h  y2 N
16.png . Z" Q$ i5 r8 r! Y% `. h# F0 e
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(15).png" }4 f' b( P2 X3 ?! f
点击生成代码
" i8 U) Z! F- [$ \0 P; r! I1 [ 17.png
1 |; a  Y3 ?( n, _* Ufile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(16).png/ o$ d* U. [, |4 J7 e3 x
代码修改:' q. I+ y: ?2 Z
18.png " A' {/ j4 i. J5 l6 X7 o% U
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(17).png7 }8 K4 m' Z+ D: _- |/ ?  J# y
编译运行,就可以发现灯每闪烁一次,串口就打印一次
+ _; A, Z$ w$ c% Z$ R9 w4 w& [ 19.png
, M5 z0 x! W! ]file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(18).png
3 I9 F. Z1 _& E4 N& O) c* g# S. U  c/ B, V* a. m! W
实验3:信号量的使用
: h( A4 t, T5 o' O* w' v4 [如下图进行配置,点击OK,保存0 W( b! B/ C8 Z2 \  J' e5 {
20.png
6 w4 \3 A/ y9 F6 F* b$ ^- ofile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(19).png
- r% S2 C5 R- Y生成代码
2 @' T, P: u  _( w3 }3 K 21.png " }; j; V$ t) b$ \/ P9 n* P; O; y" j
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(20).png9 B0 H5 D0 p% z' Y
程序修改,红色部分是添加的内容,定义一个变量,然后队列每次发送的数据都自动加1,队列数据接收部分接收数据后,将接收到的数据打印出来7 t* R/ e: i) ?$ e
22.png
' I' B* N4 |( B# b, H& Ofile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(21).png
; r6 S; R% T  z; X# i* F最后运行程序,效果如下图所示,# J' x$ x# v  g' `4 v; F2 j8 b, V
23.png - ~( X1 j3 F) [  q6 j# j- {

3 b8 S0 g$ h7 I5 t上述内容只是关于freeRTOS的基本操作,但是能够满足一般工程的应用需求了。
; j: V  ^$ e; m( Z: ?- L8 P正在做基于freeRTOS的通用机器人(如多旋翼)程序,待实现基本功能后再开贴发布
7 V9 O: I( c6 Pfile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(22).png
$ p& a: ?- ?. B5 g代码工程:(网络似乎又有问题了,后面再上传)% g9 {8 c+ I% _' f% C
TEST.part01.rar (9 MB, 下载次数: 51)
收藏 评论5 发布时间:2018-5-19 22:09

举报

5个回答
GKoSon 回答时间:2018-5-20 11:49:11
可以 的  支持  0 G  Z7 j0 M  M- g, q
问问IAR和KEIL比较 有那个地方比较好吗. O3 Z! L# X1 c* B# w
tsuibeyond 回答时间:2018-5-21 12:23:56
与龙共舞 发表于 2018-5-20 11:49; U6 p& \/ v4 p$ E& d7 [
可以 的  支持  2 K2 \: G" k/ |3 b) J
问问IAR和KEIL比较 有那个地方比较好吗
$ a1 ^6 O- T8 A, {- N6 A6 A, k2 ?
个人感觉,KEIL是手动挡汽车,IAR是自动挡汽车,对于驱动调试KEIL更好一点,对于算法之类的调试,IAR更快更方便。2 v/ @- k1 A- p! ?- m# W3 p+ G5 x
IAR编译速度似乎比KEIL快很多,可以一定程度上节省编译所花费的时间
wolfgang 回答时间:2018-5-21 13:28:48
换轿跑 TrueStudio
GKoSon 回答时间:2018-5-21 16:51:49
tsuibeyond 发表于 2018-5-21 12:23* b+ r$ J' ?( h" a8 B
个人感觉,KEIL是手动挡汽车,IAR是自动挡汽车,对于驱动调试KEIL更好一点,对于算法之类的调试,IAR更快 ...

6 v6 g) m3 X  g! V大神
samhong 回答时间:2018-6-19 05:35:53
TrueSTUDIO 9.0 下载了,不错,

所属标签

相似分享

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