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

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

[复制链接]
lovewyufeng 发布时间:2015-1-8 14:06
本代码 基于楼主上一贴发表 帖子构建的工程:https://www.stmcu.org.cn/module/forum/thread-598980-1-1.html3 q1 K- D. [5 M% H
  |- {! t9 g, A( w1 Y
[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]
  u% z0 L$ g5 I2 b5 z3 s
, k1 l% [; N2 Y: m( }1 r& @3 K3 U1 n添加了一个 os_usart.c的 文件  
+ \% h. _& e9 d* V$ @+ o内容- ?" w8 S% v) {2 o% [6 Y

5 E* n2 k% L7 ~如下
  1. % J( |/ l) ^2 j
  2. $ J1 w) b2 Q2 `- T% z/ ~9 ]; W
  3. #include "stm32f0xx_hal.h"
    5 r% O8 r3 Y, i) @  M
  4. #include "cmsis_os.h"
    8 M( U2 P5 `: m% W( w- c
  5. #include "stdio.h"9 N% K' t9 Z& C3 Y$ d$ B6 e

  6. 6 g/ Z$ V1 A4 j8 Y* P: @  S$ s+ e
  7. extern UART_HandleTypeDef huart2;4 y5 d, Q# U5 W6 k6 J) e5 c
  8. osSemaphoreId usart_sem;
    2 F* I% m/ f' Y, H7 I' V
  9. #define Buffersize 108 G% d- C# ^# e
  10. struct usart_buf_t$ Y5 z/ h& [& Z  F3 G
  11. {( J5 ?5 y1 k; s- a& x$ U
  12. char buffer[Buffersize];  {+ h5 |* r  |% A8 s# e3 f9 T
  13. int rx_index;8 v- q1 O; S( a& k2 }* `8 _8 c
  14. int save_index;1 L) @. Z/ v+ R0 l5 [
  15. 7 ?0 I' n$ |8 P6 e2 R
  16. }usart_buf;
    : Y) v' L7 I3 l0 c# G, o$ O8 g/ B
  17. void os_usart_init()
    + y# p4 k& c5 `+ ~2 B* B* T
  18. {
    6 ?0 o# T+ h4 Z+ h! e, J! a6 W6 g
  19. usart_sem =osSemaphoreCreate(0,1);5 @$ B7 }7 t# Q8 m) A0 E
  20. usart_buf.rx_index=0;$ x4 |$ H9 N' ~& \7 G  D4 K4 e
  21. usart_buf.save_index=0;
    & Y. J! ?# v% m/ X
  22. osSemaphoreWait(usart_sem,osWaitForever);4 n  U' z4 \+ N$ M/ U& g* ?+ l
  23.         
    . F; N4 @& H' R1 `8 g
  24.         HAL_NVIC_SetPriority(USART2_IRQn, 0, 1);
    ) ?$ E- l) c$ `( m! q$ {7 l. U
  25.         HAL_NVIC_EnableIRQ(USART2_IRQn);
    # `3 L$ F) }& N: e+ Z) N* o1 s
  26.         __HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);
    * ~' m# q7 D2 q* ]8 w, s0 ]% t
  27. }5 ?2 S/ E0 V6 Q: U

  28. " ?6 n* {: m, _. {- u
  29. void USART2_IRQHandler()8 a0 _5 ]5 I: F9 a+ ^/ A3 K4 A4 o
  30. {
    % r1 v# E% _# z) E3 K. r& t
  31. if((__HAL_UART_GET_IT(&huart2, UART_IT_RXNE) != RESET) && (__HAL_UART_GET_IT_SOURCE(&huart2, UART_IT_RXNE) != RESET))& M" j0 n# y- q! o
  32.   {
    ' Q- @$ L- i$ x$ _7 g! A

  33. 0 h3 {: I. b" a( U
  34.                 usart_buf.buffer[usart_buf.rx_index++]=huart2.Instance->RDR;8 y* C- f4 ]' F6 j
  35.                 if(usart_buf.rx_index==Buffersize)usart_buf.rx_index=0;, h2 }1 X; J; w
  36.                 if(usart_buf.rx_index==usart_buf.save_index)- r6 P) @  I+ S) \" J- ~1 O
  37.                 {
    - O$ y, P; J0 W$ Z  Z" F
  38.                         usart_buf.save_index++;
    # ^9 e% ]( B1 b3 {/ E. K, _* b
  39.                         if(usart_buf.save_index==Buffersize)usart_buf.save_index=0;/ j! Q% p; a: z1 M+ h
  40.                 }
    2 r4 Q/ E9 h( Z0 H) H$ m2 z; x+ n
  41.                 osSemaphoreRelease(usart_sem);% F5 j: u8 H5 G4 O' G$ t0 F
  42.     /* Clear RXNE interrupt flag */4 f8 @% w' C6 |8 H( d# ?
  43.     __HAL_UART_SEND_REQ(&huart2, UART_RXDATA_FLUSH_REQUEST);1 K& w! D" l2 ~# J
  44.   }6 U1 k. E9 \6 o, X) A6 h" z
  45. }; x3 X$ U, k: q
  46. static unsigned int usart_timeout=osWaitForever;& E( \% L! j, N" a+ f3 u
  47. void Set_usart_timeout(int timeout)/ O" u. C( W+ \# h6 |. s" H
  48. {
    ) [# \% V2 W& ?& E9 \3 |8 s2 N  U
  49. usart_timeout=timeout;
    0 I$ S. ^3 E2 L
  50. }
    % n0 X7 e1 k5 c, Q

  51. & U* W; ]6 l, D/ X' c
  52. int fgetc(FILE*f)
      D. `8 S! b3 c9 H
  53. {5 Z( h& ~3 B2 J' \1 ~8 n
  54. int ch;
    ; V1 p7 R8 o% |. B% P# F  @
  55.         if(usart_buf.rx_index!=usart_buf.save_index), z# [' |0 ]8 u1 P7 R. _0 z; ]
  56.         {
    0 ?1 w  s: j( H, V8 i) l
  57.                 ch=usart_buf.buffer[usart_buf.save_index++];
    6 d% ]) g2 r# l& i
  58.                 if(usart_buf.save_index==Buffersize)
    7 g' a8 ~) `9 i8 x
  59.                 {
    & x" I6 a* a! k% ~' t$ O6 ?
  60.                 usart_buf.save_index=0;
    " J$ X" O# ~3 Z! q1 i
  61.                 }, Z7 Q1 Q7 `6 s0 h: Q- i
  62.                 return ch;# d6 o* S3 ~3 I$ X" T
  63.         }
    0 c5 r/ p3 Q+ I
  64.         else
    4 a- r2 G- f1 _
  65.         {
    8 b4 a* ~: s& N2 _$ O
  66.         if(osSemaphoreWait(usart_sem,usart_timeout)==osOK)4 |' j; V3 e) U  F! n; [% x
  67.         {
    % J, H8 N. N3 D$ B9 U
  68.         return fgetc(f);
    5 ]; g: f: G/ i* `
  69.         }% ^4 |8 E2 q  \7 }- ?; \
  70.         else, U; E; z- @% |" }! ^
  71.         {  ]* b4 z# \5 a% p/ J
  72.         return 0;
    * X( V- t& @; g$ O& ~  C! g
  73.         }. x. V, I0 G" Q
  74.         }
    # G# V) ^1 T2 x8 i* {0 c
  75. }# D: S- P; Y4 ^+ o1 s2 N& d
  76. & ]( S* S) g$ s  D
  77. int fputc(int ch,FILE*f)! x8 v& U0 F: B: x5 g  t
  78. {
    # W1 x; `: F) U& ?! P: l: Y
  79.         while(!(huart2.Instance->ISR&UART_FLAG_TXE));& Z2 @; `/ _& U
  80.         huart2.Instance->TDR=ch;# c! m0 z) F, y5 u( Y+ [7 W# _+ T
  81. }
复制代码
  1. ; H! a) q3 A- }
复制代码
5 X# }' |# C5 D- L- C6 Z
下面是主函数  增加内容  
7 T: h+ m6 v- U; s& E4 U
9 R- z5 z8 s4 g6 c作用为  通过scanf 扫描串口 数据到 i / d4 \5 j# [; d

9 b$ E8 ^. r" L9 \7 s( f8 d2 R1 Y将收到数据  以0x-- 16进制 打印
3 V9 p/ h' I7 D' H2 p. r
- p: a7 k  ~, u1 s, h* Y- l使用 超级终端  运行程序  键盘输入 10 Enter  可见超级中端  输出0xa
& W" A* h3 }. X7 G1 F* q( u! M& I  b: i. f+ p0 Z2 e! O+ U( J. C

% E' M, A1 c$ a& {4 L QQ截图20150108135246.jpg
$ T7 e) u# l" O, W% R' j5 M0 [
9 O+ r% K' p$ m; f
, i6 T* _6 ^4 w% q' {2 Xscanf阻塞  程序运行的过程中 仍然看见  072 LED闪烁
9 h: G% R. ]& U. ^# j2 N4 B8 L1 d" p# J" H
如此可见 使用OS  接收串口比 没有OS的优势~~( c, c& p! Q: t9 i! G6 U4 p
- j% I/ p! @( l' r
例如 用这种方式操作 GSM模块  printf("AT+XX");5 V% T. y0 V% q9 ]2 |2 q* W3 h
发送  AT指令之后  
! r) A! C" j( {4 \- {/ A4 s
) @# t) X0 X* l用scanf  接收模块回复 0 D2 Q8 Q) y0 A- Y; |

: N. |! v4 M" X) K5 Y8 Z: H在此过程中  你的设备仍然可以通过其他线程 响应  按键或者  更新屏幕 显示~~, S7 d$ s/ F, u- v
" U! U' Y  n6 L0 G- i( R

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
6 k* K7 ^+ [- A8 p( C- |8 I; W5 R我看你这个接收也是中断接收啊!
; L8 n3 B  @2 \4 s
不知道 你有没有研究过 HAL 的 中断  API 4 S, B! b6 z0 o) f
8 m: A2 w' y' t% S
运行机制是这样的  设置buffer地址和 需要接收的 数据 数量(这个是重点)!. `8 E  @9 ]' I3 S: o" n

