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

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

[复制链接]
tsuibeyond 发布时间:2018-5-19 22:09
本帖最后由 tsuibeyond 于 2018-5-19 22:14 编辑 0 k$ I  `( y, `0 Y9 [3 [) L
7 u2 s; o0 ?9 y& _7 f' N1 t0 N
准备工作:
5 c3 }( E+ e( UNUCLEO-L496ZG开发板( k# I- x" P) F6 p- e6 W: ^
一根micro USB线! v3 k4 o# J  \; I
预装STM32CubeMX
2 v+ z7 v% T8 J5 N8 v预装IAR8.22- h( _8 I  `2 s& v. `
7 m% V+ V- s& ?% J9 W+ c
实验任务:# W& x+ e* n& T4 g
  • 用STM32CubeMX完成代码基本框架的生成
  • 借助FreeRTOS完成前后台任务运行机制,涉及内容包括任务创建、信号量、队列等。2 B' y- m, K2 C3 l
/ h4 n3 ~% s+ o5 w3 l( a
实验内容:
' T5 D6 r$ X/ F- J9 L; [
  • 用STM32CubeMX进行配置,直接新建工程,选择L496ZG的板子
    0 ~* i7 h/ n) D1 L. p
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image.png
% j" S/ ^: Y; A' ~9 K* O8 H 1.png
) y, D9 s4 H* \) z! N! N5 @弹出对话框,选择默认设置模式
/ ^6 S) ?9 b5 I, k9 ofile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(1).png
% y6 T8 ?: x( D' ]; [& E- q 2.png
# @  H! y. @4 u- [" r进入界面如下:
# P; X; ?, B7 n% W# g0 f5 {8 _; w1 U 3.png
3 ?  v- F  r* m+ J8 ?8 \" Mfile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(2).png) k- x9 ]2 L: {" X6 u0 O3 ]
修改时钟配置
8 g+ k: h9 T, @" q" q 4.png
3 a, d, \5 Y* E6 R) mfile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(3).png$ R7 F5 c4 F% a6 U" Q
使能FreeRTOS/ l. y3 g' ^  D& J& k0 I8 |
5.png 4 F# o7 X6 C& K& [- o) o5 ^1 D
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(4).png
( v1 y4 N( u' _, A- L" X$ W修改TimeBase Source
3 h/ ?0 \2 M/ I, O 6.png $ K$ I: S2 J1 T- k6 w. P% z. P0 l
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(5).png
" H3 R# n/ y: Y, B8 m/ c7 z时钟树配置:
1 E) g+ Y# I" U& T! S- u. B 7.png
% }6 ~- J3 W4 P1 H& Z0 @5 z% {file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(6).png
; f& n- _: O5 ~  ]- {( h然后生成代码) _  f3 O; I1 u$ @
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(7).png
/ V; r* x8 {6 I* f 8.png # {6 h3 R. I/ Y5 R2 ]( }
不明白为什么,这个流程生成的代码有个时钟不能配置通过,需要将其注释掉,才能正常启动(求大神解释)
& Q5 s- q0 n- b' J+ S  /*
6 ~; H2 i9 I, T3 E" \% v7 `  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
" ~. b' R$ w7 L) b; ~( a  {
8 X& P5 {4 G4 s+ [7 d    _Error_Handler(__FILE__, __LINE__);
* `* P" e/ z# h6 q7 g( H  }% W" K8 s7 t. B) w. \
  */
* f9 n/ b. n9 q( n2 s; R

- g* D+ r9 V# A- K6 c
  r5 }" K8 Z6 R- G3 T  ]) \9 U9 K# v& O; s, r6 t- ~8 m3 T7 A
实验1:创建任务5 p* A0 O! m  O& I
这里,我们采用图形化界面创建任务- Y2 A0 v7 e2 {% B+ l
9.png
/ L9 t3 r% S/ k1 n; q, \0 b2 ?file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(8).png
9 E; O( W; d( n9 b9 s8 a0 d手动输入任务参数:
* g7 t+ h" |: A- O5 d  O 10.png
, n0 e  _1 H* j/ |$ a0 R' ufile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(9).png
2 O. A* ~  t  J0 x+ @+ Q: b生成代码(注意还要注释前面的那个时钟配置判断),添加必要的头文件
) x+ ]& z, U. w8 r 11.png
/ q8 ?* d" N4 I' t9 C5 B& cfile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(10).png* I- l; K5 _1 U# H+ [
编译运行,就可以观察到LED灯在闪1 J9 b  J, Y) _% C& ?/ ]
# z! m: k$ ~  R* F; R; g% q
然后创建第二个任务 串口打印' u* R6 O* Z. i- M! X& m  z
首先配置串口参数
% ~! a1 \8 _9 s/ L) H0 q; U 12.png # G! `+ l  \- O% c5 M3 i$ c* j3 G
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(11).png4 [9 u' n1 W! W& z: n/ T
然后手动添加任务
. w2 r. {7 L5 W) Q) g 13.png 4 G: S2 g* ^; v/ g7 U4 p+ f
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(12).png: ]+ k6 o9 g! s
同上一步一样,生成代码! D) B) O, K9 a3 }$ q+ \. K' i* A
14.png 0 U4 Q/ b9 ^9 o5 Z) L/ R( K% q
添加printf支持代码1 ?$ k# t4 Q- u. Q, b/ p
#include "stdio.h"    e0 P& \$ S3 z: X; ^
#ifdef __GNUC__  
5 l( v7 m3 A4 t+ j. [#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)  ; m  z2 _- N* Z* S$ N: y
#else  % W' y7 C; x) ?) i+ O
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)  
7 w9 H% ~3 [. r5 N#endif /* __GNUC__ */  
) S! q$ L2 e1 I/ q* HPUTCHAR_PROTOTYPE  
: w2 d9 J. V( T* l8 Z{  9 j+ N. ^8 R+ a
    HAL_UART_Transmit(&hlpuart1 , (uint8_t *)&ch, 1, 0xFFFF);  7 y8 a  j' K4 z* v! @+ G
    return ch;  
- m7 H5 {6 n! Y5 l}
3 t* y$ N# b8 U% _9 L3 r

. V% G# G- [# D# A& \file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(13).png. A2 g( B& S' l7 o8 b
在freertos.c中添加任务代码: u- k# ~! L# l# u
15.png
' D2 d  k7 k4 N( Kfile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(14).png
1 M- U: X* b3 s  i3 |# @+ {编译运行,可以观察到串口打印出信息" w- }& N' m7 h+ e

6 o( r! p6 Y& g7 C1 F$ p
  |  P) W0 K0 t6 ^6 h! V# A实验2:信号量的使用( E+ I9 Z+ [, z7 S6 e9 e8 N' ~6 T
同样使用图形化界面进行配置,如下图所示:- T: B, d* e, D: ?4 q
16.png 3 y, L% K/ n7 I+ X: H7 @
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(15).png: {$ t5 w" s& c
点击生成代码+ Z) L, m4 E3 @: r. ?& _; y
17.png   o1 N5 X4 }2 E4 _
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(16).png
9 q5 ], `/ ^9 E3 `7 {" Q; Q- w代码修改:4 V. w% Z, D4 ?' T7 Z
18.png ' j2 X# M0 g3 ]8 L4 h$ P8 K. d$ _7 L$ H
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(17).png* R' k1 R- X' g) n2 L8 ^
编译运行,就可以发现灯每闪烁一次,串口就打印一次
. Z% K. V6 @% L7 t* k 19.png
6 N! d5 i0 |) o5 t' ffile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(18).png, k& k7 @$ m8 W: n! y

9 I' ~& r( @' y8 k; ]9 L% w实验3:信号量的使用
* }! ]0 j4 P- ?: }3 h) N9 h如下图进行配置,点击OK,保存
3 \" d" K1 O, W! P% W4 y5 O( g* b 20.png
) G* E0 H/ c' Z5 {$ Q* Lfile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(19).png+ m' T9 k% l8 C1 x* e
生成代码4 B! _+ M# c! D1 ^0 R/ Q( R
21.png
' y# Q3 X+ o6 e, B2 v5 V/ K+ dfile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(20).png! \2 S. @3 V  N4 |+ `9 F
程序修改,红色部分是添加的内容,定义一个变量,然后队列每次发送的数据都自动加1,队列数据接收部分接收数据后,将接收到的数据打印出来/ a2 a. a9 p& c% v2 X3 k  ?
22.png * e) i( `9 z5 G8 q
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(21).png
6 S" q" t8 ^9 d& t6 `最后运行程序,效果如下图所示,. j( x* R0 j8 n# z( G6 H& r# K+ A
23.png 2 b6 v- ]0 [: b& R! g

- u& i' d$ }5 ?4 n上述内容只是关于freeRTOS的基本操作,但是能够满足一般工程的应用需求了。7 X7 h3 Y4 m7 O
正在做基于freeRTOS的通用机器人(如多旋翼)程序,待实现基本功能后再开贴发布
- g& H( G5 g; yfile:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(22).png/ H- `6 E- X. J4 n( |. E, d6 t
代码工程:(网络似乎又有问题了,后面再上传)
% u8 E! L) G3 s% J8 c% E TEST.part01.rar (9 MB, 下载次数: 51)
赞 收藏 评论5 发布时间:2018-5-19 22:09

举报

5个回答
GKoSon 回答时间:2018-5-20 11:49:11
可以 的  支持  - _2 D" D$ y, W7 b9 t
问问IAR和KEIL比较 有那个地方比较好吗
% ^  @7 G$ w" B9 @9 z; ~& }9 {
tsuibeyond 回答时间:2018-5-21 12:23:56
与龙共舞 发表于 2018-5-20 11:494 K% S% v' A* ~: z/ y$ L; W3 N
可以 的  支持  
' R0 k6 Q1 U: V1 B: p, o问问IAR和KEIL比较 有那个地方比较好吗
  U8 t' z/ R( t
个人感觉,KEIL是手动挡汽车,IAR是自动挡汽车,对于驱动调试KEIL更好一点,对于算法之类的调试,IAR更快更方便。
4 g4 G! H% V6 ~# b" [IAR编译速度似乎比KEIL快很多,可以一定程度上节省编译所花费的时间
wolfgang 回答时间:2018-5-21 13:28:48
换轿跑 TrueStudio
GKoSon 回答时间:2018-5-21 16:51:49
tsuibeyond 发表于 2018-5-21 12:23
, ]: D$ n' p. k2 E$ h个人感觉,KEIL是手动挡汽车,IAR是自动挡汽车,对于驱动调试KEIL更好一点,对于算法之类的调试,IAR更快 ...

' P  h4 x+ j$ G: ^# C( J大神
samhong 回答时间:2018-6-19 05:35:53
TrueSTUDIO 9.0 下载了,不错,
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版