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

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

[复制链接]
tsuibeyond 发布时间:2018-5-19 22:09
本帖最后由 tsuibeyond 于 2018-5-19 22:14 编辑 % R0 i) c  m- b7 i

/ I6 J- ], k1 G& D3 ]) P  N准备工作:: o- C9 v7 V6 @" e! M& ~
NUCLEO-L496ZG开发板# W) z# ~% f" ?; y6 L- P
一根micro USB线
0 c% @; c9 F* w/ C7 A预装STM32CubeMX
8 D3 f5 V/ H; I5 T' `* [0 r预装IAR8.22
! D/ e& R- Z3 T+ z( Z. h) b/ i6 C, g" b8 A& x5 G( f& E1 t
实验任务:, h# n9 E, U+ h7 S7 y
  • 用STM32CubeMX完成代码基本框架的生成
  • 借助FreeRTOS完成前后台任务运行机制,涉及内容包括任务创建、信号量、队列等。# D* L% P; Q1 D. V  m9 F
: O2 ^1 P6 P) Q0 b* F( c
实验内容:) O8 a' G  N3 A: H. Y" e5 w
  • 用STM32CubeMX进行配置,直接新建工程,选择L496ZG的板子
    2 {5 t" \1 }) i$ W$ }
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image.png% t% f) K. L& f4 z7 T
1.png
: c& Q: u; p  `  e弹出对话框,选择默认设置模式
% G  ?. G/ s' V0 f" {! [* z( f/ S% qfile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(1).png  y1 C& u3 H2 |8 X
2.png
4 [8 ^4 e) Y" I5 d; i" M9 J进入界面如下:; z" w9 z" l! M8 O0 {% d. f" r
3.png 2 n/ X& O  S- j# ?0 Y2 T
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(2).png
* Z2 E  G6 l* R& n# S* ~5 X修改时钟配置- I/ \1 f9 y. `6 O
4.png 7 h' a0 K6 r# P0 x  S0 ^
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(3).png" ?1 B+ ?  X0 U8 w" X  M7 R
使能FreeRTOS
6 [8 x- _& K& q! j 5.png 9 h3 n" }1 |2 j, @$ |+ u
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(4).png
0 J8 A/ q3 Y& j+ ~" L修改TimeBase Source& t* t; @8 ]" F4 n7 G4 i
6.png ) A* F3 A# b1 B$ z- P/ B; }
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(5).png! z2 \2 ~4 D4 b. R4 i
时钟树配置:+ [9 y" A- W/ W5 h* G, U
7.png
0 a; l1 c1 q6 U; r) \4 sfile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(6).png
) M7 ?: Q" `/ J" g" k3 k1 b/ I然后生成代码
. j/ ~$ z2 P; Zfile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(7).png0 y- J+ B4 B, R! f% _
8.png   [) D* r: ~" `( u$ h0 H: a
不明白为什么,这个流程生成的代码有个时钟不能配置通过,需要将其注释掉,才能正常启动(求大神解释)
1 P' C- }1 o" [& Q  /*3 z! `  I" ~$ |0 i3 Q: L8 A5 Y
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)) H" i. _- i8 i) P8 Q
  {# d# O4 X4 K1 A! x
    _Error_Handler(__FILE__, __LINE__);: K. n4 P, n/ U8 i
  }  \' A. F& U# O) a2 y) J% a
  */
/ R9 T0 y0 p, }( m

" d5 x) \  e# ^! u6 }  x. |9 x; S3 ^5 K8 s; W" X; Z

1 V, W7 b" G, `. t/ B' J实验1:创建任务5 ^+ X3 S. T  v) z2 `
这里,我们采用图形化界面创建任务
: N, ~4 m; E& e2 s# ]5 X% d" t 9.png
) W9 i' X- ?( }- q( V% ~( hfile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(8).png
8 S8 z3 C% k- U手动输入任务参数:
/ n3 t* {8 I5 f5 m, D/ n0 ? 10.png + ]# h. D* [, H) q: [% ~# O
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(9).png" |3 b8 x3 V1 y6 Z+ A
生成代码(注意还要注释前面的那个时钟配置判断),添加必要的头文件
; H; U3 i& ?/ C! y 11.png
$ @0 E0 ^! F2 y0 U8 pfile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(10).png
1 ?9 g6 ^) f9 m7 n. G5 a, g编译运行,就可以观察到LED灯在闪& V% t$ ^2 l7 x: \

