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

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

[复制链接]
STMCU小助手 发布时间:2021-11-25 15:00
STM32CubeMX的设置变化2 K5 A, {* {: a5 E8 \
1.Pinout 中使能 FreeRTOS- y+ k8 x1 V' R2 o3 @1 Z

. R# S8 H% L. w- \! U; k
20181002144214324.jpg
: V: h/ e/ N0 t& [
: \; _$ X; h7 z7 N
2.Configuration 中配置 FreeRTOS
! Q; v$ o4 e, [- t/ U5 I& I& D
20181002144753924.jpg
- F! A" H- K+ r  T: Q; r7 k

' F, [) G, r6 r: M5 ~) }! @8 ]3.添加任务
6 C; E& ]% o( `' |3 p; J# F+ J/ P/ X
20181002145257576.jpg
4 @0 \# @& S8 M
$ B$ n6 N1 e& H) v( B$ x
4.生成代码
9 S. ~9 a) x9 O6 c) p

9 l" i' v$ u- r, `
7 W( c0 C- {. _9 M5 \7 f
Keil5 中编辑代码+ o! V6 D: A: v3 d; n8 z5 d
main 函数3 o/ b4 L, L% `' k; i
  1. int main(void)
    9 F1 E2 X$ B7 A* M8 U4 @2 H  w
  2. {
    1 n5 K! g, i. S
  3.   /* USER CODE BEGIN 1 */
    " A- q7 t% Z# z9 n, Y

  4. 6 e' W- d- ^3 \) t
  5.   /* USER CODE END 1 */
    $ G- V9 q0 ^$ S+ }2 _; O, C
  6. ( C; O1 d" f/ h# q& o, C
  7.   /* MCU Configuration----------------------------------------------------------*/. \6 X/ q5 F0 m" P
  8. - c% B. S! X* D
  9.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */# d- w/ Y4 S/ U( |  A
  10.   HAL_Init();      /* 硬件抽象层 */- e% g7 x8 F) v
  11. 1 h# t( U0 N$ k( h
  12.   /* USER CODE BEGIN Init */
    / h( j3 z1 u. c4 c  a& V! [

  13. $ |% o0 f: o" [( \6 Z
  14.   /* USER CODE END Init */
    - o1 N* O! ~9 Z9 ]

  15. % b: s7 P( o5 x+ C
  16.   /* Configure the system clock */1 t% z7 f: ?6 |4 }0 D/ y4 n0 x
  17.   SystemClock_Config();         /* 时钟 */0 H1 {( I/ C" y5 P. m# p% S

  18. " M2 _4 p# T( ~
  19.   /* USER CODE BEGIN SysInit */
    4 f* p. @! l+ i# A
  20. - d4 C  W2 U* M
  21.   /* USER CODE END SysInit */( d2 d% \- ?! `
  22.    /* Initialize all configured peripherals */9 z) Q8 n. m, n9 I
  23.   MX_GPIO_Init();               /* STM32CubeMX生成的GPIO初始化函数 */: C: R4 e; b  \: r# F- a7 K( o4 k
  24.   MX_USART1_UART_Init();        /*  STM32CubeMX生成的USART1初始化函数 */0 O1 u0 i$ P; Y( i+ D4 i
  25.   MX_USART2_UART_Init();       /*  STM32CubeMX生成的USART2初始化函数 */8 b! a" k" d" }
  26.   /* USER CODE BEGIN 2 */
    ' g+ b0 f) g5 z  P5 H( q/ A# A
  27.         printf("\n\r Creating Task1 \n\r"); /* 我添加的语句。在串口初始化结束后从串口输出的字符。*/3 I0 G" j* ]2 f5 C  N( I1 q9 y+ p
  28.   /* USER CODE END 2 */
    & d6 \- |# }/ T* m

  29. " y+ f5 H$ D: `3 ^
  30.   /* Call init function for freertos objects (in freertos.c) */
    5 \7 ]8 s% k4 s8 W) D; r
  31.   MX_FREERTOS_Init();         /* STM32CubeMX生成的操作系统内核初始化函数 */7 X6 S0 _7 T" W- s3 R/ g1 J
  32. / d. v8 _" G) O0 q" N
  33.   /* Start scheduler */" `* ^1 K2 l7 X: X, I+ {
  34.   osKernelStart();              /* 启动调度器 , 由调度器控制任务执行。下面的 while() 语句是走不到了*/
    1 y% V# W& ?/ [1 w% b! V  I0 f
  35. 3 T6 u  A" M$ K8 K% m+ Q' Q
  36.   /* We should never get here as control is now taken by the scheduler */  W  O7 Y1 k8 ~" l5 m8 k

  37. 0 R8 G" W' v7 P- h; F6 [9 E8 \
  38.   /* Infinite loop */
    7 b& l+ ]; V) z9 O' u, t5 n! {
  39.   /* USER CODE BEGIN WHILE */
    1 I3 u) v! Z" \  l- S4 r
  40.   while (1)- t( `" [. u, a1 h* C# N
  41.   {4 s( \) t& y9 G

  42. 5 B4 m8 @4 h. I8 P( c* ?# k
  43.   /* USER CODE END WHILE */
    1 \! p/ Y! ?2 M, S  i  x0 P
  44. 9 ]% ~! f' V1 p
  45.   /* USER CODE BEGIN 3 *// j' m; H" N' z6 B+ K
  46. $ s! E6 C+ I4 q6 M2 p# u
  47.         }) L5 @* B# P) o' x5 d) I6 `
  48.   /* USER CODE END 3 */
    2 A8 V: ]' D: w$ v' T
  49. 3 }8 Z0 y9 n7 ^! s0 V
  50. }
