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

干货 Nucleo072 usart 基于RTOS的应用 方便AT指令类外设开发  

[复制链接]
lovewyufeng 发布时间:2015-1-8 14:06
本代码 基于楼主上一贴发表 帖子构建的工程:https://www.stmcu.org.cn/module/forum/thread-598980-1-1.html
3 q+ s/ h: A+ L$ I, j
4 k. f7 ?* v1 {: P[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]
* j* X7 k2 n& h2 b$ x5 D5 p0 x4 S: s" {+ y. U
添加了一个 os_usart.c的 文件  
6 q- @' }/ x  c: `: [5 o内容# T5 G8 n* y2 \+ P
+ T9 |  l8 C- \( R& L3 h
如下

  1. 2 x* V3 x1 Y* ~4 f! e* T

  2. % I" i# r1 S$ S: o9 Q- L
  3. #include "stm32f0xx_hal.h"
    & B( N, x3 q+ k0 ~( a2 N
  4. #include "cmsis_os.h"3 g2 e' T2 u5 O1 b( @: L
  5. #include "stdio.h"' E, x3 n* O3 z: Z4 G0 Q
  6. 5 F# [7 f5 D  h4 ^
  7. extern UART_HandleTypeDef huart2;
    # V# \; {9 p* F2 z4 m4 m* ^4 ^
  8. osSemaphoreId usart_sem;$ S  Q# Z( j7 {# a
  9. #define Buffersize 10% i- v' `* e( r8 P& X
  10. struct usart_buf_t! }; t, w" ]$ k0 [2 I! q
  11. {0 B, a% V/ u+ G. L( Y4 A
  12. char buffer[Buffersize];5 N9 E1 R" d2 F7 n3 }; z* a' F$ C2 s
  13. int rx_index;
    + l, c& b! Y$ A5 M
  14. int save_index;
      M: z; N4 \' I' T, l
  15. ( y7 D4 g; A- N, L( ~5 u7 V
  16. }usart_buf;0 n7 e) S- @% _4 W$ e3 q3 y) G
  17. void os_usart_init()
    + y. S# C. U& d& r
  18. {
    + z& ?3 x3 b& J; d2 ^$ M% ]
  19. usart_sem =osSemaphoreCreate(0,1);
    6 y" j4 Z% M! c+ b/ z; j
  20. usart_buf.rx_index=0;
    - i% m6 g9 Y5 ]' w9 H; [  R
  21. usart_buf.save_index=0;5 }  {4 R$ o7 y' S9 a- t
  22. osSemaphoreWait(usart_sem,osWaitForever);3 |# d! W$ D2 x; ]! f
  23.         
    / e! `& y. r4 N
  24.         HAL_NVIC_SetPriority(USART2_IRQn, 0, 1);0 U9 S0 l& w8 Y- S; o
  25.         HAL_NVIC_EnableIRQ(USART2_IRQn);& U% O2 Z3 `3 d9 S/ r* u
  26.         __HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);
    . [/ ~8 C1 f5 a+ r4 A7 I
  27. }" w8 j/ `7 E% A4 J" O- `6 [
  28. 1 [  ?( p. l6 t) _$ G; v5 N% Q
  29. void USART2_IRQHandler()  a! S. {- l1 E
  30. {
    + X  F+ @4 E9 d9 v3 \3 ^0 z
  31. if((__HAL_UART_GET_IT(&huart2, UART_IT_RXNE) != RESET) && (__HAL_UART_GET_IT_SOURCE(&huart2, UART_IT_RXNE) != RESET))! J3 c- D6 N* I6 O# g/ o+ H  h
  32.   { . ~6 E/ ~- u9 d% d& u9 [6 v

  33. # b& ^, N  y0 I' Z( ]5 q* `0 w
  34.                 usart_buf.buffer[usart_buf.rx_index++]=huart2.Instance->RDR;
    / u2 v" n: K- d# o1 S2 A5 J
  35.                 if(usart_buf.rx_index==Buffersize)usart_buf.rx_index=0;
    ) ~0 \$ o0 T0 ~- ~3 f2 \: _& e
  36.                 if(usart_buf.rx_index==usart_buf.save_index)
    7 r. {# {& n0 O6 M" I5 t
  37.                 {9 d( Q* k! T4 S  |
  38.                         usart_buf.save_index++;, Y* W/ |% D+ `4 X8 s8 S3 [
  39.                         if(usart_buf.save_index==Buffersize)usart_buf.save_index=0;' U% s9 _' V: L" |
  40.                 }" ]. F& ^0 H& l3 N: i, l/ Z
  41.                 osSemaphoreRelease(usart_sem);: I2 C2 Z7 K3 `6 X6 q
  42.     /* Clear RXNE interrupt flag */" J! \* x2 }( n. _
  43.     __HAL_UART_SEND_REQ(&huart2, UART_RXDATA_FLUSH_REQUEST);
    $ t9 f( H; u, X6 @2 E6 [, ^9 j$ B& V
  44.   }) i9 I# p$ P3 _" U; D6 ]
  45. }
    6 i, m' L3 F5 A6 g3 n: p* P
  46. static unsigned int usart_timeout=osWaitForever;7 D8 A$ M( X) s9 u0 J
  47. void Set_usart_timeout(int timeout)3 D, ]) K* `# B
  48. {
    1 V* ^) D" n  H# l" P. R$ f
  49. usart_timeout=timeout;
    & @/ v8 G, H' J' p( A+ k  W! F
  50. }
    ! p  Z, `8 Y/ O! V/ [* s9 i
  51. # m- U5 V9 H6 i0 J
  52. int fgetc(FILE*f): ~  N: X1 p6 B: ^
  53. {% w% t% N5 }8 w( n7 P" T: B+ [+ X
  54. int ch;) c1 q2 P* o! M2 }) j
  55.         if(usart_buf.rx_index!=usart_buf.save_index). N2 Y# g$ U4 ]7 E" I" B7 V
  56.         {
      N5 y. N" Y- e0 E4 @7 Z. |
  57.                 ch=usart_buf.buffer[usart_buf.save_index++];
    # J/ e7 g& ?+ O# g
  58.                 if(usart_buf.save_index==Buffersize)
    : G- b7 i+ S( O8 Q
  59.                 {
    1 M4 ~: r# F: k/ K$ x' o, ]; B6 Y2 T
  60.                 usart_buf.save_index=0;7 i% Y( k0 G! z  Y/ ]9 F; I
  61.                 }+ h, ]$ _2 V8 N0 {" V+ f
  62.                 return ch;
    " `% G0 d' {% ^% t' S, V/ ?. v
  63.         }
    & ~$ p( y4 ?) P' x" r( @0 M
  64.         else
    - U- @9 V/ U9 M/ S$ q$ D# a
  65.         {# U4 N0 ~- u3 Y/ A
  66.         if(osSemaphoreWait(usart_sem,usart_timeout)==osOK)
    : H( Z# o! f- \7 h$ i+ e
  67.         {
    % V( K: R9 D- I0 Q. A
  68.         return fgetc(f);
    9 q0 O! ~8 n) u
  69.         }
    2 ^) y( V+ D8 T" c% ]' v% Y
  70.         else& w, O, n2 c# T
  71.         {
    $ O0 L: v5 e! {( [/ Q6 d
  72.         return 0;
    % O4 v/ C2 [8 r( H2 P; r9 e9 d9 F" M
  73.         }* g" O; y. p1 ]5 m) z
  74.         }
    # G3 q- x4 _: K1 T$ Y& @# N
  75. }
      p1 D( a/ ^; w% B2 D, e" x& F
  76. ; A3 E  J# i8 [9 d5 ~5 t- L
  77. int fputc(int ch,FILE*f)
    ; S* n* ]" U9 ~# c. i: C
  78. {
    . N+ s  w' ^$ P$ x: d* @' V
  79.         while(!(huart2.Instance->ISR&UART_FLAG_TXE));
    ; h* |1 J5 ]9 \. a/ [
  80.         huart2.Instance->TDR=ch;
    + F' _) U9 U( R- t# P/ s
  81. }
复制代码
  1. ( C1 X' e0 ?5 g; s6 P( r0 b
复制代码
1 |3 Q# p8 P, d/ |+ d
下面是主函数  增加内容  8 @8 x; q: K4 t9 x$ a
# m+ l9 a  T' J5 ]5 t/ ]
作用为  通过scanf 扫描串口 数据到 i
, u" g! N# X- g$ Z0 W* Q. y; Z+ m2 I, ~# C
将收到数据  以0x-- 16进制 打印4 |  l4 R8 M( K# `+ V
! b; o1 c& I, b2 M' T
使用 超级终端  运行程序  键盘输入 10 Enter  可见超级中端  输出0xa
. ?/ V, ?* T- ]+ P
4 |$ M( b5 w# ~$ X; o; M" w; T  h; P5 R) V
QQ截图20150108135246.jpg
8 e! V7 d6 _2 z$ f
+ Y: z: j6 e9 u3 o
- s$ e" [8 d4 P* H- W5 w* D) Sscanf阻塞  程序运行的过程中 仍然看见  072 LED闪烁- C; @" d! B- D- k# M0 A! p! A
' _  T' |* ^6 F
如此可见 使用OS  接收串口比 没有OS的优势~~; m( h6 M- w7 v8 F

6 q$ Z5 Q$ _0 I- T- x! u例如 用这种方式操作 GSM模块  printf("AT+XX");8 [) W% R* `' o* @/ ^! k
发送  AT指令之后  ) P6 E" K1 z$ N. I/ f6 j2 ~
# v: j/ h. p1 j) s: Q
用scanf  接收模块回复 + B# J) b& C0 p& Z! ]& a

# D6 u7 k/ Y' ], s1 ?  l' Y. i在此过程中  你的设备仍然可以通过其他线程 响应  按键或者  更新屏幕 显示~~
4 F7 O0 y( m! M6 z+ r5 ]4 ]% V# L" M# ?- j" c

FREERTOS.zip

下载

4.76 MB, 下载次数: 321

工程文件 请打开freertos的 工程

赞 收藏 3 评论28 发布时间:2015-1-8 14:06

举报

28个回答
lovewyufeng 回答时间:2015-1-8 21:57:26
晓枫VS枯叶 发表于 2015-1-8 16:27% n- N: d  S: f, v5 K
我看你这个接收也是中断接收啊!
4 G1 b$ r- P0 q, U" r& g& Z
不知道 你有没有研究过 HAL 的 中断  API , e1 Y6 j! E8 V5 u. P. a

; b1 Y" N9 U7 c, S& ]: V( K运行机制是这样的  设置buffer地址和 需要接收的 数据 数量(这个是重点)!9 D; t6 C9 j: G+ X3 ^' K
4 u) b' \( _5 W2 R
然后会从 串口发送一个字节出去 HAL称之为 DUMMY_DATA 这不是 所希望的吧?
6 _7 C4 s+ u  K6 B+ s2 F: j
5 h: S& _+ n+ ]8 Y" |然后  需要所设置的  数量 数据接收完毕  才运行 callback函数  显然  通信过程中不知道需要接收多少字节?+ ?, z' C' [- S! ~. B

; S! A  p0 J0 T4 U6 u& z- j5 W  H2 j总不能设置为1吧?  那HAL又相对于  自己写个中断函数  又显得臃肿了 很多~~
lovewyufeng 回答时间:2015-1-8 15:38:48
晓枫VS枯叶 发表于 2015-1-8 15:36
  @. J6 s- ^# ]' R  S楼主的接收中断为什么不直接调用HAL的API写,还要搞寄存器!

0 n# j. W% t* ?8 ]9 uHAL 库的 中断接收 是 主动调用的  * M( @3 ^5 C1 u  {/ G4 k

/ m8 x* m' ?9 d1 _  {  V  T也就是主动接收  
0 p1 c2 V/ @. {# {6 Z+ }5 |" G1 ?  \8 b/ ~& J7 o$ c1 R8 J

' C# J* c0 a% M+ A2 m0 G3 }我这里需要被动接收的
lovewyufeng 回答时间:2015-1-8 22:05:49
adersonl 发表于 2015-1-8 22:02$ p) H1 |# A! X+ S1 H
不太懂,估计楼主也是个小白。

8 V5 `$ v. _4 K; {9 U0 @+ n4 x  我先使用一下HAL API再来讨论啊  还真没用过~~
沐紫 回答时间:2015-1-8 14:12:57
楼主把上个帖子标题和网址也贴出来吧,这样能连贯看下来啦
liuqihui-347226 回答时间:2015-1-8 14:13:06
支持一下,做过类似的东西,确实,这样搞会方便很多
lovewyufeng 回答时间:2015-1-8 14:14:25
沐紫 发表于 2015-1-8 14:12! F' U7 W0 O1 m
楼主把上个帖子标题和网址也贴出来吧,这样能连贯看下来啦

/ ^, U7 V, n2 O, V% J6 M& v上一贴的 地址在 帖子 顶端呀
空漠 回答时间:2015-1-8 14:17:14
不明觉厉,MARK
lovewyufeng 回答时间:2015-1-8 14:19:28
贴的 代码  注释又没了  ,,,收敲酸了  明天重新编辑  注释吧
oipk 回答时间:2015-1-8 14:59:45
不明觉厉,MARK,楼主牛掰啊。看来我要动cube了
boyubeiyu 回答时间:2015-1-8 15:01:52
不错。学习下
qwe775208732 回答时间:2015-1-8 15:06:47
不懂,学习,哈哈
晓枫VS枯叶 回答时间:2015-1-8 15:36:34
楼主的接收中断为什么不直接调用HAL的API写,还要搞寄存器!
harvardx 回答时间:2015-1-8 15:44:18
不止是干活, 让我们这些rtos菜鸟 学习了怎么快速建立rtos项目 ,
晓枫VS枯叶 回答时间:2015-1-8 16:27:22
我看你这个接收也是中断接收啊!
aderson 回答时间:2015-1-8 22:02:25
晓枫VS枯叶 发表于 2015-1-8 16:27( |( |0 f0 X( C: S
我看你这个接收也是中断接收啊!

9 O# Y+ K/ I4 [! q不太懂,估计楼主也是个小白。
12下一页

所属标签

相似技术帖

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