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

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

[复制链接]
tsuibeyond 发布时间:2018-5-19 22:09
本帖最后由 tsuibeyond 于 2018-5-19 22:14 编辑
; F# e, @. e4 |2 V. N' |+ M8 k  g
/ |; d0 G* I. B准备工作:2 }; k: v, g. F9 \' p
NUCLEO-L496ZG开发板. d7 I4 E7 `5 t( A
一根micro USB线0 L& ]- K5 c+ z, N- y+ K5 \
预装STM32CubeMX
7 S) h& N8 p( A( \预装IAR8.22
# x0 Z5 V4 Z% k0 G1 n. s: }: J& w+ D) r8 T7 t
实验任务:! t6 r8 l4 u  o7 X  y
  • 用STM32CubeMX完成代码基本框架的生成
  • 借助FreeRTOS完成前后台任务运行机制,涉及内容包括任务创建、信号量、队列等。$ |; d7 @3 I, h. B( ?( a3 q- b
; n( ^. K* ?$ T& r2 n' N8 `5 `
实验内容:
# k2 ]4 p2 r; y5 S: c
  • 用STM32CubeMX进行配置,直接新建工程,选择L496ZG的板子
    % S. y+ n  h+ f& D/ @
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image.png; L! @! j- h/ B2 o" f
1.png
: g5 b2 u( R8 o2 N5 x& L弹出对话框,选择默认设置模式) ~! Q4 f% t  \; m! O7 z
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(1).png# ^1 O& |2 a" G) h+ `- p' [1 _2 [
2.png 2 S& c2 F5 D. n' W1 L5 ]
进入界面如下:9 P$ a. w* p& y( Z( W" o# E
3.png / v$ ?$ v, t1 T
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(2).png: J& o  q0 ?# S9 @& f, ~' R
修改时钟配置
; v% a, l2 ^8 D 4.png ' f3 H$ ?8 C, u& P& z) N9 G
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(3).png4 B, r6 F$ ^+ F( L6 h
使能FreeRTOS5 K& U  S4 t# K7 X
5.png ! |8 K6 v8 d. q4 U* t1 s- B0 q
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(4).png
7 P2 c5 Z: e' l/ |修改TimeBase Source2 l# ]9 l/ d; B$ x* W4 E! N: |
6.png
5 g0 @( a2 m3 ?# E# h. Tfile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(5).png, w3 x$ t0 T% k- W; E
时钟树配置:2 ?0 K1 l2 \& H. r" ^% D3 K: z
7.png
2 I  _8 J3 ~3 Nfile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(6).png) p8 k4 Q  ?" p% c, t
然后生成代码0 y6 ~. i) z2 _9 K" r0 m- R
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(7).png
( b, z* [/ G5 T- K' M 8.png
) k) o5 B" a" c" h( z* x不明白为什么,这个流程生成的代码有个时钟不能配置通过,需要将其注释掉,才能正常启动(求大神解释)
( j+ p" t" A/ w, ?  s+ W  /*
) E) F1 B2 K( }9 g6 y" a2 y  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  Q8 [  G1 \9 Q" D# L5 i  {3 |) g6 ?& w/ M9 f8 B6 f
    _Error_Handler(__FILE__, __LINE__);1 [1 {/ o7 H- d: F: b
  }  a4 D8 ?4 v+ L  C
  */
( [0 z7 a% n; N$ Y
, |; e9 g' E, a- S- f

+ }7 K7 ]1 s3 t& `  [
+ ]7 \( b' B# q' W& E  H0 }实验1:创建任务5 ]  x& Y- b2 w2 z: M  |
这里,我们采用图形化界面创建任务' m3 t- m/ u1 P, N& o/ A8 f) s
9.png
9 J8 w1 r+ Z0 A  c( M& Jfile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(8).png
* B0 O0 I8 w0 e' n" G% B, Q手动输入任务参数:
+ i2 r- y( z% a" _2 j$ {+ ? 10.png
0 j3 g* j- O; ?$ z8 W" Y& V( `file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(9).png: l- G2 i1 d! X$ L5 C
生成代码(注意还要注释前面的那个时钟配置判断),添加必要的头文件
3 p4 F5 {$ ?( O& M+ s+ _' B1 @/ c 11.png
# _' F7 v7 X& C* f3 @; {file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(10).png- d; ~6 b& j0 l1 C6 T2 X
编译运行,就可以观察到LED灯在闪6 b% X/ ]8 A  m
1 Z# d' I1 K; D
然后创建第二个任务 串口打印: M" `6 o& l! z, ~- `
首先配置串口参数1 K- _0 _- X& H9 Y2 R% Y+ n
12.png " Z7 `  M& }- _; c
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(11).png" @* |) y6 I; Y
然后手动添加任务
. I6 z% e6 c( k5 a+ G$ q 13.png - P, S" v* N" U" ^7 y
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(12).png
4 U  \5 F" p6 ]* Z同上一步一样,生成代码
+ _! F' o" A) t- q- u3 n  } 14.png
) ]. }9 i* [" t9 E, Q添加printf支持代码
, B# c  C( v% R0 k% Z#include "stdio.h"  $ O8 ]" N4 ]: v# f$ _+ Z# L
#ifdef __GNUC__  ' i% r9 ~: e3 e. a( k
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)  
/ l; [/ w7 i- r' q9 ~#else  
+ O; s0 a0 j% V1 T8 M7 w; g! p: }#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)  9 C4 f, d& R2 A" a- z2 ^
#endif /* __GNUC__ */  7 l9 q! O( i9 A, ^& E4 I' K% k  U
PUTCHAR_PROTOTYPE  1 a- C2 v2 F; ]
{  1 q1 L' P- K- p# v6 k# y7 k6 x" J
    HAL_UART_Transmit(&hlpuart1 , (uint8_t *)&ch, 1, 0xFFFF);  3 h* F, o- n& _2 D$ G5 R% |
    return ch;  . q3 _  U! z2 C7 K/ Z3 D* M# h
}
- \2 B: S* N7 k1 @0 S% \9 M

4 l" ]4 L9 x; H* rfile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(13).png2 f5 F1 h9 O0 L. E$ D
在freertos.c中添加任务代码
. s2 Q% F* j, E& i 15.png 5 n( e/ c8 I- W' R- Y& D8 W4 q
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(14).png
0 M1 l" }6 ^/ c编译运行,可以观察到串口打印出信息
' F$ o2 \# L2 L1 y( \2 J& @" Z/ d
$ A- M( Y/ o; }  S% \7 `8 s2 D% b+ B( ]% k7 R* O( d$ n
实验2:信号量的使用
. }( c5 j/ i+ {+ _8 F& o- M% L9 `! ?同样使用图形化界面进行配置,如下图所示:- s5 X" Z8 _  p
16.png
# f( w5 a5 l. s; mfile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(15).png
6 a' C6 t  M8 g" `  e3 M7 }点击生成代码* t/ E& ]" J  S3 L, J/ n- u, J
17.png
9 ~" ?6 s2 v( Z- S8 Yfile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(16).png
  n: y0 d, ~5 ~8 s4 k- W0 m0 X代码修改:
0 W' x# B. |5 j* I 18.png , v" _# z& U4 {
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(17).png% G4 X; _( U9 @  O% z; u! e4 V
编译运行,就可以发现灯每闪烁一次,串口就打印一次
; j) k  \+ T' j( K 19.png " V- O* z( [+ v9 g
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(18).png# O& _: e/ u9 [  @

+ O" m. J7 k, h0 M! f实验3:信号量的使用
- S! ^) B/ P4 j如下图进行配置,点击OK,保存
2 r9 n5 L* j+ g, q0 }+ c; f- n 20.png
2 |8 Y, x" {- Afile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(19).png/ V. N, A. j' Z7 ?+ @1 L8 w! T
生成代码
  j% P! @1 [2 O( k% d. F$ T 21.png , {/ L5 Q+ ^+ T: G* m6 k& o
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(20).png
/ m2 a4 \5 m& X3 a2 ?9 T程序修改,红色部分是添加的内容,定义一个变量,然后队列每次发送的数据都自动加1,队列数据接收部分接收数据后,将接收到的数据打印出来
* t' t5 b4 `4 f9 r6 a' j8 b 22.png 6 Y( r4 b4 [3 p  \. I; F3 B
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(21).png) G: T' n' j. K' E  ?
最后运行程序,效果如下图所示,; t6 ~& x* ]7 q* Q# p( `4 X# e
23.png
7 Y- O- e1 Z) a( w
( R; l* j0 t- l3 B  E上述内容只是关于freeRTOS的基本操作,但是能够满足一般工程的应用需求了。2 X' [4 w  X" i) x3 C) f: l
正在做基于freeRTOS的通用机器人(如多旋翼)程序,待实现基本功能后再开贴发布
0 h/ U' W" \8 y' i. @8 ifile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(22).png
" t0 f/ d% M3 h3 b& o- |8 F代码工程:(网络似乎又有问题了,后面再上传)' M- K9 }# G% n. ?- C, J
TEST.part01.rar (9 MB, 下载次数: 51)
收藏 评论5 发布时间:2018-5-19 22:09

举报

5个回答
GKoSon 回答时间:2018-5-20 11:49:11
可以 的  支持  5 x! x: G! f/ }6 z2 [
问问IAR和KEIL比较 有那个地方比较好吗& k7 z8 P# a0 x1 ^# ^
tsuibeyond 回答时间:2018-5-21 12:23:56
与龙共舞 发表于 2018-5-20 11:49& ~- p* V. k6 N$ q( B: L. P
可以 的  支持  0 ^3 F0 u: Q4 y5 g
问问IAR和KEIL比较 有那个地方比较好吗

6 T; p4 Z& M. f6 l" F8 I个人感觉,KEIL是手动挡汽车,IAR是自动挡汽车,对于驱动调试KEIL更好一点,对于算法之类的调试,IAR更快更方便。
0 i& C6 a8 C# B! Q8 K9 q: }& p& rIAR编译速度似乎比KEIL快很多,可以一定程度上节省编译所花费的时间
wolfgang 回答时间:2018-5-21 13:28:48
换轿跑 TrueStudio
GKoSon 回答时间:2018-5-21 16:51:49
tsuibeyond 发表于 2018-5-21 12:23
4 X: {; ^6 K, c1 {) R个人感觉,KEIL是手动挡汽车,IAR是自动挡汽车,对于驱动调试KEIL更好一点,对于算法之类的调试,IAR更快 ...

: a2 J1 A) [- R大神
samhong 回答时间:2018-6-19 05:35:53
TrueSTUDIO 9.0 下载了,不错,

所属标签

相似分享

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