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

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

[复制链接]
tsuibeyond 发布时间:2018-5-19 22:09
本帖最后由 tsuibeyond 于 2018-5-19 22:14 编辑 , u* m( ^7 V7 M/ z! `7 |. U7 ^

+ T5 l  O0 U1 Y! I准备工作:
! X& F# n/ B8 F3 q5 H7 \NUCLEO-L496ZG开发板. u7 ~  @& v5 |6 }0 @
一根micro USB线
$ L- ~8 q5 I5 k  [/ I% g预装STM32CubeMX7 F4 n- z* W& [2 D5 w  q' W
预装IAR8.22
! Y+ f8 t# e% y/ x, M) E7 l+ N  a" n0 ^) t; c  b' r
实验任务:3 T' q$ H7 T( S7 T, \; U; y
  • 用STM32CubeMX完成代码基本框架的生成
  • 借助FreeRTOS完成前后台任务运行机制,涉及内容包括任务创建、信号量、队列等。( r5 K( m) c0 m* b3 t. ~

# @8 Y* h2 Y0 _8 }3 S0 d实验内容:) n9 u+ b, Z  x- ^, S- N
  • 用STM32CubeMX进行配置,直接新建工程,选择L496ZG的板子. d1 R/ O/ ?7 }) z' k5 {' d0 q
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image.png
/ F5 G* S* `( @( ~$ D8 h/ d* s 1.png 9 u& i# C; @9 S. b$ O2 ?& `0 G% g
弹出对话框,选择默认设置模式
, P4 W* P. ]0 ?' D' \file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(1).png8 [7 w% N* |& A8 A& e; ?
2.png
5 c  `! i* y$ g进入界面如下:6 d% ]- c8 @* p8 @# h: [
3.png
* C" U3 l2 A$ ?1 Ifile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(2).png2 w, V$ ^' r( E
修改时钟配置
; W7 i2 W3 B& z. F" Q 4.png 0 s1 P6 H' t$ S
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(3).png* C+ f6 |) H- F
使能FreeRTOS
3 o" g$ Q7 c; q5 G. E 5.png 7 Z8 U* l2 y; L: A2 V
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(4).png
9 e. j8 C0 y5 y+ w! e修改TimeBase Source+ H2 t& o1 m* V+ ?+ ^0 z6 u
6.png , \. w& D1 u- V6 p
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(5).png
9 J- |9 P2 C/ ~$ j9 `7 q时钟树配置:
" N% X* G+ h) j8 R 7.png
. d9 x- z2 o! O( G& m9 e8 Sfile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(6).png
8 I/ [7 T, R# @) x* h4 y, O- _然后生成代码
$ P' S6 C  z/ K. I; g( O& _file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(7).png
4 x, h$ j& I$ o/ a$ I$ u9 c2 M 8.png
3 g6 h( x- X: T1 I不明白为什么,这个流程生成的代码有个时钟不能配置通过,需要将其注释掉,才能正常启动(求大神解释)
+ Y* r  ^( b% f  u/ Y% F; E$ x1 R  /*9 b. B! R" M: ~* c0 g8 R
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  B3 W8 p* }) w1 B1 z  {
3 v6 N: ]% T) c9 O% J: J    _Error_Handler(__FILE__, __LINE__);2 A. f: u, E! }+ ~6 o% [! e
  }. C# @% s0 o5 S* R- _' D! u$ Z
  */. J0 [+ D0 v' S2 C4 e+ D1 C

  t% ?! v% r7 I+ R* e
/ E8 O$ W& C: u8 e- i1 {- x3 O& g4 k3 |0 B6 a
实验1:创建任务2 c4 c! j* X+ Y, b9 t  {; u7 O9 |  u
这里,我们采用图形化界面创建任务
6 q; W1 N. `6 [: |- r* a2 O  [ 9.png
, G  \/ T0 S, `/ lfile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(8).png) ]6 A: A( P3 D" f8 n9 A8 z) r
手动输入任务参数:
& ^- t* ^+ w+ V- b: B% Z' t9 Z$ u( _3 T 10.png 6 L% h7 a( s( G4 G
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(9).png
8 q1 \, Y  N/ ?8 q( f6 z& E生成代码(注意还要注释前面的那个时钟配置判断),添加必要的头文件% G% o  @7 N' F% z6 p
11.png ! h1 {' V" M+ \! P4 _1 Q# H
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(10).png& }6 J, @& O' p* j1 g
编译运行,就可以观察到LED灯在闪1 K5 l8 b: s$ u! ]0 a9 q' y

8 m0 q5 A: p0 Y然后创建第二个任务 串口打印
" d2 k( G0 _& N6 s9 ]. G首先配置串口参数) a6 f  k# o& v( h
12.png
/ X- {" M) b1 i8 F# C  e/ Ffile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(11).png
# K( C1 ]/ Q, N+ K5 ^; v4 r然后手动添加任务
4 {& L. I, x9 ~7 o( b! _' x% @' M 13.png
* N9 w/ C% w9 D) P2 e4 o1 Qfile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(12).png
/ m' D4 a, j. X4 l0 B! O同上一步一样,生成代码; R8 d* Q+ L/ M  q: a
14.png ' e, B' k; V$ J" y2 @0 S) J9 y
添加printf支持代码
! I4 I( q7 o% k7 m) d6 |#include "stdio.h"  . \( S5 [! z% D
#ifdef __GNUC__  
/ [% [  Y. q( Z, R& H' `* a#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)  1 ^  K5 n7 y8 q9 K( U  I
#else  
+ ^' j; A9 r# b9 B+ c#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)  
: T: U1 |' z+ B5 t' O  Y6 S#endif /* __GNUC__ */  , |6 s5 ^5 M. y& ]
PUTCHAR_PROTOTYPE  
3 ]) h9 V- y2 k& \2 {$ f6 v# i{  
8 ]2 E8 `/ A6 \' @$ J* J    HAL_UART_Transmit(&hlpuart1 , (uint8_t *)&ch, 1, 0xFFFF);  
2 c* @; v" i1 J  r0 |! c; w- B; v    return ch;  
% |- \, G- s, y- x9 u- E}: ~5 T( u2 M6 f1 k
4 ?4 ^6 V7 A/ `/ H" H' p
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(13).png7 |4 i6 d, p$ f9 B1 P# z8 C5 k$ w
在freertos.c中添加任务代码$ Q& |6 C  S2 ?/ j( ?) c
15.png
/ j* d/ W$ }6 ^5 wfile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(14).png
. W( ]8 I! k$ G0 O8 ~% c8 O编译运行,可以观察到串口打印出信息
' B0 E7 p4 ]2 Z; F. V( z6 f* U" B' f4 I
+ G' [8 C" Z% o9 b& x
实验2:信号量的使用0 |" G* h# d1 j/ w
同样使用图形化界面进行配置,如下图所示:6 ~: t/ U. }) Y' p7 x4 I/ @, L3 Y) W8 Q
16.png 4 N% h: t5 n, R
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(15).png
1 [3 T# a- P; X点击生成代码) D% W) m; u! }0 @  V' u% W
17.png 8 G1 W2 N3 B6 A- X3 G6 R; w
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(16).png
8 N1 G, ^2 ]& V7 b' z. E/ v. Y代码修改:
6 D+ N4 N* i! H' z 18.png
( g8 {: x8 C3 l& @1 ]file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(17).png
/ W$ x( T8 ~# H. `4 s& {1 t编译运行,就可以发现灯每闪烁一次,串口就打印一次: Z6 A  w3 ]8 w: H7 Y, _
19.png
- U" h+ f5 n) Z3 ?7 }, c; Pfile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(18).png# x6 Y7 L2 t1 p; _
' F* e5 J6 c- n
实验3:信号量的使用
5 x$ T# N& d, b如下图进行配置,点击OK,保存5 B" Z* m. L/ {. U
20.png
$ g/ x8 Z  Y! T% C$ p, Y# B: h! o, n  ufile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(19).png
2 \4 Z0 ?& T. j# H4 C+ ]6 V/ l7 d生成代码6 i6 [# s9 r0 d! G' W
21.png
4 Q* z% C: {/ }8 Ofile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(20).png5 Q" _$ S+ N' K+ |  ?% j
程序修改,红色部分是添加的内容,定义一个变量,然后队列每次发送的数据都自动加1,队列数据接收部分接收数据后,将接收到的数据打印出来6 W$ m( {2 s0 o1 ]- x: v. A
22.png 5 r: Y" ]: R2 [2 j
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(21).png+ L5 }' q; h# U1 L- @
最后运行程序,效果如下图所示,
) p7 W6 h3 j4 X8 @, H 23.png
" b/ k1 Q# ^  K" O8 H6 N  q) y! G" n/ _" |8 @3 K3 Q
上述内容只是关于freeRTOS的基本操作,但是能够满足一般工程的应用需求了。) X! Q0 G. ]5 g
正在做基于freeRTOS的通用机器人(如多旋翼)程序,待实现基本功能后再开贴发布- t' e+ y& @; E, E
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(22).png5 x! C! l. R! a+ Y7 Q9 K/ D0 ]
代码工程:(网络似乎又有问题了,后面再上传)) }# S" y6 K2 F0 h5 m3 K
TEST.part01.rar (9 MB, 下载次数: 51)
收藏 评论5 发布时间:2018-5-19 22:09

举报

5个回答
GKoSon 回答时间:2018-5-20 11:49:11
可以 的  支持  6 `1 O" _4 t1 \5 n/ Z& i. R
问问IAR和KEIL比较 有那个地方比较好吗
) ~* Z9 V7 f" I) v& R: M
tsuibeyond 回答时间:2018-5-21 12:23:56
与龙共舞 发表于 2018-5-20 11:49% ^) E9 R* W! Z& ~2 E
可以 的  支持  
' F3 ~: X, x1 c. e9 g; }问问IAR和KEIL比较 有那个地方比较好吗
* c, f; d3 X: S% f1 ~
个人感觉,KEIL是手动挡汽车,IAR是自动挡汽车,对于驱动调试KEIL更好一点,对于算法之类的调试,IAR更快更方便。  y; A" Z4 `3 Y
IAR编译速度似乎比KEIL快很多,可以一定程度上节省编译所花费的时间
wolfgang 回答时间:2018-5-21 13:28:48
换轿跑 TrueStudio
GKoSon 回答时间:2018-5-21 16:51:49
tsuibeyond 发表于 2018-5-21 12:23
/ G" t6 E- d; H个人感觉,KEIL是手动挡汽车,IAR是自动挡汽车,对于驱动调试KEIL更好一点,对于算法之类的调试,IAR更快 ...
9 m0 r( j" z) Z& e
大神
samhong 回答时间:2018-6-19 05:35:53
TrueSTUDIO 9.0 下载了,不错,

所属标签

相似分享

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