请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
lovewyufeng 发布时间:2015-1-8 14:06
本代码 基于楼主上一贴发表 帖子构建的工程: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如下

  1. 2 k( p  L* u/ T3 M
  2. 1 c2 o& r( Z1 P; V8 ~
  3. #include "stm32f0xx_hal.h"8 `- {& D) E' v3 A$ |3 c& I
  4. #include "cmsis_os.h"
    / f- m7 ^! N' A, z7 q2 q
  5. #include "stdio.h"1 u( C6 ]2 a0 ~/ w* ]

  6. 2 _+ @5 v9 t0 ~( K  [
  7. extern UART_HandleTypeDef huart2;
    ! r2 `0 i7 D, t$ t; N0 I5 y- v
  8. osSemaphoreId usart_sem;
    3 w' r* F! M) `/ X. K- R
  9. #define Buffersize 10
    ; c5 I! H3 Y" o2 e7 O" H# m0 ?
  10. struct usart_buf_t, i8 Y4 u- m+ ?- H- x  L/ r# M2 D
  11. {8 ?, R4 m; z/ @" {$ ^! A
  12. char buffer[Buffersize];
    - p. n- x2 t; [* C# f% T. ?1 n
  13. int rx_index;0 y5 v8 k& k7 n2 r
  14. int save_index;3 ^3 i8 P8 T' [; Z7 Z3 M1 e- g8 r
  15. 5 Y' Z3 z/ k$ Q% C
  16. }usart_buf;
    1 V1 ?, l- o/ ]+ \" p. `( F
  17. void os_usart_init()
    ' d! ]- ?8 e: Q. ^
  18. {
    % p% Z+ q; t7 g9 h" B
  19. usart_sem =osSemaphoreCreate(0,1);4 f& P8 v" h6 G1 L+ x
  20. usart_buf.rx_index=0;6 ]! }% F3 j- [5 W- ]
  21. usart_buf.save_index=0;. j0 k3 x; `& ^# r/ R! [9 @3 z7 C
  22. osSemaphoreWait(usart_sem,osWaitForever);
    , K/ k6 i" ]) h3 R# e
  23.         
    + E1 G; `' X; v
  24.         HAL_NVIC_SetPriority(USART2_IRQn, 0, 1);
    ! i: x" {( u0 x5 E5 ?6 i
  25.         HAL_NVIC_EnableIRQ(USART2_IRQn);+ y/ p3 y. }; f# ~
  26.         __HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);
    & S/ z% m; n0 G0 Y& d9 W& |
  27. }
    $ V6 H  K/ B- g6 s

  28. 1 S) ~! @- b5 g' B/ |, o
  29. void USART2_IRQHandler()
    7 K; \- x: h1 F; M4 k' u
  30. {
    6 W- R7 L# |- t8 h4 o: x! M1 @0 ]
  31. 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. @
  32.   {
    ' Y" s) @% l- w/ [; G3 ]
  33. $ P* I1 X; q& F$ ?% w( l4 l
  34.                 usart_buf.buffer[usart_buf.rx_index++]=huart2.Instance->RDR;2 G- h& [5 }7 e9 d
  35.                 if(usart_buf.rx_index==Buffersize)usart_buf.rx_index=0;* c& a% ^* c* K) u+ t( _( |8 y* K
  36.                 if(usart_buf.rx_index==usart_buf.save_index)- U* a, B  _7 j: @$ j
  37.                 {
    $ @5 K! w/ g6 N8 c  u
  38.                         usart_buf.save_index++;' m* ?# B! ?3 j# F
  39.                         if(usart_buf.save_index==Buffersize)usart_buf.save_index=0;6 f& Q$ C  X2 k+ Y6 H' b$ A4 z
  40.                 }
    " z/ u) ?# g* r
  41.                 osSemaphoreRelease(usart_sem);
    . k3 R& Z5 d' C, O9 r
  42.     /* Clear RXNE interrupt flag */
    1 R8 k2 L$ [/ |+ ?
  43.     __HAL_UART_SEND_REQ(&huart2, UART_RXDATA_FLUSH_REQUEST);6 L/ Y. F. b% C6 D0 m! k& b
  44.   }
    3 j& M' ?% _5 e- M% W& r$ Q
  45. }7 T' h$ Q4 t6 H+ Q
  46. static unsigned int usart_timeout=osWaitForever;
    . [$ v9 ?0 n) W0 b" f9 Y
  47. void Set_usart_timeout(int timeout)
    ! M6 g. S& E) _& K5 J
  48. {9 O; x6 Z8 e* I: _  G* w+ T
  49. usart_timeout=timeout;
    ) L6 S9 l  Z' v* Q3 E0 J1 d
  50. }9 K4 z2 I" c$ e# D4 ?
  51.   |5 O/ ]: m! I
  52. int fgetc(FILE*f)
    - ^, M5 ?0 D# T$ Q  n+ w. j* }3 ?
  53. {
    + J, g2 O: B8 a; M" X: V) J8 s
  54. int ch;
    2 ~9 _& {' v% y1 b: q& B( m
  55.         if(usart_buf.rx_index!=usart_buf.save_index)
    2 t0 n- v. ?5 C8 o3 R0 P
  56.         {: q/ o8 ?  T9 i1 u' H7 V( x  _: ]
  57.                 ch=usart_buf.buffer[usart_buf.save_index++];2 d7 ^7 y6 w9 c" s% X
  58.                 if(usart_buf.save_index==Buffersize)
    / S8 g* i6 y: x# Q# [* ?5 L4 n
  59.                 {! k% M1 C) m8 ~) U
  60.                 usart_buf.save_index=0;9 y/ p2 p1 S& `5 I1 V8 F1 ?
  61.                 }6 w: C  y6 Z$ m( K
  62.                 return ch;
    ) n1 h9 \  q+ @6 m6 v: @* g
  63.         }
    6 s2 f3 q; J+ S3 |' c3 Y/ O3 m
  64.         else
    ! V( e$ t3 L6 s$ i# v5 A3 m
  65.         {
    ' Y2 v$ y7 E$ T0 K+ \
  66.         if(osSemaphoreWait(usart_sem,usart_timeout)==osOK)) A) \6 G- Y' ?; g
  67.         {$ Q& j1 i* \2 b* c+ ?
  68.         return fgetc(f);
    ; p" p  D: g) S! `3 g
  69.         }  m3 g# h0 ^- v
  70.         else
    : Z% O. c$ D: F6 @1 {0 k3 O% F5 A! R
  71.         {* d, U- g1 B7 H& |0 J) ^; ^
  72.         return 0;& S  R0 X) m  T. r4 T9 D
  73.         }
    / X% F) N9 {! `! n" n' R7 C
  74.         }% m. u2 b- _; z0 I& _. B) _! A
  75. }+ U. O7 V$ W2 R) g+ x

  76. % R5 h/ X5 U& x) O
  77. int fputc(int ch,FILE*f); ^: n1 k# V3 U! O, l
  78. {
    1 p5 ~- p, B: a, {
  79.         while(!(huart2.Instance->ISR&UART_FLAG_TXE));
    7 L4 \( m4 k# A  y) L
  80.         huart2.Instance->TDR=ch;9 O% a4 @* ]% W! {; {& M
  81. }
复制代码
  1. ( O  Y/ `6 V; N' G* q; A
复制代码

& 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 QQ截图20150108135246.jpg
) 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

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
! y0 E7 {3 D2 }& m5 i/ ]2 p我看你这个接收也是中断接收啊!