' ~" N6 N+ h) {3 C; j3 R! p, N然后会从 串口发送一个字节出去 HAL称之为 DUMMY_DATA 这不是 所希望的吧?
; T( \8 X# c* D# B$ I7 p# J. h/ Z
  x* g% u' ~5 x4 {" `然后  需要所设置的  数量 数据接收完毕  才运行 callback函数  显然  通信过程中不知道需要接收多少字节?
1 x5 c' g& x' D4 c  [2 P7 b. n$ U  s4 _' C, M; K7 ?
总不能设置为1吧?  那HAL又相对于  自己写个中断函数  又显得臃肿了 很多~~
lovewyufeng 回答时间:2015-1-8 15:38:48
晓枫VS枯叶 发表于 2015-1-8 15:36
3 C* Z: l3 \+ f9 T) u. [9 _6 }楼主的接收中断为什么不直接调用HAL的API写,还要搞寄存器!
2 g# H6 L! e+ R1 n# z  [) b
HAL 库的 中断接收 是 主动调用的  / S1 m* F4 ~! W/ ?, B
4 ^+ Q/ U  P. Q4 p4 c  M) U
也就是主动接收  
! E- {2 x7 b. H/ Z) ]# x  K' B# K6 b1 v3 V( F( B

" n. _' h5 _. m( d7 Y+ ?7 F我这里需要被动接收的
lovewyufeng 回答时间:2015-1-8 22:05:49
adersonl 发表于 2015-1-8 22:02) L& J" E+ m4 L
不太懂,估计楼主也是个小白。

6 ?! j3 S  p& \6 h  我先使用一下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& Y/ R6 {. r5 z, Q5 m! ?" u
楼主把上个帖子标题和网址也贴出来吧,这样能连贯看下来啦

; x0 Z8 Q3 P6 ?4 J) H9 a8 Z上一贴的 地址在 帖子 顶端呀
空漠 回答时间: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% R$ m) `, y/ f7 e: {; j
我看你这个接收也是中断接收啊!

7 {0 s9 _/ ?0 q6 \不太懂,估计楼主也是个小白。
12下一页

所属标签

相似技术帖

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