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

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

[复制链接]
lovewyufeng 发布时间:2015-1-8 14:06
本代码 基于楼主上一贴发表 帖子构建的工程:https://www.stmcu.org.cn/module/forum/thread-598980-1-1.html  `! Q3 y2 i: p
* m7 J) j; q. n
[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]
" [7 B2 M5 \8 W
4 q' S$ H8 q" u& D: {添加了一个 os_usart.c的 文件  1 m& d% x% w/ O7 a, s7 r
内容
2 z  ^8 T. k$ ^8 r! a) T4 h! ?) X# W0 B/ B
如下
  1. 5 l  r# I9 {! u% O6 m7 \' }. Q' l

  2. ( v) h4 o- i/ H7 N3 X  A3 k
  3. #include "stm32f0xx_hal.h"
    & f% @' X" r: L7 T! a  v( w
  4. #include "cmsis_os.h"  _! n0 b, p4 z6 n
  5. #include "stdio.h"
    * Y+ s# L' I4 N! q$ r" ?+ O

  6. ; L1 o& z9 i# M# n) T, a
  7. extern UART_HandleTypeDef huart2;
    ) l* [' m( l. j4 p/ ?
  8. osSemaphoreId usart_sem;
    : ^8 v/ H  {4 k5 y+ x9 ]
  9. #define Buffersize 10
    7 w# ?' q5 ^; f, I  N
  10. struct usart_buf_t
    - m; @, r' U' G; n4 `: K% J
  11. {
      C2 o7 J7 e$ g6 }
  12. char buffer[Buffersize];% s& [# y5 r' ~7 v5 X+ c' b
  13. int rx_index;# Y" A) `4 w0 g2 b  q2 s' X
  14. int save_index;
      s1 E1 Z! ~: d! H  p
  15. 5 f  f/ V6 c$ r, K; K/ S3 ?
  16. }usart_buf;% W$ l0 W4 ?  m- U0 o: F
  17. void os_usart_init()
    . a, b9 V7 w# N! E
  18. {
    % N+ E1 M" m" s) W  E
  19. usart_sem =osSemaphoreCreate(0,1);4 z1 f# E4 d, ~2 `9 \7 [* a
  20. usart_buf.rx_index=0;; e5 s( Y4 h! K' w  @
  21. usart_buf.save_index=0;( U3 O( t( I) r0 |1 U  o3 C
  22. osSemaphoreWait(usart_sem,osWaitForever);
    3 _& a. a9 J  L' f* V
  23.         9 e# r' v1 n, s3 \
  24.         HAL_NVIC_SetPriority(USART2_IRQn, 0, 1);; X! g" {5 f% }- ?; ?) R
  25.         HAL_NVIC_EnableIRQ(USART2_IRQn);+ ?' A0 E- `; S3 f
  26.         __HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);8 V; O7 a6 t9 l) D
  27. }
    ! `# h, h3 g! M4 f7 n! W) \
  28. ' @& Q- ~6 U1 j# S( _( [
  29. void USART2_IRQHandler()
    2 n; R6 i& B2 y( S. J2 x
  30. {
      X& E8 ^8 y" k! B8 s
  31. if((__HAL_UART_GET_IT(&huart2, UART_IT_RXNE) != RESET) && (__HAL_UART_GET_IT_SOURCE(&huart2, UART_IT_RXNE) != RESET))  ~1 t) E! K$ u- \
  32.   {
    " ^# h: @9 |4 W' }& M

  33. 4 z/ W& l! B6 r
  34.                 usart_buf.buffer[usart_buf.rx_index++]=huart2.Instance->RDR;
    $ B: T8 ^. i' \
  35.                 if(usart_buf.rx_index==Buffersize)usart_buf.rx_index=0;: P& Y, [8 }, `' J
  36.                 if(usart_buf.rx_index==usart_buf.save_index)
    & M$ K; H0 M/ v- A* R% a& ?
  37.                 {* e. G+ m% R0 z7 m
  38.                         usart_buf.save_index++;# x' J1 J2 ^4 ^+ b. f/ p4 w  f5 i
  39.                         if(usart_buf.save_index==Buffersize)usart_buf.save_index=0;
    ; S, h3 N" R. `9 a2 w
  40.                 }
    " e. K# Z( ~/ z/ J4 f9 Z: D1 |
  41.                 osSemaphoreRelease(usart_sem);: a7 U8 L+ S7 c" h" b6 C+ o3 p
  42.     /* Clear RXNE interrupt flag */
    4 \* \9 D1 x5 i5 {$ x0 w  v
  43.     __HAL_UART_SEND_REQ(&huart2, UART_RXDATA_FLUSH_REQUEST);
    . \. T. z! ]2 y* m& Q) x2 `
  44.   }% B3 _% V; v9 k- W1 ~. c
  45. }
    $ U6 s( i/ K$ X- j5 d6 Z& E5 V
  46. static unsigned int usart_timeout=osWaitForever;9 ~( |, ]  y& ]  ^
  47. void Set_usart_timeout(int timeout)
    / L% I1 Q9 r& f0 ]* F' v
  48. {% U5 ?" E9 V: {7 S# ]) W
  49. usart_timeout=timeout;0 O. s/ q  [8 z& V7 Q
  50. }
    8 J  I) y3 [4 X. m
  51. . o0 D: ^" ~( f
  52. int fgetc(FILE*f)4 Y# |, d! b( T3 l. U
  53. {1 V- ]1 ~+ E0 i
  54. int ch;; M3 \! R! w; f6 A" k
  55.         if(usart_buf.rx_index!=usart_buf.save_index)& P+ [- J/ @/ u4 o" J, a' _& @4 P' a
  56.         {+ m6 @% o' D, ~1 A7 @8 N) ~( L  @5 d
  57.                 ch=usart_buf.buffer[usart_buf.save_index++];
    % z% p" G  O- \/ }# |# _! p
  58.                 if(usart_buf.save_index==Buffersize)  m1 Y1 ~2 g! ]* L
  59.                 {8 H( T  t5 f( @" s0 u% B
  60.                 usart_buf.save_index=0;6 ^5 o8 c4 t# n# G& X% \0 l4 Y' w8 L5 U
  61.                 }* J; F! Y6 \% E, _; O9 e: R
  62.                 return ch;
    # n  o: v% }% a7 {- C
  63.         }2 {6 ~( ]' b; Y7 v2 y% k
  64.         else
    ; R5 S& J6 F0 x1 n; |& h5 X7 F. D
  65.         {+ v; z7 z5 n+ L" R$ h* O$ Z
  66.         if(osSemaphoreWait(usart_sem,usart_timeout)==osOK)
    1 I- l1 X0 u! _3 }9 `# G( K/ Z
  67.         {
    8 s, j+ ^6 z8 A7 Y5 j: c! |
  68.         return fgetc(f);
    9 ~- L  u4 w% l4 D" x) Z1 C9 n* m
  69.         }
    ' L4 U7 m( m+ k& I; g
  70.         else1 j1 R, c' L1 S$ Q+ U
  71.         {2 T. }' N2 M; v" {
  72.         return 0;2 _% s, e1 W2 J1 v$ H
  73.         }
    0 b6 L$ t+ o7 J  ]3 r2 o
  74.         }, e+ Z) r: v5 B; \( o9 x/ e" U
  75. }; q! S2 k( R" i# h

  76. 7 `( d& M; Q; x3 Q% o( a
  77. int fputc(int ch,FILE*f)- \/ n/ O- Y4 P
  78. {" t9 {' V* H8 p
  79.         while(!(huart2.Instance->ISR&UART_FLAG_TXE));' z7 I: A+ ]( l( q" k
  80.         huart2.Instance->TDR=ch;, c# k6 F1 j. \! ^) c
  81. }
复制代码
  1. $ d1 z. a: s  R" C8 q  v
复制代码
& \) Q) ~( @& y, ^, s. c
下面是主函数  增加内容  
* l9 |' j) y9 r, E* R9 P6 [* M/ R0 I" e; n+ I& P9 ^
作用为  通过scanf 扫描串口 数据到 i
6 h  z. t% G0 e5 a4 G! S) y
" a; k$ v# s  k) z将收到数据  以0x-- 16进制 打印" t3 i( H$ r' Y+ ?5 D* z

) q  }5 D, M3 ?  q使用 超级终端  运行程序  键盘输入 10 Enter  可见超级中端  输出0xa
( l; e1 h: t- ~. H5 p1 N1 f7 Y9 m8 Y5 W+ Q! Y& Z

% z- |5 B- r& p QQ截图20150108135246.jpg ; x9 o. J$ |/ p

7 l+ |0 H4 i. U0 H/ T3 |& S% i8 B8 z. l1 k
scanf阻塞  程序运行的过程中 仍然看见  072 LED闪烁
7 a) [" o6 \! j6 w' k* o9 z! H
9 Z+ Z# h& ~" o/ q; T) z, l( U如此可见 使用OS  接收串口比 没有OS的优势~~9 g/ ~1 w. v+ i4 c( G3 b- `
! y7 u( L0 n$ _2 R/ B
例如 用这种方式操作 GSM模块  printf("AT+XX");
- L- e# Z2 W) H发送  AT指令之后  
) A+ f, m% K* U2 X9 l  K' F5 b! D4 Z5 m' }
用scanf  接收模块回复 ) S5 R+ n/ C8 j9 b

