请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
leoyk 发布时间:2018-5-21 19:55
本帖最后由 leoyk 于 2018-5-22 08:28 编辑
" Y% Y8 P) N/ A5 ~0 K/ Q/ T4 P% y$ f) z: {0 }. a$ B/ a: ]
    首先感谢论坛给的机会。    今天的实验内容是使用cubeMX配置freeRTOS,创建3个任务使NUCLEO-L496ZG上的三个LED实现不同频率的闪烁。
7 K$ t! l2 m- G" H2 ~: E& ~) v& a5 p5 p/ }
    这是未使用RTOS实现的流水灯效果 https://www.stmcu.org.cn/module/forum/thread-615434-1-1.html ,典型的单线程应用。在时间敏感的应用中,单线程的程序必须等待整个程序运行完或者中断发生才能再次运行,实时性较弱。今天采用的freeRTOS是实时操作系统之一,特点是多线程,采用“轮换”的方式实现“并行”的效果,操作系统内可以建立任务,每个任务都可以认为自己完全占有着cpu,这样整个系统的灵活性就会非常强。今天使用cubeMX简单配置MCU实现多线程的效果。
- Y8 W+ K+ n/ e( K1.使用cubeMX创建一个新的工程,本文选择STM32L496ZG主控
5 n0 O" M7 p+ O# m. d0 D7 v 9f4cc26cb7a706ceef4610d1bfb9bbc.png + A" F' m, g7 G4 i  O) j
2.如图,配置三个LED所接引脚为输出模式,并标注好名称,注意:LD1-->PC7(初始硬件状态下), p& ?- v6 ?, N. y+ q
53b8c1ec2cb528643d918e21cb18e60.png
/ \( `3 X6 ^/ I 1.png
/ f# x& ^2 a# N0 ~: c& w3.配置系统HCLK为72M,这里告诉我们最高可以设置为80Mhz(振荡器HSI 16Mhz)
& _% h1 D- a$ k/ P5 x f0707e1906b2fd0c54a51b077833a74.png + _3 R4 ~6 k: S. ~8 f
4.勾选FreeRTOS
5 k4 o6 R0 M' M7 ?2 \ 766e751c4a0a582e87b70b5c9d3f742.png & M; M$ V  z5 e
5.点击配置界面的FreeRTOS出现具体配置界面,本文只配置tasks & queues* e' q5 W+ w. n' L) M. z
c9c644905ffa0f955f0b5d4bcf7515a.png & \2 |# I( }8 p. f  N& f5 J  W
6.双击初始的task进行配置
8 C, @2 H8 u% d 9e615b7cce9786b71f7c046bd529519.png 5 x" p' g8 m; H* H" v' g& l
7.修改任务名称、任务函数并配置优先级为belowNormal( o; L: P1 @8 `6 @( c2 c
205fd000d54b83ebf3b780ea0cb036f.png - H+ j1 J  g. H- ~0 x; h2 N' ~+ s7 N
8.点击add增加两个新的任务分别控制LD2和LD3,注意他们的优先级分别为normal和beyondNormal,优先级是可以自定义的,本文仅仅是将三个任务区分开来
" T- c8 e6 ^& ^  I a1ecc5de1038b0dc09ff13e36fd12dd.png 02b4db3d2b2dbc21104679f15537400.png   |& p8 X( @% j4 C
9.到现在,目测配置已经完成了,整个流程十分简洁,尝试生成模板,此处使用默认的设置,未将所有外设分.c.h存储% o! Q* P' n, l  J: @/ S$ G2 z6 r
ff9863f13bf44b93be22936a0b34cd7.png
2 n7 V' J: o& \+ \: w. n5 j10.弹出错误,提示不建议使用systick作为timebase source,我在网上查到两条信息:1.可以在RCC内设置timebase source为定时器,2.(未验证)不需要处理这条信息,系统会自动分配。此处我们尝试使用TIM1
# S  Q+ M& Z9 u& y: a- |4 v# w  }. v 6dd4827177f0f9808da1e261f1f63a6.png 1 l6 y* _3 u4 g

. z  t+ P6 @% W* | 517b6c88c658190357bdf4ff819661f.png 3 H( |* p2 ]- z6 _
11.生成成功,打开文件,可以看到系统自动创建了三个任务名称(我们之前设置的名称),建立并开启了三个任务。
- w: P; r! N5 H$ ?. G b683bf39bc1044a433efb943af72c62.png 2 H: L1 r0 z; ~7 N# h
167c92c04efdfb39bb40848ee5264b7.png " N. [) M" o/ E4 S

$ j. ?6 L5 e. B( U5 }, U cd1cebfccbd169c0dd8c3b4c8e9deac.png ; W. u9 A' X, R2 n- J# b
12.此处提示理论上用户不要在下面的循环里写程序了,因为调度器已经开始了。* m! _. _+ ~" o" D, {) E
c187f906d64a9df23db380b8320a202.png
: w1 i! I8 X! j: ^# F( h13.我们找到三个任务的函数,可以看到每个任务都是一个死循环,并且内部有一个延时。死循环是代表每个任务都可以认为自己是独占cpu的,延时是为了给其他任务一个执行的机会。如果不加延时就会导致调度器无法为其他任务分配资源,也就无法执行到了。! n9 u& t2 F, y  N" h- R
840f4fae4180eece688f99a35f37332.png
* a( l/ }+ U6 s3 w! U14.分别在三个循环内写入不同频率的闪烁语句8 n8 Y  M' z, t. H. `5 C
39837ab1a533233bf36584ebfe6ba86.png
7 b' z) W; {3 U: _* G15.编译无误后上传,停止调试后可以观察到LD1看不到闪烁(100hz肉眼无法察觉闪烁),但亮度只有其他灯的一半,其他两个灯分别以10hz和1hz的频率闪烁,如果有示波器应该能清楚的验证开发板同时输出三种频率的方波。! Y: g9 w( i) k" s  X, z
539014094576620497.jpg ) o7 s) g1 p3 k' r) V
后记:每个任务都可以有自己的“初始化”即在任务内循环之上进行变量定义和初始化操作,不建议在程序内使用全局变量,因为在没有保护的情况下,全局变量有被意外改变的风险,程序之间可以通过邮箱和信号量来进行交互,下一篇再说。& R4 ^0 m6 q' ]6 {, M
/ [; W2 ?" m8 ^. Y6 [

1 _% J# u* d8 H9 k9 @) d2 x
收藏 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' M+ R% M2 K- V  w
很详细哦

8 j: a1 {% E& H! W$ K5 ?期待下一篇.......多谢!!
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 手机版