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

【经验分享】用STM32Cube+FreeRTOS+Keil5对STM32F0编程之通过USART发送数据

[复制链接]
STMCU小助手 发布时间:2021-11-25 15:00
STM32CubeMX的设置变化! G" @0 ^2 T$ H' s4 \
1.Pinout 中使能 FreeRTOS
2 \6 w6 f- V* ]) z: o1 }5 @& i7 h* l+ N4 a3 k
20181002144214324.jpg
) y8 b! Y8 W. r9 Z

% Q2 S  \$ x# e# |, k8 C. }2.Configuration 中配置 FreeRTOS
- x9 m2 g1 p6 G! W4 W! J
20181002144753924.jpg
1 A! y% m5 G5 D

6 w. @6 H# W/ v% H3.添加任务0 v% \. }4 ~  ^& [
1 B  [( u' T0 C1 w+ R% W( T! {' u% y8 C
20181002145257576.jpg
+ J+ x5 S$ H$ z

( w+ \  I0 t4 X6 L4 R. J, I: i4.生成代码* C: s5 e3 P+ u- w# Z% e

# G4 A! ]3 P/ Y. e, N8 j

4 s7 X7 e) g8 \( i, e$ IKeil5 中编辑代码
. \+ m7 k# K% X+ f5 U. i& dmain 函数2 }6 |  `/ k0 D$ q; [" ]
  1. int main(void)# A( m7 S, f9 `) n" ]$ I) ^$ p
  2. {
    6 E/ i. ^! k% L: A+ f7 G. d
  3.   /* USER CODE BEGIN 1 */
    / d8 |. C* ^5 i! `8 H
  4. 8 ]9 K2 a$ {- o8 X* Q% N* K
  5.   /* USER CODE END 1 */  u6 S: ^( W0 M' Y
  6. 8 X4 y3 A7 G. ~7 Y- k' I) C. t
  7.   /* MCU Configuration----------------------------------------------------------*// J% f* [( l" p. o* n- S" ~

  8. # |% k( Z9 M/ O* v& I5 A: Z* m
  9.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    6 m8 q/ B- p7 O! G) L* {6 r
  10.   HAL_Init();      /* 硬件抽象层 */+ C' j2 T5 L3 ]9 s7 z- @

  11. 1 b7 A; ?! q# v6 H9 ~2 Z
  12.   /* USER CODE BEGIN Init */
    ) d1 W0 ~# q! }# w5 s
  13. 3 r; {6 e) x% [; M
  14.   /* USER CODE END Init */
    5 [- \: F7 X+ v' R4 L* W6 Z4 Z- b8 p
  15. 8 I/ ?1 T4 j( X$ J/ u1 S
  16.   /* Configure the system clock */
    - q0 d( p; x% \* a
  17.   SystemClock_Config();         /* 时钟 */
    9 d5 `9 q9 W4 |; N6 S) Q

  18. # |6 a( U4 j% A
  19.   /* USER CODE BEGIN SysInit */
    ( V5 M# P2 C5 o! o8 g, @' ?

  20. 0 H" T7 _; u/ o1 n% y* ?1 x% m: K
  21.   /* USER CODE END SysInit */4 l7 P, D9 n9 v$ g8 g2 G3 ^% y
  22.    /* Initialize all configured peripherals */
    7 Z- }# d2 X' r) h& H+ i
  23.   MX_GPIO_Init();               /* STM32CubeMX生成的GPIO初始化函数 */$ u  X* V5 R0 P3 B
  24.   MX_USART1_UART_Init();        /*  STM32CubeMX生成的USART1初始化函数 */
    ; E- v7 _. E3 q" ?# k! F
  25.   MX_USART2_UART_Init();       /*  STM32CubeMX生成的USART2初始化函数 */$ @( l. ?) G( K# p* I3 |$ Z
  26.   /* USER CODE BEGIN 2 */
    ; j9 m0 Z3 t) t8 k: H& |  Q
  27.         printf("\n\r Creating Task1 \n\r"); /* 我添加的语句。在串口初始化结束后从串口输出的字符。*/
    0 I" e" C* N/ b6 q
  28.   /* USER CODE END 2 */
    ) G; G6 ~8 c. ?5 k) {& V

  29. ' v  \3 I: Q3 Y6 @4 x3 n
  30.   /* Call init function for freertos objects (in freertos.c) *// @* ]( I) `* Y+ I' l- M; \3 ~
  31.   MX_FREERTOS_Init();         /* STM32CubeMX生成的操作系统内核初始化函数 */
    , L2 I. `! V% g1 q( t

  32. 6 \" _. w) M4 U0 R- k: K, ]
  33.   /* Start scheduler */4 S7 R2 w- O$ W& x  g
  34.   osKernelStart();              /* 启动调度器 , 由调度器控制任务执行。下面的 while() 语句是走不到了*/
    1 a& E! w: C' B8 G
  35. % d( p7 Z4 `# s9 f8 ?3 }2 M
  36.   /* We should never get here as control is now taken by the scheduler */
    & y& _( G+ T5 t2 ?
  37. * g$ m, \4 L+ b/ p/ Q/ t5 U( `+ X
  38.   /* Infinite loop */
    % o* M% b. O: }) W
  39.   /* USER CODE BEGIN WHILE */! r6 m9 s' N, _1 u* d7 I
  40.   while (1)
    ) g9 j; @# a% G! P% ~% n
  41.   {# H3 r, m* N# o. T1 h. y

  42. ' b. s, q! H2 Q+ z* D
  43.   /* USER CODE END WHILE */
    4 W1 b6 K3 u1 V$ ]7 }" k
  44. * n. Q& q  f7 P
  45.   /* USER CODE BEGIN 3 */) {! \' K: O/ o0 u8 W# ^
  46. . D  L. b6 J+ f4 T
  47.         }
    - I. o+ J) J% |( R2 H
  48.   /* USER CODE END 3 */
    9 ~( [5 J9 M0 ?2 u, @& h

  49. 1 C3 i9 `1 t- h) J# a
  50. }
复制代码
: ~/ a& i, ~5 t6 w: Q# @2 e* I
freertos.c
3 H9 N5 M! s( t% e* \5 ?增加包含头文件
/ F4 H  u2 ^0 @/ r' |9 k
  1. /* Private includes ----------------------------------------------------------*/4 m$ Q4 }( p& _
  2. /* USER CODE BEGIN Includes */     
    & ~" q4 ^" k& M( }' ?  q
  3. #include "stm32f0xx_hal.h"     /* 我增加的,否则不认识 printf */
    $ k5 |8 ~+ f% [; n1 c/ \
  4. ) ?2 Y: V; Y. u
  5. /* USER CODE END Includes */
复制代码
- x2 E! M/ H6 x3 v% k1 h# f
STM32CubeMX 定义的任务句柄
3 F5 g* t6 S2 R. Q. {! A* @
  1. osThreadId defaultTaskHandle;        /* 缺省的空闲任务句柄 */6 p8 g) Z6 {! Y
  2. osThreadId myTask1Handle;          /* 我需要的 myTask 1 任务句柄 */
复制代码
0 o4 e+ i4 ~( J% Q
STM32CubeMX 声明的任务函数原型) N$ _' w+ _/ q/ l# Y( S
  1. void StartDefaultTask(void const * argument);' k) r# ~& Y1 k( V
  2. void StartTask1(void const * argument);
复制代码

* A/ l& }3 h! m, t1 E) QSTM32CubeMX 定义和创建的任务$ Y, u( Y4 Z" K& H$ j
  1.   /* definition and creation of defaultTask */: I- |( z) v4 `
  2.   osThreadDef(defaultTask, StartDefaultTask, osPriorityIdle, 0, 128);   7 L8 Z: y! V9 s8 N2 X$ D
  3.   defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);8 w: q) u) {. R7 I

  4. + }# |, b7 ]0 p/ s( Z
  5.   /* definition and creation of myTask1 */5 z: f# H  w5 o1 w2 O! C+ u
  6.   osThreadDef(myTask1, StartTask1, osPriorityNormal, 0, 128);8 `( z- A1 U+ L: l# F5 K
  7.   myTask1Handle = osThreadCreate(osThread(myTask1), NULL);. D  o5 I& z  O) L! F
复制代码
  s# S& C/ k" B; N2 ?7 Q
空闲任务啥也没干
& H4 q, H' r0 T9 g2 L
  1. void StartDefaultTask(void const * argument)4 m* p# b; O, y0 b/ R
  2. {9 l. _% r* w; `" \

  3. : H+ S! m0 }: t- n, g
  4.   /* USER CODE BEGIN StartDefaultTask */
    3 @' Q& b2 Q9 ]6 B9 z

  5. ! c) b5 _9 }& L+ }, X$ z
  6.                 /* Infinite loop */8 \) h" O! e2 b. A' `# U
  7.   for(;;)3 Y3 x  A- J. e  r. K9 I
  8.   {. q( Y" L' x; R- w5 B, W  z
  9.                
    4 z% s$ b( h! J
  10.     osDelay(1);
    : ]0 q$ @  f( G( L; \& M
  11.   }
      a4 L% B6 C7 Y7 g
  12.   /* USER CODE END StartDefaultTask */
    ' y2 H* P, k# O* c2 p8 D- Z
  13. }
复制代码

5 Q0 V4 F! a( g% p8 F任务1输出字符串7 h) G8 P( I* _+ N- d) w
  1. void StartTask1(void const * argument)
    8 f' g% s) M  K1 |( l- ]- ~
  2. {
    + v8 t, t8 r; z6 D5 S2 ^
  3.   /* USER CODE BEGIN StartTask1 */
    - a- x& h  L: Q. G  Z/ i* U
  4.   /* Infinite loop */
    . x5 G' N- y( ?9 K! E" b$ B
  5.   for(;;)
    5 a7 n1 B0 X& S5 g! H
  6.   {8 r# d1 N, d; y4 _+ L7 A$ P
  7.         printf("Task 1 is runing \r\n");       /* 已经重定向printf到USART2,参见《用STM32Cube+Keil5对STM32F0编程之通过USART发送数据》](<a href="https://blog.csdn.net/aLife2P6/article/details/82918298" target="_blank">https://blog.csdn.net/aLife2P6/article/details/82918298</a>) */' a6 g( }+ Q; q/ }9 X& L
  8.     osDelay(3000);   /* 延时3s */
    3 o6 Z" G6 j* w  ?
  9.   }
    9 c" m8 i6 F4 ^" F, P7 p5 |
  10.   /* USER CODE END StartTask1 */) Y$ m" T$ f  q7 x. x
  11. }
复制代码
6 F- d& c9 h" B- ^
编译链接 Project/Build Target
" U! r/ V/ N8 U" L4 U# o% ^, A& |+ z& L6 G# f8 A
20181002213920782.jpg

4 W# g2 t$ K* `$ o+ M. M/ q
- J" n/ M; U% N6 {+ l4 o烧录程序 Flash/Download. G. F* n; H' L* u7 c$ e+ L

6 i! Y* O; k4 j, }* @
2018100221442956.jpg
; t9 |4 M( _, W: w
8 N1 E5 j3 D& b- `) r9 B2 v: d
运行效果! Z) K* L  v/ h. Q# {7 Q+ h6 ?* x
7 g0 X- \4 `) z. {* o
20181002215125505.png
$ ~# l' F& I/ p5 A( m9 _1 x4 O
. C7 i' Z' H9 Z0 `# n; Z9 ~
3 u3 Q3 X; [5 r) N0 l
赞 收藏 评论0 发布时间:2021-11-25 15:00

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版