本代码 基于楼主上一贴发表 帖子构建的工程:https://www.stmcu.org.cn/module/forum/thread-598980-1-1.html4 E$ |; S+ ?1 F3 [
% N0 f. ?+ g+ r! d7 g# S& ]1 t* W[url=CUBEMX 简单创建 FREERTOS 和RTX 工程,顺便讨论一处代码 https://www.stmcu.org.cn/module/foru ... 980&fromuid=1888292 (出处: 意法半导体STM32/STM8技术社区)]CUBEMX 简单创建 FREERTOS 和RTX 工程,顺便讨论一处代码 https://www.stmcu.org.cn/module/foru ... 980&fromuid=1888292 (出处: 意法半导体STM32/STM8技术社区)[/url]2 D) a4 q C1 o7 [8 l% y( q8 k. O
, N3 U f" k1 ?; e
添加了一个 os_usart.c的 文件
- x3 z7 b! L& |; b8 P: T内容! k8 x. T: L) W! r) M" G
! F/ Z4 X# |; W3 i2 k如下
2 k( p L* u/ T3 M- 1 c2 o& r( Z1 P; V8 ~
- #include "stm32f0xx_hal.h"8 `- {& D) E' v3 A$ |3 c& I
- #include "cmsis_os.h"
/ f- m7 ^! N' A, z7 q2 q - #include "stdio.h"1 u( C6 ]2 a0 ~/ w* ]
2 _+ @5 v9 t0 ~( K [- extern UART_HandleTypeDef huart2;
! r2 `0 i7 D, t$ t; N0 I5 y- v - osSemaphoreId usart_sem;
3 w' r* F! M) `/ X. K- R - #define Buffersize 10
; c5 I! H3 Y" o2 e7 O" H# m0 ? - struct usart_buf_t, i8 Y4 u- m+ ?- H- x L/ r# M2 D
- {8 ?, R4 m; z/ @" {$ ^! A
- char buffer[Buffersize];
- p. n- x2 t; [* C# f% T. ?1 n - int rx_index;0 y5 v8 k& k7 n2 r
- int save_index;3 ^3 i8 P8 T' [; Z7 Z3 M1 e- g8 r
- 5 Y' Z3 z/ k$ Q% C
- }usart_buf;
1 V1 ?, l- o/ ]+ \" p. `( F - void os_usart_init()
' d! ]- ?8 e: Q. ^ - {
% p% Z+ q; t7 g9 h" B - usart_sem =osSemaphoreCreate(0,1);4 f& P8 v" h6 G1 L+ x
- usart_buf.rx_index=0;6 ]! }% F3 j- [5 W- ]
- usart_buf.save_index=0;. j0 k3 x; `& ^# r/ R! [9 @3 z7 C
- osSemaphoreWait(usart_sem,osWaitForever);
, K/ k6 i" ]) h3 R# e -
+ E1 G; `' X; v - HAL_NVIC_SetPriority(USART2_IRQn, 0, 1);
! i: x" {( u0 x5 E5 ?6 i - HAL_NVIC_EnableIRQ(USART2_IRQn);+ y/ p3 y. }; f# ~
- __HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);
& S/ z% m; n0 G0 Y& d9 W& | - }
$ V6 H K/ B- g6 s
1 S) ~! @- b5 g' B/ |, o- void USART2_IRQHandler()
7 K; \- x: h1 F; M4 k' u - {
6 W- R7 L# |- t8 h4 o: x! M1 @0 ] - if((__HAL_UART_GET_IT(&huart2, UART_IT_RXNE) != RESET) && (__HAL_UART_GET_IT_SOURCE(&huart2, UART_IT_RXNE) != RESET))7 s6 w" y3 y" p. @
- {
' Y" s) @% l- w/ [; G3 ] - $ P* I1 X; q& F$ ?% w( l4 l
- usart_buf.buffer[usart_buf.rx_index++]=huart2.Instance->RDR;2 G- h& [5 }7 e9 d
- if(usart_buf.rx_index==Buffersize)usart_buf.rx_index=0;* c& a% ^* c* K) u+ t( _( |8 y* K
- if(usart_buf.rx_index==usart_buf.save_index)- U* a, B _7 j: @$ j
- {
$ @5 K! w/ g6 N8 c u - usart_buf.save_index++;' m* ?# B! ?3 j# F
- if(usart_buf.save_index==Buffersize)usart_buf.save_index=0;6 f& Q$ C X2 k+ Y6 H' b$ A4 z
- }
" z/ u) ?# g* r - osSemaphoreRelease(usart_sem);
. k3 R& Z5 d' C, O9 r - /* Clear RXNE interrupt flag */
1 R8 k2 L$ [/ |+ ? - __HAL_UART_SEND_REQ(&huart2, UART_RXDATA_FLUSH_REQUEST);6 L/ Y. F. b% C6 D0 m! k& b
- }
3 j& M' ?% _5 e- M% W& r$ Q - }7 T' h$ Q4 t6 H+ Q
- static unsigned int usart_timeout=osWaitForever;
. [$ v9 ?0 n) W0 b" f9 Y - void Set_usart_timeout(int timeout)
! M6 g. S& E) _& K5 J - {9 O; x6 Z8 e* I: _ G* w+ T
- usart_timeout=timeout;
) L6 S9 l Z' v* Q3 E0 J1 d - }9 K4 z2 I" c$ e# D4 ?
- |5 O/ ]: m! I
- int fgetc(FILE*f)
- ^, M5 ?0 D# T$ Q n+ w. j* }3 ? - {
+ J, g2 O: B8 a; M" X: V) J8 s - int ch;
2 ~9 _& {' v% y1 b: q& B( m - if(usart_buf.rx_index!=usart_buf.save_index)
2 t0 n- v. ?5 C8 o3 R0 P - {: q/ o8 ? T9 i1 u' H7 V( x _: ]
- ch=usart_buf.buffer[usart_buf.save_index++];2 d7 ^7 y6 w9 c" s% X
- if(usart_buf.save_index==Buffersize)
/ S8 g* i6 y: x# Q# [* ?5 L4 n - {! k% M1 C) m8 ~) U
- usart_buf.save_index=0;9 y/ p2 p1 S& `5 I1 V8 F1 ?
- }6 w: C y6 Z$ m( K
- return ch;
) n1 h9 \ q+ @6 m6 v: @* g - }
6 s2 f3 q; J+ S3 |' c3 Y/ O3 m - else
! V( e$ t3 L6 s$ i# v5 A3 m - {
' Y2 v$ y7 E$ T0 K+ \ - if(osSemaphoreWait(usart_sem,usart_timeout)==osOK)) A) \6 G- Y' ?; g
- {$ Q& j1 i* \2 b* c+ ?
- return fgetc(f);
; p" p D: g) S! `3 g - } m3 g# h0 ^- v
- else
: Z% O. c$ D: F6 @1 {0 k3 O% F5 A! R - {* d, U- g1 B7 H& |0 J) ^; ^
- return 0;& S R0 X) m T. r4 T9 D
- }
/ X% F) N9 {! `! n" n' R7 C - }% m. u2 b- _; z0 I& _. B) _! A
- }+ U. O7 V$ W2 R) g+ x
% R5 h/ X5 U& x) O- int fputc(int ch,FILE*f); ^: n1 k# V3 U! O, l
- {
1 p5 ~- p, B: a, { - while(!(huart2.Instance->ISR&UART_FLAG_TXE));
7 L4 \( m4 k# A y) L - huart2.Instance->TDR=ch;9 O% a4 @* ]% W! {; {& M
- }
复制代码
& a' v1 Z* j9 i/ u- ~下面是主函数 增加内容
" |2 `4 C+ a& i! S0 X4 z
! ?: p, m: ?% S1 n/ D- R# H作用为 通过scanf 扫描串口 数据到 i % ?3 a1 r2 y; {2 x" r* _) ]0 R
% u" n" ~, R: D: ]7 M6 G- f2 L; F& l将收到数据 以0x-- 16进制 打印
# u. {( `4 ~. R; |5 x7 @5 B, k9 ?1 I: i9 L
使用 超级终端 运行程序 键盘输入 10 Enter 可见超级中端 输出0xa; g$ e, w' z) |& @
. O( }7 i5 E" _$ s, X& f' k9 ?
& g1 w+ o$ Z m
) Q9 q1 ^) v. T% v! F
+ T) G L& U5 f6 R8 F
# P4 T8 L2 a/ e4 ~# O, iscanf阻塞 程序运行的过程中 仍然看见 072 LED闪烁
2 z+ m) I. y% q, n8 h0 P! l/ z" B
7 Y; d% ]4 Z O, g4 t如此可见 使用OS 接收串口比 没有OS的优势~~
& i0 Z, b; Y# @6 V4 c, @3 }$ q3 w+ K+ L+ ]8 f5 [- k+ l8 a" I
例如 用这种方式操作 GSM模块 printf("AT+XX");7 I- N% g5 C) ?; N* T
发送 AT指令之后
" a. b* g$ B' q5 A( z
1 N3 }: t5 T" ?* g2 L) Q用scanf 接收模块回复
7 s0 d# W- j0 ^1 ^5 ]9 I9 v
1 k. X2 n9 q: b+ x% a% ?; C6 s在此过程中 你的设备仍然可以通过其他线程 响应 按键或者 更新屏幕 显示~~; f h8 l, k8 ?" {! ?+ L& |
5 M9 b+ H3 y& c# f
|
不知道 你有没有研究过 HAL 的 中断 API
4 k. M7 d' \4 ?0 g$ G& I2 I, t+ Z
运行机制是这样的 设置buffer地址和 需要接收的 数据 数量(这个是重点)!
然后会从 串口发送一个字节出去 HAL称之为 DUMMY_DATA 这不是 所希望的吧?
然后 需要所设置的 数量 数据接收完毕 才运行 callback函数 显然 通信过程中不知道需要接收多少字节?! n2 {2 v& n& O
: u% b2 d3 r" M. J% O7 h& ~
总不能设置为1吧? 那HAL又相对于 自己写个中断函数 又显得臃肿了 很多~~
HAL 库的 中断接收 是 主动调用的
$ w' S% Q# P: N5 g) j& F8 a
也就是主动接收 $ i5 g5 p; `) Q2 {
' R2 t( [8 O# [. G. c" X
我这里需要被动接收的
我先使用一下HAL API再来讨论啊 还真没用过~~
上一贴的 地址在 帖子 顶端呀
不太懂,估计楼主也是个小白。