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

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

[复制链接]
STMCU小助手 发布时间:2021-11-25 15:00
STM32CubeMX的设置变化' D" {1 ]8 p. E0 A
1.Pinout 中使能 FreeRTOS
/ g3 d( l0 v3 I; [
1 C, u) P0 j. j% u( ?2 ~
20181002144214324.jpg

* T  m- d. g( s3 h
( D6 l# G( h, f' v1 _! ~2.Configuration 中配置 FreeRTOS8 A2 p* t* P7 q# [6 Y& A7 T
20181002144753924.jpg
7 N: u8 ~# F# s2 k; w- \% U
( p9 H2 p9 @" y* G( z5 v. }3 ~
3.添加任务1 L4 @3 @- k0 |! O* U4 p

9 h( b' S" J9 ~4 }) E& `$ P
20181002145257576.jpg

+ f; A  k0 U+ t% i! s
$ ~8 v: L  O: s- Y1 j7 A9 A4.生成代码3 `: R7 i) @9 X( G

! j5 o5 G! ]2 G% K9 }: I

6 N# S, e& [; g7 ^- sKeil5 中编辑代码' U% N" U0 V6 t* d
main 函数
- C) S7 d9 ]9 t; k
  1. int main(void)
    0 |! z  ~( e( W
  2. {# K& m5 X1 |" N2 R. _, ]
  3.   /* USER CODE BEGIN 1 */- X3 w9 Y1 i6 ]- `! y
  4. " h& b# f5 C9 q% G" p+ I7 j
  5.   /* USER CODE END 1 */
    ; b. W- ^7 z; `$ ~6 c7 d
  6. 5 q! _# p# i5 ?5 D; r# Z
  7.   /* MCU Configuration----------------------------------------------------------*/4 {4 r* d) Z7 O$ ^3 C

  8. . J, U% V5 c0 Q
  9.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */) N9 w: s2 J& G
  10.   HAL_Init();      /* 硬件抽象层 */
    ! s7 e9 _( U) }, W' p
  11. 2 x) s* H, t6 M: @9 g
  12.   /* USER CODE BEGIN Init */
    3 f0 W: K! |! f5 U5 \5 }
  13. : U% A9 r# O* }* B. o( Z8 G1 \
  14.   /* USER CODE END Init */$ B, Z5 J1 T$ x) W/ U
  15. 7 x$ h* a) Q+ A8 Y; T1 `
  16.   /* Configure the system clock */
    4 }  J2 p: o/ {* {% C0 x
  17.   SystemClock_Config();         /* 时钟 */
    # f, e( w& v& Q# F5 J/ W+ ?

  18. + V! {. Z+ P1 `! q1 H1 D$ I& |, m
  19.   /* USER CODE BEGIN SysInit */, p7 s# J% u$ E$ w* k
  20. : I- h1 t, j; ]( {5 I, j5 h, H9 E# a
  21.   /* USER CODE END SysInit */5 F8 F. ~( c$ \8 L3 J
  22.    /* Initialize all configured peripherals */- E: D4 \1 z4 ~% a7 Y5 h7 I
  23.   MX_GPIO_Init();               /* STM32CubeMX生成的GPIO初始化函数 */- w( }0 ^7 Y9 W3 }
  24.   MX_USART1_UART_Init();        /*  STM32CubeMX生成的USART1初始化函数 */
    . D, s: w6 n4 t" r9 Z( P
  25.   MX_USART2_UART_Init();       /*  STM32CubeMX生成的USART2初始化函数 */
    5 S% ?& P- y5 D  o
  26.   /* USER CODE BEGIN 2 */
    + p& I' y9 q7 a4 L
  27.         printf("\n\r Creating Task1 \n\r"); /* 我添加的语句。在串口初始化结束后从串口输出的字符。*/6 o# i; t' A4 G: S. L
  28.   /* USER CODE END 2 */
    0 v/ k1 d; j5 ?  W
  29. : Q& ^6 i/ w) n1 S$ v: `
  30.   /* Call init function for freertos objects (in freertos.c) */
    9 a- T# p% U( t# ]
  31.   MX_FREERTOS_Init();         /* STM32CubeMX生成的操作系统内核初始化函数 */
    ( H5 R1 Y9 l) [3 y3 G
  32. 6 E$ t) I; K! N( g' o. Q6 w
  33.   /* Start scheduler */* t: i4 J# y4 Z2 _3 g& Y  J
  34.   osKernelStart();              /* 启动调度器 , 由调度器控制任务执行。下面的 while() 语句是走不到了*/
    8 t6 a# E" s1 z$ Y
  35. ( C' g1 J1 f  c( O% }
  36.   /* We should never get here as control is now taken by the scheduler */
    ' I/ `0 g, _0 M

  37. 8 q0 Q  |$ H1 ^& {" d% Y
  38.   /* Infinite loop */3 j/ g. H) }' P- E6 a! R
  39.   /* USER CODE BEGIN WHILE */
    " s5 f) a/ s1 M+ D7 X
  40.   while (1)8 @$ e% E/ W- U" p2 H
  41.   {6 e! h& ^3 C1 W  U: u/ Y

  42. ) V% C- C; ~4 ^+ F* |9 R3 z
  43.   /* USER CODE END WHILE */
    ) l6 @1 ~2 R- i7 b  b
  44. 3 L; M% `- }6 n- x
  45.   /* USER CODE BEGIN 3 */
      ~0 L8 A4 N+ q) K

  46. ! m2 n: N: v1 x0 q& O
  47.         }; L# B/ S# O) S1 K3 m
  48.   /* USER CODE END 3 */
    ( I" Y+ i2 E: M3 U$ v" W

  49. ! z5 h6 ?4 T- Z  A# {
  50. }
复制代码

0 `: f9 o; f# J3 y+ W& r8 Ifreertos.c
, ^5 ^9 I" n% D1 T) T; `4 e增加包含头文件
5 n. t+ _: O+ ^; h' `
  1. /* Private includes ----------------------------------------------------------*/
    : X6 j+ @* N1 F& u' C$ D; Z/ H- r
  2. /* USER CODE BEGIN Includes */     ( {3 V  c: p4 M& ?! x8 s0 X/ O
  3. #include "stm32f0xx_hal.h"     /* 我增加的,否则不认识 printf */
    2 @" B2 j7 Y% L
  4. 0 d. C  D7 m1 L* o3 b8 F
  5. /* USER CODE END Includes */
复制代码

! i: \% l7 ~: ]+ U8 }STM32CubeMX 定义的任务句柄
) {; B' Z! S( A7 h$ Z  [: R
  1. osThreadId defaultTaskHandle;        /* 缺省的空闲任务句柄 */, j- r6 a, X1 Y1 f; z
  2. osThreadId myTask1Handle;          /* 我需要的 myTask 1 任务句柄 */
复制代码
/ V! a! d: u. q( `# Y& n) y. U1 I
STM32CubeMX 声明的任务函数原型
' G: o' [& c9 T2 ]+ w1 v5 e
  1. void StartDefaultTask(void const * argument);  b' [) R4 n% q: z5 L! l4 J1 p
  2. void StartTask1(void const * argument);
复制代码
8 N) l6 w! Z- L: e' g: D- Y
STM32CubeMX 定义和创建的任务
+ A; H. b$ a( U8 L9 w+ ~2 Z& o
  1.   /* definition and creation of defaultTask */
    " T& H9 T2 n  v$ E) F; D4 A; k8 ?
  2.   osThreadDef(defaultTask, StartDefaultTask, osPriorityIdle, 0, 128);   
    0 P3 R. w2 v; H
  3.   defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);
    * P7 y8 O5 f) n' `

  4. / R. {" d$ L9 A- f" c
  5.   /* definition and creation of myTask1 */- x/ a( c5 P" g1 K
  6.   osThreadDef(myTask1, StartTask1, osPriorityNormal, 0, 128);
    . l9 H# l/ x* y; }* W5 Y
  7.   myTask1Handle = osThreadCreate(osThread(myTask1), NULL);
    ' j1 X0 |7 B7 U( Z' m3 t; V
复制代码
; C3 ~7 o6 @/ Z" \) c# r0 r+ ]
空闲任务啥也没干6 p1 f9 m3 o- ]" h2 W6 u# h
  1. void StartDefaultTask(void const * argument)7 K; {4 A- N7 L8 y% m3 c( l* o. p- o5 l
  2. {
    ( J, t+ y9 Y4 o& S7 [! B( ~

  3. . l# I0 Z1 g6 [/ _3 d) O+ L
  4.   /* USER CODE BEGIN StartDefaultTask */
    $ T8 G4 o% Z( M% T  N! T; G

  5. ! z2 Y2 C! h2 `) w4 d* E
  6.                 /* Infinite loop */
    ( G5 y1 B3 J" D4 y! _1 Q# S
  7.   for(;;)
    : ^- E/ J* v/ a- |6 h. z' W* g
  8.   {
    8 k& X$ v% z) K  A
  9.                 - R0 y' @/ J! O$ s  j! w2 I: \
  10.     osDelay(1);6 v* H) y# p0 W
  11.   }
    ; j1 k0 z& k' T8 b
  12.   /* USER CODE END StartDefaultTask */1 Q* `9 r" Z( R- _% D( O
  13. }
复制代码
5 z% I2 N6 W3 `- w
任务1输出字符串
  n! S0 f/ f  u) x
  1. void StartTask1(void const * argument); o- C, w; V7 d" V
  2. {9 k) c' `( n  y5 p0 T1 ^
  3.   /* USER CODE BEGIN StartTask1 */8 F$ J3 z. c( b+ ]2 v
  4.   /* Infinite loop */
    ! d4 S3 d% P( D) z7 R1 e
  5.   for(;;)
    - F3 m# N( J: u- c1 ?
  6.   {
    ; `3 x* B8 _! E% o$ O* 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>) */
    + u9 S" h! H. ~+ ^( W- {
  8.     osDelay(3000);   /* 延时3s */) k- Y8 z. r  V- U
  9.   }7 U/ m2 }1 f* Z, ?7 ?& A  h
  10.   /* USER CODE END StartTask1 */
    $ ]1 ~4 S+ a5 {4 D9 A/ b: x0 f
  11. }
复制代码

. U  b9 M( n0 H& f6 S编译链接 Project/Build Target% V! f$ D4 r4 [8 {% {7 G
. f# o2 }( v% e. T- w" ]5 I
20181002213920782.jpg

5 @% t2 |2 ?- T8 w1 n  a8 t7 y, c' h+ l# @1 w
烧录程序 Flash/Download. p( b" A! ^- B8 f/ \2 R7 t

" ^) j$ d9 b2 g$ T  v
2018100221442956.jpg

: l+ b7 P, o3 o- f" N. n5 p; C, j# ^, S* w1 p
运行效果8 I/ |: W: Z. m) Y: U
' j, q: r% \/ D! E! W% Y) ?6 U
20181002215125505.png

) r  }7 Q( J1 H: ?9 A; a- N5 _: H5 i$ a. s( {* F7 E5 }" E2 l% Z

, q* b% a  @$ d3 [# }# ^
赞 收藏 评论0 发布时间:2021-11-25 15:00

举报

0个回答

所属标签

相似技术帖

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