7 B) D* O- U) _" ?0 S$ W# b) [5 v3 g然后创建第二个任务 串口打印
# A5 f8 Q7 l5 Y, i1 f首先配置串口参数
! E- q7 P0 a+ m& u; p 12.png ' L2 P! Y1 O1 D
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(11).png
1 g! ?: S( N% e- `) _$ o然后手动添加任务0 r2 V. x$ y* _( J0 p, Y; V
13.png
) L- F1 l2 e: v% Afile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(12).png
8 T& u/ J6 A8 P% J; z同上一步一样,生成代码" ^. `' i/ Q) V2 _/ ]0 }4 j/ v
14.png
/ |+ ?( E3 Q; }( O1 N1 A添加printf支持代码
. ^2 E# i7 ~4 l5 V#include "stdio.h"  
- S9 S# V; j7 Z2 z  k! V& V#ifdef __GNUC__  
' i" Q$ {6 _7 f* U/ z#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)  # Z& c$ e- R* P5 m) A8 O# {
#else  
- Z, F  B( m( Z#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)  ; I  L* j0 |% ]# \
#endif /* __GNUC__ */  
( B3 {8 s* m) v; F5 HPUTCHAR_PROTOTYPE  
* v1 l9 D  g! W  b{  
. K8 `2 ?% H4 ^. W2 s( ~9 t    HAL_UART_Transmit(&hlpuart1 , (uint8_t *)&ch, 1, 0xFFFF);  
/ j8 V& i6 m0 C7 U$ d    return ch;  ' S/ Q3 V6 w0 o
}' N1 J+ v% V3 x
! F1 V8 E: I+ b2 F% V
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(13).png
  y5 h) h5 @6 o" C/ L. \3 I$ o& Y在freertos.c中添加任务代码; `, Y  N& f6 `$ t4 u
15.png
7 z% W$ z5 t  e. Kfile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(14).png
, p6 m0 O& U3 j- k+ ?( ~+ c- q编译运行,可以观察到串口打印出信息2 ]) ^4 E. n( ^

1 j& c! d9 u. C- Y. D! Q3 n
, S& @1 p" u8 f7 w实验2:信号量的使用' h0 h1 n8 i+ _# K; ?% m. I
同样使用图形化界面进行配置,如下图所示:8 V8 l( e8 f5 p3 b& ^9 z# S
16.png 7 A0 ?# j$ N5 X) a: {
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(15).png$ w* U! _, ]0 W* r- r1 A0 b
点击生成代码
& x! I* E- P; M) W 17.png 0 Y) n6 {- V* \) p; K
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(16).png7 t) o# ]  ]2 A) q6 u3 J  c& a
代码修改:- ?" \: Q# u. w8 V; {4 v: B' M
18.png 5 @$ Q5 c  d) }, D3 D; Z' i: @& N
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(17).png
4 C5 D9 o$ w$ x2 d' g4 [9 {1 p编译运行,就可以发现灯每闪烁一次,串口就打印一次
8 j6 [- U0 u  | 19.png 5 j. F* y/ j8 ?) w, R- Z
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(18).png
/ u. t& E% \& v; {) V$ z& H* m' ^# [
! |3 w4 h, K# l. W3 ?实验3:信号量的使用
3 b9 e. L9 d6 g4 R/ u6 z# y; E如下图进行配置,点击OK,保存
$ N, ~, u( S! S 20.png
* j4 S+ L/ z6 mfile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(19).png  h% X" F' O) ]& w. I: k
生成代码
& R; T0 g# R& R5 _2 I 21.png
7 Q5 C  M7 M! rfile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(20).png
2 ]1 j+ T* x4 u程序修改,红色部分是添加的内容,定义一个变量,然后队列每次发送的数据都自动加1,队列数据接收部分接收数据后,将接收到的数据打印出来2 ~4 M0 d  G2 M& q) h( D( B1 z0 a
22.png : e* X9 M( B9 Q4 R/ b  v) ^
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(21).png/ D2 R* @, a/ H( {5 e$ ~/ |* E
最后运行程序,效果如下图所示,
1 U% B6 P' o/ f$ N8 u$ X% Z( D 23.png
" Y! G- b1 m2 l
3 s+ r% u. F( |4 s; }上述内容只是关于freeRTOS的基本操作,但是能够满足一般工程的应用需求了。
2 z) D  Q% v6 B9 g& X2 Y正在做基于freeRTOS的通用机器人(如多旋翼)程序,待实现基本功能后再开贴发布
- ^' U' g  P' J+ s; Jfile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(22).png
2 J  F! b; o4 S" H1 M代码工程:(网络似乎又有问题了,后面再上传)
' k" {' `" n- d0 H' K* |; { TEST.part01.rar (9 MB, 下载次数: 51)
收藏 评论5 发布时间:2018-5-19 22:09

举报

5个回答
GKoSon 回答时间:2018-5-20 11:49:11
可以 的  支持  
' L) ~4 l' N8 U9 T问问IAR和KEIL比较 有那个地方比较好吗, J! R" l2 l8 z  n8 c0 J/ j
tsuibeyond 回答时间:2018-5-21 12:23:56
与龙共舞 发表于 2018-5-20 11:49
6 z8 L7 O7 ]* @8 S( p; j% c/ M$ O6 k可以 的  支持  6 n* \' o' j/ ~5 ~! J1 ]
问问IAR和KEIL比较 有那个地方比较好吗
+ }9 E" r  V& _/ l- U7 ?
个人感觉,KEIL是手动挡汽车,IAR是自动挡汽车,对于驱动调试KEIL更好一点,对于算法之类的调试,IAR更快更方便。: E$ o! c/ }  O+ ?- y
IAR编译速度似乎比KEIL快很多,可以一定程度上节省编译所花费的时间
wolfgang 回答时间:2018-5-21 13:28:48
换轿跑 TrueStudio
GKoSon 回答时间:2018-5-21 16:51:49
tsuibeyond 发表于 2018-5-21 12:23: O) m0 Y4 }- W; H" l$ \
个人感觉,KEIL是手动挡汽车,IAR是自动挡汽车,对于驱动调试KEIL更好一点,对于算法之类的调试,IAR更快 ...
. n* ?4 L& T$ C3 o
大神
samhong 回答时间:2018-6-19 05:35:53
TrueSTUDIO 9.0 下载了,不错,

所属标签

相似分享

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