0 f" F' T$ G5 S8 `$ q  x不知道 你有没有研究过 HAL 的 中断  API
+ E! Y- N5 q2 A! w4 k. M7 d' \4 ?0 g$ G& I2 I, t+ Z
运行机制是这样的  设置buffer地址和 需要接收的 数据 数量(这个是重点)!
; n6 }, l& A7 {2 d8 z
4 H4 ]: g9 u1 _, g5 x然后会从 串口发送一个字节出去 HAL称之为 DUMMY_DATA 这不是 所希望的吧?
6 N0 p& S) U/ W+ s" Z
5 q% }6 h9 H5 i然后  需要所设置的  数量 数据接收完毕  才运行 callback函数  显然  通信过程中不知道需要接收多少字节?! n2 {2 v& n& O
: u% b2 d3 r" M. J% O7 h& ~
总不能设置为1吧?  那HAL又相对于  自己写个中断函数  又显得臃肿了 很多~~
lovewyufeng 回答时间:2015-1-8 15:38:48
晓枫VS枯叶 发表于 2015-1-8 15:36
' P. g: K5 W% a5 U4 g. Q+ D楼主的接收中断为什么不直接调用HAL的API写,还要搞寄存器!

$ z2 {) t3 w1 o4 m4 ^+ @HAL 库的 中断接收 是 主动调用的  
% T0 B8 Y! B3 x5 F& ^$ w' S% Q# P: N5 g) j& F8 a
也就是主动接收  $ i5 g5 p; `) Q2 {

6 F! T( T! F' `0 w) e1 T8 [' R2 t( [8 O# [. G. c" X
我这里需要被动接收的
lovewyufeng 回答时间:2015-1-8 22:05:49
adersonl 发表于 2015-1-8 22:02- P# w+ ^4 R  J- x, W( e- h
不太懂,估计楼主也是个小白。

( t$ d  X/ M& H: F) \  我先使用一下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
: V! t* N% O+ U, |/ u- m/ `0 D( t) k1 L楼主把上个帖子标题和网址也贴出来吧,这样能连贯看下来啦
: @9 z3 r8 @/ y; B
上一贴的 地址在 帖子 顶端呀
空漠 回答时间: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
- Z+ H( l9 h  i. @我看你这个接收也是中断接收啊!

, f2 E9 x4 Z) J' s+ f0 L& R不太懂,估计楼主也是个小白。
12下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版