|
本帖最后由 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 准备工作: NUCLEO-L496ZG开发板( k# I- x" P) F6 p- e6 W: ^ 一根micro USB线! v3 k4 o# J \; I 预装STM32CubeMX 预装IAR8.22- h( _8 I `2 s& v. ` 7 m% V+ V- s& ?% J9 W+ c 实验任务:# W& x+ e* n& T4 g
实验内容:
弹出对话框,选择默认设置模式 file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(1).png
进入界面如下:
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(2).png) k- x9 ]2 L: {" X6 u0 O3 ] 修改时钟配置
file:///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 |
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(4).png 修改TimeBase Source
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(5).png 时钟树配置:
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(6).png 然后生成代码) _ f3 O; I1 u$ @ file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(7).png
不明白为什么,这个流程生成的代码有个时钟不能配置通过,需要将其注释掉,才能正常启动(求大神解释) /* if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); }% W" K8 s7 t. B) w. \ */ # v& O; s, r6 t- ~8 m3 T7 A 实验1:创建任务5 p* A0 O! m O& I 这里,我们采用图形化界面创建任务- Y2 A0 v7 e2 {% B+ l
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(8).png 手动输入任务参数:
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(9).png 生成代码(注意还要注释前面的那个时钟配置判断),添加必要的头文件
file:///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 首先配置串口参数
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(11).png4 [9 u' n1 W! W& z: n/ T 然后手动添加任务
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(12).png: ]+ k6 o9 g! s 同上一步一样,生成代码! D) B) O, K9 a3 }$ q+ \. K' i* A
添加printf支持代码1 ?$ k# t4 Q- u. Q, b/ p #include "stdio.h" e0 P& \$ S3 z: X; ^ #ifdef __GNUC__ #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) #endif /* __GNUC__ */ PUTCHAR_PROTOTYPE { 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; } 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
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(14).png 编译运行,可以观察到串口打印出信息" w- }& N' m7 h+ e 实验2:信号量的使用( E+ I9 Z+ [, z7 S6 e9 e8 N' ~6 T 同样使用图形化界面进行配置,如下图所示:- T: B, d* e, D: ?4 q
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(15).png: {$ t5 w" s& c 点击生成代码+ Z) L, m4 E3 @: r. ?& _; y
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(16).png 代码修改:4 V. w% Z, D4 ?' T7 Z
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(17).png* R' k1 R- X' g) n2 L8 ^ 编译运行,就可以发现灯每闪烁一次,串口就打印一次
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(18).png, k& k7 @$ m8 W: n! y 实验3:信号量的使用 如下图进行配置,点击OK,保存
file:///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
file:///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 ?
file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(21).png 最后运行程序,效果如下图所示,. j( x* R0 j8 n# z( G6 H& r# K+ A
上述内容只是关于freeRTOS的基本操作,但是能够满足一般工程的应用需求了。7 X7 h3 Y4 m7 O 正在做基于freeRTOS的通用机器人(如多旋翼)程序,待实现基本功能后再开贴发布 file:///C:/Users/TS/AppData/Local/Temp/enhtmlclip/Image(22).png/ H- `6 E- X. J4 n( |. E, d6 t 代码工程:(网络似乎又有问题了,后面再上传)
TEST.part01.rar
(9 MB, 下载次数: 51)
|
微信公众号
手机版
问问IAR和KEIL比较 有那个地方比较好吗
个人感觉,KEIL是手动挡汽车,IAR是自动挡汽车,对于驱动调试KEIL更好一点,对于算法之类的调试,IAR更快更方便。
IAR编译速度似乎比KEIL快很多,可以一定程度上节省编译所花费的时间
大神