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

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

[复制链接]
STMCU小助手 发布时间:2021-11-25 15:00
STM32CubeMX的设置变化
+ K+ L7 ?" r5 J4 `& J' Y1.Pinout 中使能 FreeRTOS
5 ~4 J8 p8 ?5 g0 B5 R: u3 A. L- I3 o. R6 t
20181002144214324.jpg

: d& h( d" T( y: |2 s9 p: j9 r. i% I' t. p
2.Configuration 中配置 FreeRTOS3 O+ p  T  L9 O/ e  y: N' [% b* O6 l
20181002144753924.jpg

/ {, e/ w) b. V1 ^# w: @6 N
+ {. v; W" g. F3.添加任务& J/ w8 F, H( h. g4 Y$ w+ @' K0 T

9 F' j2 N; Z' |- t0 m  r1 d  |$ w; q
20181002145257576.jpg

8 F8 G, Z2 q* f8 @; L1 m
6 {" M/ c# x( Q8 c: t' Q4.生成代码
0 X* a/ C! ^; Z- w# H% a

9 N* a1 b! W; l! S2 d* h4 ^& _

5 i+ C: a* C/ m0 B, KKeil5 中编辑代码
  `: O6 _5 u+ o) Jmain 函数
6 Z& y& }' V& q- g; B5 t- d1 @% \
  1. int main(void)' y3 ?! j2 \- S6 J4 b2 g
  2. {
    6 e" w; ~$ W0 _5 H
  3.   /* USER CODE BEGIN 1 */) f% @$ G. S  ?: K) D( L8 h5 s

  4. " s+ B* y* q, f9 P
  5.   /* USER CODE END 1 */
    6 ~5 P% i# a+ S$ q- W

  6. ; a2 ^7 Z4 j0 S9 V& o- {
  7.   /* MCU Configuration----------------------------------------------------------*/
    ; x6 X- c5 y8 \6 m1 z

  8. , i# [0 v7 a9 p' v! n
  9.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */8 l! y7 I1 T% }! T
  10.   HAL_Init();      /* 硬件抽象层 */' c; R7 S( t+ E/ z: y% B7 T* T7 w

  11. $ q/ T( F; d1 [9 Q
  12.   /* USER CODE BEGIN Init */0 s# p) ]# D2 \0 _0 F. w

  13. * c. u3 I% y' o# y) Z0 o
  14.   /* USER CODE END Init */
    ! }* W  k7 J& n( b& h$ Z
  15. ! n" P# v; ^: e1 o, D3 w( R% Y# a0 H
  16.   /* Configure the system clock */
    ( B/ n  i' c1 }: _" u
  17.   SystemClock_Config();         /* 时钟 *// k: m* _# t% f2 v( f

  18. 3 p  Q4 m. t. C! s& R$ \1 s; z' j
  19.   /* USER CODE BEGIN SysInit */3 S! o$ @' L; _- J+ c+ F
  20. 1 E, Q2 ~6 k7 d6 P2 j4 {, z
  21.   /* USER CODE END SysInit */
    4 D+ ?8 ~! g; I) C: x8 u2 V
  22.    /* Initialize all configured peripherals */
    * C+ [" E! @+ ~& V' Z) G
  23.   MX_GPIO_Init();               /* STM32CubeMX生成的GPIO初始化函数 */
    " g7 u  \, b4 c, D" g
  24.   MX_USART1_UART_Init();        /*  STM32CubeMX生成的USART1初始化函数 */! v9 K0 h! j8 Y# z# F2 b8 f
  25.   MX_USART2_UART_Init();       /*  STM32CubeMX生成的USART2初始化函数 */
    ; Q2 i5 v! S9 T  u8 L! Z
  26.   /* USER CODE BEGIN 2 */
    ! l5 @. m0 S) W  ]) L% c* A' K+ J
  27.         printf("\n\r Creating Task1 \n\r"); /* 我添加的语句。在串口初始化结束后从串口输出的字符。*/
    2 |  o& s- h3 N2 z5 |! f% v$ l
  28.   /* USER CODE END 2 */+ v$ q- @4 j- I4 B& u6 a$ u
  29. * k* U4 k4 C7 h* `
  30.   /* Call init function for freertos objects (in freertos.c) */
    " V5 U8 ~0 \! g& m# N/ [
  31.   MX_FREERTOS_Init();         /* STM32CubeMX生成的操作系统内核初始化函数 */
    + P$ Q3 m2 ?$ D' B0 e) Z3 p8 `
  32. 3 _7 }: l( z4 p9 L% u
  33.   /* Start scheduler */
    8 B4 G0 `5 i, r! z/ y, b
  34.   osKernelStart();              /* 启动调度器 , 由调度器控制任务执行。下面的 while() 语句是走不到了*/
    0 T- g0 X' O3 A% K& b- ?0 P

  35. 5 }; f) B6 c( {
  36.   /* We should never get here as control is now taken by the scheduler */
    3 ~, s& {2 V) `7 k

  37.   O( d0 x& `/ P0 n! r" G
  38.   /* Infinite loop */1 X" P$ `( ], r
  39.   /* USER CODE BEGIN WHILE */, Z' A$ a) \0 H' Z) q# c
  40.   while (1)$ l) e& B. N* u. o9 s$ l9 |) H; {# T
  41.   {. k0 G$ S0 O" U3 {2 {. s

  42. ( _" S9 A$ b: ]3 T0 H
  43.   /* USER CODE END WHILE */$ `9 |" T6 c! Y" h( \+ {: q7 l, c

  44. 4 e& ?5 K% J# l, ]5 S" o
  45.   /* USER CODE BEGIN 3 */
    7 B0 K/ n- G0 B% S( ]3 p7 l

  46. 4 O5 M, Z  m1 V' B0 W
  47.         }$ ]) ]/ S) K# Q5 i. O
  48.   /* USER CODE END 3 */& J! {9 E! b4 V2 `
  49. / Z7 n) u$ J! [
  50. }
复制代码

6 d7 \2 Z1 }6 \6 r2 x4 Afreertos.c
5 a! x( M8 _- M7 H增加包含头文件
0 C! f0 ~% T$ o$ E9 H
  1. /* Private includes ----------------------------------------------------------*/; J/ \3 P( S/ e/ D* r% w' n) h4 n
  2. /* USER CODE BEGIN Includes */     / F. W; ]3 x. x% D, m; }% _6 C
  3. #include "stm32f0xx_hal.h"     /* 我增加的,否则不认识 printf */
    0 e  @5 g1 d7 |8 d' I7 d% b
  4. 1 k7 V! C6 b$ v; B
  5. /* USER CODE END Includes */
复制代码
8 y% @- e4 t' [1 E
STM32CubeMX 定义的任务句柄$ _/ I2 O5 }1 R' r) S0 Z1 g8 ]4 @4 {
  1. osThreadId defaultTaskHandle;        /* 缺省的空闲任务句柄 */
    5 [( q  n# L4 b) H- w/ X
  2. osThreadId myTask1Handle;          /* 我需要的 myTask 1 任务句柄 */
复制代码
; x7 R# e# u+ j9 l1 W
STM32CubeMX 声明的任务函数原型. u1 ^) h. [9 C0 A! V  R$ Q7 m7 K
  1. void StartDefaultTask(void const * argument);4 L$ _" t3 C1 f1 y0 g, ?# i; T( R
  2. void StartTask1(void const * argument);
复制代码
% n- Y5 E! o4 P( T. x
STM32CubeMX 定义和创建的任务8 R# {+ C2 |+ M# K( q8 x: K- R) d# m
  1.   /* definition and creation of defaultTask */
    & k1 R) f3 ^/ p1 I9 S/ m" Y
  2.   osThreadDef(defaultTask, StartDefaultTask, osPriorityIdle, 0, 128);   1 y$ Z5 [( [, l* c$ Q7 X( D/ R' q
  3.   defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);
    1 l' h! J% k9 S
  4. 6 B9 k  u3 S6 ^# B# C
  5.   /* definition and creation of myTask1 */& T4 N- B; H/ [
  6.   osThreadDef(myTask1, StartTask1, osPriorityNormal, 0, 128);( `0 N0 u; \9 j& w' D0 s" H
  7.   myTask1Handle = osThreadCreate(osThread(myTask1), NULL);
    / }' K9 h$ X, T
复制代码

  k( ~; [6 _2 ^' T- ?空闲任务啥也没干7 K- G* m2 K! d% u/ L: V& ~/ V
  1. void StartDefaultTask(void const * argument)$ ~$ {. g9 o' \
  2. {) {% d8 b7 g5 `5 ?2 v

  3. : T) ^9 k5 T' Z2 p+ t6 C6 V
  4.   /* USER CODE BEGIN StartDefaultTask */  P+ o! Z0 u' w1 X' U

  5. 2 ^: G7 R# e. \, x. z
  6.                 /* Infinite loop */# o& ]0 q: a6 C, u  v: ~6 Y7 G
  7.   for(;;)( W* E; M2 z% s
  8.   {
    ) b( E; D+ Y, ]. G2 U
  9.                 / V- G+ r+ e/ k  y) ~
  10.     osDelay(1);
    4 [- {1 {- a/ d7 @6 ^. M( L
  11.   }/ V# h& d; A" L+ V( B
  12.   /* USER CODE END StartDefaultTask */+ a  |; \9 ~3 Z! a" h% k6 V- \! Z1 o
  13. }
复制代码
0 v$ O: r  V- z' m
任务1输出字符串3 {4 B: S2 a) Y/ c. L
  1. void StartTask1(void const * argument)' P$ V& F8 k" ^1 e- Y
  2. {
    9 g6 t; u& }+ l
  3.   /* USER CODE BEGIN StartTask1 */
    1 M- a4 |& B$ s# c" `
  4.   /* Infinite loop */
    " }4 t. v" C; m4 g
  5.   for(;;)
    8 T3 a: z& _: C- R
  6.   {
    / r( [3 h, C2 O
  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>) */! i& e2 S5 b& R6 b
  8.     osDelay(3000);   /* 延时3s */
    & d6 b% S# S3 `1 O/ l
  9.   }% w* Z$ d. _# z0 m
  10.   /* USER CODE END StartTask1 */
    , z3 s& t5 K  ~/ W) w
  11. }
复制代码

/ R8 G, I5 ^. Q  N6 U7 x8 t5 j编译链接 Project/Build Target# @7 r$ b, M6 x% J) k: H$ L# F* E
1 A* S7 X0 a: h
20181002213920782.jpg
$ `* r" m$ h2 S* S5 p, b8 T

+ g6 e: t6 r& ~' w烧录程序 Flash/Download0 }5 w( S6 M3 Y8 A6 K# K
4 H8 h" H/ u. M) r
2018100221442956.jpg

) j3 b6 V6 Y6 F& E4 J+ Y2 _2 X3 b6 y9 y
运行效果
/ l( Y  F+ A' }% K, ]0 o5 q+ y% X/ g2 E  K0 B
20181002215125505.png
  r0 ^& b; V: q4 b6 I* j

5 n9 {  g: j2 m" X4 @+ F9 F, ~. p! T9 s3 M3 D$ B
收藏 评论0 发布时间:2021-11-25 15:00

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版