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

cubeMX + FreeRTOS 第一篇 创建任务实现3个LED不同频闪烁

[复制链接]
leoyk 发布时间:2018-5-21 19:55
本帖最后由 leoyk 于 2018-5-22 08:28 编辑
4 f# u9 U1 B, B; g/ X6 Q+ t
3 G8 c: ^, R+ x$ Y1 b8 @    首先感谢论坛给的机会。    今天的实验内容是使用cubeMX配置freeRTOS,创建3个任务使NUCLEO-L496ZG上的三个LED实现不同频率的闪烁。
) R7 E( Q( g3 f: D4 w" X
4 g- u/ p7 o7 k5 f/ ~. \7 Q    这是未使用RTOS实现的流水灯效果 https://www.stmcu.org.cn/module/forum/thread-615434-1-1.html ,典型的单线程应用。在时间敏感的应用中,单线程的程序必须等待整个程序运行完或者中断发生才能再次运行,实时性较弱。今天采用的freeRTOS是实时操作系统之一,特点是多线程,采用“轮换”的方式实现“并行”的效果,操作系统内可以建立任务,每个任务都可以认为自己完全占有着cpu,这样整个系统的灵活性就会非常强。今天使用cubeMX简单配置MCU实现多线程的效果。, l  h/ S# k6 [8 i6 Y
1.使用cubeMX创建一个新的工程,本文选择STM32L496ZG主控. ~- H2 T* k; e! o( \; ^2 Q9 ?
9f4cc26cb7a706ceef4610d1bfb9bbc.png
& m; b* J" u8 n3 [% w2.如图,配置三个LED所接引脚为输出模式,并标注好名称,注意:LD1-->PC7(初始硬件状态下)/ B( K+ l% G+ ~, j; R; v
53b8c1ec2cb528643d918e21cb18e60.png
% a2 h6 `( l( Z3 p3 j, k$ U' m  ~ 1.png ' Y  Z, M6 C" e, ^6 t" `
3.配置系统HCLK为72M,这里告诉我们最高可以设置为80Mhz(振荡器HSI 16Mhz)0 D0 T6 ]* I9 W* {9 H7 e" a
f0707e1906b2fd0c54a51b077833a74.png % `$ g" r& t, i0 O: ~& d- C8 G
4.勾选FreeRTOS
9 S" O, J9 Y" @* k 766e751c4a0a582e87b70b5c9d3f742.png ( o0 l& I# ~( K. V6 D
5.点击配置界面的FreeRTOS出现具体配置界面,本文只配置tasks & queues& g% p) B( o# O) a, U
c9c644905ffa0f955f0b5d4bcf7515a.png 3 q! w- a% ~/ @0 l; j2 W+ b
6.双击初始的task进行配置1 Q, f. r0 f0 e. d# ~: Q# Q7 V
9e615b7cce9786b71f7c046bd529519.png
1 U* `/ w% V4 q$ Z3 ~7 f, H7.修改任务名称、任务函数并配置优先级为belowNormal. b7 N2 ~9 N( H- @& |# p
205fd000d54b83ebf3b780ea0cb036f.png - ^7 q1 g7 D( ]5 [8 q* N7 q
8.点击add增加两个新的任务分别控制LD2和LD3,注意他们的优先级分别为normal和beyondNormal,优先级是可以自定义的,本文仅仅是将三个任务区分开来  e( F! V/ ]  `' g3 q' t6 n% ^( C
a1ecc5de1038b0dc09ff13e36fd12dd.png 02b4db3d2b2dbc21104679f15537400.png
  l" U$ L" t5 n# _  F+ F1 q% }9.到现在,目测配置已经完成了,整个流程十分简洁,尝试生成模板,此处使用默认的设置,未将所有外设分.c.h存储1 [9 e, b$ [3 ~8 V1 ^: }) f. g0 @
ff9863f13bf44b93be22936a0b34cd7.png
' t8 \: R; Q- z& [) w1 T3 l0 O- U10.弹出错误,提示不建议使用systick作为timebase source,我在网上查到两条信息:1.可以在RCC内设置timebase source为定时器,2.(未验证)不需要处理这条信息,系统会自动分配。此处我们尝试使用TIM1
$ z4 {) m" j% M- Q; H/ M4 R 6dd4827177f0f9808da1e261f1f63a6.png
0 z8 X0 L8 X5 G/ n. N3 a& V. K
; l3 Q' [4 |4 z; ] 517b6c88c658190357bdf4ff819661f.png   ?  q* _8 F! K0 r1 {* e# p$ G
11.生成成功,打开文件,可以看到系统自动创建了三个任务名称(我们之前设置的名称),建立并开启了三个任务。
2 i' C$ g0 |* i+ W2 m' D& o* c4 [$ H b683bf39bc1044a433efb943af72c62.png ( d$ j; N1 z) x% s& x
167c92c04efdfb39bb40848ee5264b7.png
" r: L( E7 X/ L0 k. |
/ J1 a5 Q1 \( q( ^$ R) G8 ^: u cd1cebfccbd169c0dd8c3b4c8e9deac.png # N$ E, k" M' i3 f& r
12.此处提示理论上用户不要在下面的循环里写程序了,因为调度器已经开始了。! `3 @2 T' f8 T! \5 o3 a  Q6 u  K
c187f906d64a9df23db380b8320a202.png
% o9 t; ~' w1 H2 h& y0 Y( H3 z. o13.我们找到三个任务的函数,可以看到每个任务都是一个死循环,并且内部有一个延时。死循环是代表每个任务都可以认为自己是独占cpu的,延时是为了给其他任务一个执行的机会。如果不加延时就会导致调度器无法为其他任务分配资源,也就无法执行到了。+ X2 n1 v" X; J% a/ q; D7 _) M
840f4fae4180eece688f99a35f37332.png . A) r+ {  S- p2 Q9 Q
14.分别在三个循环内写入不同频率的闪烁语句- v' S* V  S# F3 G2 r8 P1 @! F5 c
39837ab1a533233bf36584ebfe6ba86.png 2 O3 S6 `6 R( Y* b$ t) W
15.编译无误后上传,停止调试后可以观察到LD1看不到闪烁(100hz肉眼无法察觉闪烁),但亮度只有其他灯的一半,其他两个灯分别以10hz和1hz的频率闪烁,如果有示波器应该能清楚的验证开发板同时输出三种频率的方波。8 e* \1 d1 m% Y2 O- Q! P3 V* M
539014094576620497.jpg
- Z$ S- J% c) U, ^. p后记:每个任务都可以有自己的“初始化”即在任务内循环之上进行变量定义和初始化操作,不建议在程序内使用全局变量,因为在没有保护的情况下,全局变量有被意外改变的风险,程序之间可以通过邮箱和信号量来进行交互,下一篇再说。
# z) y! t7 y0 D5 D6 A8 ]. o$ T+ ]& t* D9 }* t7 @) Q7 `; r
& J4 K  d  T- W  b! T9 W
收藏 5 评论7 发布时间:2018-5-21 19:55

举报

7个回答
pythonworld 回答时间:2018-5-26 08:08:05
很详细,入门必备!!!
xiaojie0513 回答时间:2018-5-30 10:19:26
很详细哦
king_lv 回答时间:2018-5-31 11:33:54
感谢楼主分享
emon 回答时间:2018-6-8 14:02:10
xiaojie0513 发表于 2018-5-30 10:19$ l* v3 ~2 V  D8 r& a0 N! i4 [. ~, U( K1 O
很详细哦

* T1 S9 P  s, S) ~8 |期待下一篇.......多谢!!
Lufie 回答时间:2018-8-6 17:52:16
藏不住的时光 回答时间:2019-4-16 15:59:19
谢谢,很好的内容!!!!
梁小梁 回答时间:2020-3-9 16:46:07
有生之年还能看到第二章

所属标签

相似分享

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