复制代码

8 O5 I( v6 g; B6 Wfreertos.c2 L. f* R: b' t9 _" M
增加包含头文件% f" O& I" Y! c- q. V$ o
  1. /* Private includes ----------------------------------------------------------*/
    9 N7 J" j( r2 ~
  2. /* USER CODE BEGIN Includes */     
    ) @6 s& t0 l: i: v% ~+ t
  3. #include "stm32f0xx_hal.h"     /* 我增加的,否则不认识 printf */2 s; q. l; ~/ Y4 b% J& H

  4. - o1 k) M" n" A0 g6 ^6 u
  5. /* USER CODE END Includes */
复制代码

' \, M0 [7 c: d3 L* \$ t  tSTM32CubeMX 定义的任务句柄
+ b% |  _# E" _3 Q3 w6 a8 _+ |
  1. osThreadId defaultTaskHandle;        /* 缺省的空闲任务句柄 */% V8 \$ B9 V; r4 e) g6 ^8 Z
  2. osThreadId myTask1Handle;          /* 我需要的 myTask 1 任务句柄 */
复制代码

; f) S9 w) B  c# ~STM32CubeMX 声明的任务函数原型% p0 Q& {" D$ R5 O" F7 `: s" i
  1. void StartDefaultTask(void const * argument);
    ! b! v  q7 h$ e3 E3 |5 n* n0 F+ O: t, p
  2. void StartTask1(void const * argument);
复制代码

  t* v# j2 ]0 ~& y* F1 v, A& ESTM32CubeMX 定义和创建的任务
/ C5 h. @. N! Y. Q8 D8 `& d$ q9 k/ m
  1.   /* definition and creation of defaultTask */3 Q: R' w) I- n8 m) E
  2.   osThreadDef(defaultTask, StartDefaultTask, osPriorityIdle, 0, 128);   
    2 y& g: J9 u' B% u
  3.   defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);
    + T  w8 J/ e* }( ]
  4. 7 X# @& W1 m9 ~% e) @# j* C- m& _/ N
  5.   /* definition and creation of myTask1 */
    $ B8 N% T; z, [9 R$ w; {) ]9 L
  6.   osThreadDef(myTask1, StartTask1, osPriorityNormal, 0, 128);
    / P8 v8 e. o+ x3 S
  7.   myTask1Handle = osThreadCreate(osThread(myTask1), NULL);' k2 ^# a7 P3 P$ D# y2 P3 [- q
复制代码
8 t) W. f/ @. Q3 s
空闲任务啥也没干4 B. S/ k) {' ?' x6 z+ j0 N
  1. void StartDefaultTask(void const * argument)" _+ {. f4 z/ I$ O2 X4 f: K. I, u! L8 Z) v4 S
  2. {
    8 E% u; Z2 ^9 Y/ G

  3. ) o- r+ T6 u2 }1 p7 I
  4.   /* USER CODE BEGIN StartDefaultTask */, y& e1 g1 R7 u5 Z  E  m

  5. & R5 M- [" p' l3 D
  6.                 /* Infinite loop */
    # H; }! I! V; X
  7.   for(;;)
    8 ?  b" J: Q+ ]9 A  `
  8.   {6 d4 A) T' g4 s8 t# h
  9.                
    / D* }- O- x/ T7 R, X
  10.     osDelay(1);
      ]& o. {0 j, k6 c3 ]) \1 }
  11.   }
    $ b! W( o" O6 n- s* q( m) H" R
  12.   /* USER CODE END StartDefaultTask */
    : o' F/ K1 J% ?
  13. }
复制代码

5 w( b$ c' l. h! n0 S$ k任务1输出字符串
8 G. s* w6 p( N' o
  1. void StartTask1(void const * argument)3 ~$ W! _& `* F4 |* E( O
  2. {
      f6 {; X, u: P1 |9 N
  3.   /* USER CODE BEGIN StartTask1 */
    ' g2 W1 |% S7 g7 g1 }9 f/ O$ A. C
  4.   /* Infinite loop */
    $ c1 d) f  ^- }% E0 h- L- A
  5.   for(;;)' g7 ~, C, A3 o3 y4 D' S7 l
  6.   {
    $ _) r9 q. N: T
  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>) */# ^/ o" a+ R; J$ N) [! n( E: l" g9 ^  \
  8.     osDelay(3000);   /* 延时3s */
    ' J4 X6 s0 D  \
  9.   }
    ; r. V7 k- }# l% U
  10.   /* USER CODE END StartTask1 */( q/ P1 q0 K" M  f# X1 X
  11. }
复制代码
; ?' c8 C: l- Q% e/ Y$ I
编译链接 Project/Build Target
7 T. v8 ?) h# \; G  p) {5 L
2 j1 d/ E6 s) v3 e, m6 e5 m( F
20181002213920782.jpg
) R' e0 F* K: R; r1 r# ~

' ~4 }/ }( i) g' _3 O+ e+ l烧录程序 Flash/Download+ E( [3 r( z  U0 ^% b3 ]2 t

0 t& o8 p/ `8 C2 A1 n* }
2018100221442956.jpg

6 n! K4 ?, z: S2 `; {: {! R' m2 p: J0 ~5 H- |
运行效果+ A1 C) y7 G9 G5 ^+ |+ N

$ G0 N6 Y. j- _8 Y. w: c
20181002215125505.png
/ f& p! @5 Z/ g/ z, `& r$ ?6 r8 x9 q

# i. r/ x' x, H2 J3 p+ C+ m/ A* O, w
收藏 评论0 发布时间:2021-11-25 15:00

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版