4 C& A9 u* r! I% V在此过程中  你的设备仍然可以通过其他线程 响应  按键或者  更新屏幕 显示~~& A/ D2 |3 Y& f1 z5 T; b" s0 U/ E. n

. f2 e" y+ K: M$ M. q5 l% B  c

FREERTOS.zip

下载

4.76 MB, 下载次数: 319

工程文件 请打开freertos的 工程

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

举报

28个回答
lovewyufeng 回答时间:2015-1-8 21:57:26
晓枫VS枯叶 发表于 2015-1-8 16:27) G9 s) Z! m* v. \
我看你这个接收也是中断接收啊!
9 K7 V- a* b0 s& z
不知道 你有没有研究过 HAL 的 中断  API
( _. g! `2 \6 L6 k8 O& i
6 _, V4 m  J: X+ x4 C  n( d. X. v2 j5 H运行机制是这样的  设置buffer地址和 需要接收的 数据 数量(这个是重点)!! p( k7 x% h5 m- L# `2 A! [/ K, t+ g

" Z: @8 D- r9 v2 O9 c  F) m* k然后会从 串口发送一个字节出去 HAL称之为 DUMMY_DATA 这不是 所希望的吧? ; h6 }, K7 A! U& I& V! a
8 w/ [) F- k) b& a& x) a+ N3 ]( L. D
然后  需要所设置的  数量 数据接收完毕  才运行 callback函数  显然  通信过程中不知道需要接收多少字节?, E7 [, r6 z* F! E/ ]8 J

: t5 C: V4 `. w总不能设置为1吧?  那HAL又相对于  自己写个中断函数  又显得臃肿了 很多~~
lovewyufeng 回答时间:2015-1-8 15:38:48
晓枫VS枯叶 发表于 2015-1-8 15:363 y: Y% |* y! t$ K2 D
楼主的接收中断为什么不直接调用HAL的API写,还要搞寄存器!
$ _4 H4 V5 S7 o- ~; t9 z
HAL 库的 中断接收 是 主动调用的  
, ~  P( }, W9 l' B+ f" p1 F$ x: b2 d5 O& ^# A4 R
也就是主动接收  3 M4 w4 P) k3 s

! m' ~9 ]7 c$ @& o% X% e6 r
3 k2 v6 d+ @6 Z我这里需要被动接收的
lovewyufeng 回答时间:2015-1-8 22:05:49
adersonl 发表于 2015-1-8 22:02
. y% V* x- L9 J( X不太懂,估计楼主也是个小白。
2 ~& C, c/ W4 G/ b0 p
  我先使用一下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
$ C2 S$ y. F( o) e楼主把上个帖子标题和网址也贴出来吧,这样能连贯看下来啦

1 n/ r" @( p" a6 k上一贴的 地址在 帖子 顶端呀
空漠 回答时间: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
' V; h# W6 ?, p2 [4 }我看你这个接收也是中断接收啊!
' J4 ?* \: Q- `" N5 w
不太懂,估计楼主也是个小白。
12下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版