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

STM32F0串口UART+DMA不定长数据空闲中断与溢出重置

[复制链接]
289466080 发布时间:2019-5-17 14:06
本帖最后由 289466080 于 2019-5-23 14:34 编辑
, g4 [6 q; a) c  w- D4 Y
' y5 h; H: b1 m0 i% A. C  最近调试一个串口通讯刚开始固定接收8字节没问题,实际应用时偶尔会接收16字节不规律,后来网上找不定长接收,(因只会用cube配置的所以很多方式都行不通只有DMA+IDLE可行)但是问题有来了如果接收超过设定最大值也无法再正常接收,后来再当产生闲时中断时定时器计时超过10ms重置DMA。下面是我配置的配置6 N8 H, [9 L( `; N" o7 E4 E+ X& K! Q
   超过最大值10ms重置,实测20ms间隔发送接收正常STM32F030。
' J! P2 l: g7 c& j: B; S7 K8 ]( T- y7 F* _
1.cube配置图8 @- ~) K# _' j! R8 j  s
debug
. y+ R5 G2 F, y) f

debug

debug
/ Z9 z- k+ t5 \
tim1
/ F% G- G  W& p. [, f* J2 O 02.PNG 0 `6 c$ b, k2 h" K
uart1
9 T0 Q& x2 `; w0 y- X 03.PNG / e- Y& H9 H, d5 W
时钟- Q4 |; L9 c5 e; H- F
04.PNG ) S+ w& h: S* G6 ^- y
uart1- [9 Z* k- F; {# y6 B7 x
05.PNG
7 t7 Y- z* g0 B3 o3 x, G$ uuart1+ k& G1 O- _% w* o- z8 f
06.PNG 1 }8 j6 ]3 d0 \5 e& _# ]
uart1
1 g% k. ^4 {. T/ h 07.PNG
/ i. L9 j. ^8 Dtim1
' ^, Z' b7 ?: `2 Y- r8 e 08.PNG
- W8 v& s$ v8 w! F$ A" ]9 ?% Rtim1
3 y6 G& E! @4 `3 N3 C 09.PNG
1 g. j; b: B7 k' [0 M2.main.h 添加串口接收最大值
  1. /* USER CODE BEGIN Private defines */$ D" n% e/ V- \2 P9 r& V  ]4 y
  2. typedef unsigned char        u8;
    - W% c. k. V( y# D0 m$ B- k
  3. typedef unsigned short  int u16;) I% K) k. ~! g" f  M
  4. typedef unsigned long       u32;
    ! f6 \' p, c0 N' v5 R  p+ V
  5. #define RECEIVELEN 16- w) h6 R  y7 f5 ?0 q
  6. /* USER CODE END Private defines */
复制代码
3.1 main.c添加
  1. /* USER CODE BEGIN Includes */2 N% \8 z) F6 D3 o9 s
  2. #include "string.h") L, O5 e# N9 k2 i# ?# o" p$ ~0 o
  3. /* USER CODE END Includes */
    ; C, a4 w# U4 u
  4. 2 {% T. _$ q7 {/ p: b5 c
  5. /* Private variables ---------------------------------------------------------*/0 M& M+ H6 j4 \/ a, i2 y$ a

  6. 6 x5 A3 t0 v) l" C  h' n
  7. /* USER CODE BEGIN PV */
    ' O0 S7 o, Y5 S
  8. /* Private variables ---------------------------------------------------------*/
    % [9 `7 ~! ^% l9 W1 a
  9. //uatr15 P: Y& U; q. u+ _. z7 \; k
  10. u8  uart1_Rx_flag;            //接收空閒標誌位
    6 G( h& h9 L  E7 p# o
  11. u8  uart1_Rx_Err;             //接收異常標誌位
    6 E3 @4 q  a  A( l4 t0 ]% N
  12. u8  uart1_Rx_Tem;             //接收異常計時重置接收
    , }5 E3 P- T5 m) A
  13. u8  uart1_RxBuff[RECEIVELEN]; //接收缓冲
    - ~2 x) O/ E  J, e* r, Y
  14. u16 uart1_Rx_Len;             //接收长度. Q: g- E: \! C
  15. /* USER CODE END PV */
复制代码
3.2 main.c添加
$ ~1 |) Y( u2 q- J6 K! L+ @  D
  1.   /* USER CODE BEGIN 2 */( C. V3 i* d) ^3 k3 M1 \
  2. //tim17 e2 q5 ]2 M) Y* Z* D
  3.   HAL_TIM_Base_Start_IT(&htim1);              //启用TIM1并使能其中断
    , {. I/ ~' Z( ~; [+ D% Q
  4. //uart1
    ) D  [4 \  G0 V+ B0 Q3 F$ h% y
  5.   HAL_UART_Receive_DMA(&huart1, uart1_RxBuff, RECEIVELEN);
    ! G' C& z  g, D! J
  6.   __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
    5 ]7 }' s4 c! s7 l
  7.   /* USER CODE END 2 */
复制代码
3.3 main.c添加接收处理
! t  U3 L2 b* l% v" l; p
  1.   /* USER CODE BEGIN 3 */7 E  J# f+ ]3 B# F
  2.     if(uart1_Rx_flag==1)4 E  @& b* K# _8 w5 z
  3.     {
    . w7 v' M+ I( f* s/ z
  4.       uart1_Rx_flag = 0;" h8 m( Q& m4 O0 Q: ^* S' k
  5.       uart1_Rx_Err  = 1;8 T* Q6 x# K0 O+ F6 u/ _
  6.       if(uart1_RxBuff[0] == 0 && uart1_RxBuff[1] == 1)
    & D4 ]7 Y( N" h0 ?
  7.       {% k* c5 f6 z3 S* }! Z! G1 E8 R
  8.         uart1_Rx_Err  = 0;9 l. w9 G2 u5 l  {0 x) [1 x. e! n; t
  9.         uart1_Rx_Tem  = 0;, \' s: v8 F  y; F( J! z, ?
  10.         
      l, ~# ^; q3 F
  11.         HAL_UART_Transmit(&huart1, (uint8_t *)&uart1_RxBuff, uart1_Rx_Len,0xFFFF);
    ; U6 @; i" b7 ^+ F7 x7 S5 G  B
  12.         memset(uart1_RxBuff,0x00,sizeof(uart1_RxBuff));                            //清空数组$ o' U+ |% z7 N, m
  13.       }) X4 u* O- c. q$ X' T+ m% v
  14.     }
    ; \. w. l9 T3 P
  15.   }1 J1 Y3 g1 `# n) @2 n9 I  t- a3 O
  16.   /* USER CODE END 3 */
复制代码
3.4 main.c添加溢出DMA重置" d9 y% `( K3 O' J- k* Y
  1. /* USER CODE BEGIN 4 */% F" ~4 Q- B- x+ U3 m
  2. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    ( `5 K# P6 B; Q/ x9 A0 |" c
  3. {. t( s. ?4 i1 z0 h
  4.   if (htim->Instance == htim1.Instance)
    $ G0 h. i7 ?# c! N* J4 [8 o: A& i
  5.   {8 a- V* I% V. H. m5 ]# Y
  6.     if(uart1_Rx_Err==1)% w; r) \+ h8 A
  7.     {
    + f( l0 q# j; f& e% w+ w! U9 F2 e8 a) I
  8.       if(uart1_Rx_Tem++ >=10); k( m# E( _1 s; G
  9.       {
    - J, z: E/ H- D
  10.         uart1_Rx_Tem    = 0;- n' I' O. D0 N8 Y/ ^
  11.         uart1_Rx_Err    = 0;
    : N+ E$ v1 E5 b* l
  12.         __HAL_UART_CLEAR_IDLEFLAG(&huart1);
    : h0 r" `- I) W7 b2 t
  13.         HAL_UART_DMAStop(&huart1);
    ! t2 d1 d2 A4 N2 U8 l
  14.         HAL_UART_Receive_DMA(&huart1,uart1_RxBuff,RECEIVELEN);& ?$ E" X5 x2 d2 |7 K6 a# s
  15.       }
    1 N4 G0 S: m# W. w4 L2 U( r; u
  16.     }
    4 }$ O" w! q/ e. j$ b
  17.   }
    8 l; r% J! {) n/ c7 o
  18. }
    - g, |& {9 ~( b5 ?/ H# z% a, Z
  19. /* USER CODE END 4 */
复制代码
4.1 stm32f0xx_it.c添加
* n% [2 y; s; T7 I1 l
  1. /* USER CODE BEGIN 0 */. P! c6 w' w# q8 @
  2. extern  u8  uart1_Rx_flag;            //接收空閒標誌位
    0 L1 M2 f, Z) E4 z: w& j
  3. extern  u8  uart1_RxBuff[RECEIVELEN]; //接收缓冲) {$ g8 ?: K  x9 ~$ `4 v
  4. extern  u16 uart1_Rx_Len;             //接收长度
    7 f* P/ f) |/ u
  5. /* USER CODE END 0 */
复制代码
4.2 stm32f0xx_it.c添加
( V  @6 n" O" G# O8 I
  1. void USART1_IRQHandler(void)
    2 d9 p5 ~: |2 v5 i9 n7 }
  2. {
    7 W* u# Y* j) d, n8 a: N. w  _& ]
  3.   /* USER CODE BEGIN USART1_IRQn 0 */
    $ U8 Q: c4 J( f5 k7 x5 e" w# f  B5 U
  4.   uint32_t temp;. c! {; f7 u% h" ~2 e3 v
  5.   if((__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE) != RESET))
    $ L8 k% S# ?' W/ z
  6.   {* o' h$ I; x' A' S
  7.     uart1_Rx_flag = 1;
    4 i9 p& [0 V& F. X; `+ m
  8.     __HAL_UART_CLEAR_IDLEFLAG(&huart1);2 x5 t; v6 q# I, ?* e/ ?' \/ y6 R
  9.     HAL_UART_DMAStop(&huart1);
    + K2 @2 F3 m. [3 m1 S1 ]
  10.     temp = huart1.hdmarx->Instance->CNDTR;
    - m- [& F+ ~& A2 n( e( z
  11.     uart1_Rx_Len  = RECEIVELEN - temp;
    / k; v; o( @+ t- d
  12.     HAL_UART_Receive_DMA(&huart1,uart1_RxBuff,RECEIVELEN);
    / t6 j* O1 _0 K0 N" Z3 Q, ^) m) ]
  13.   }
    % e# x# n* a5 e  l
  14.   /* USER CODE END USART1_IRQn 0 */
    4 t1 f' M" N3 Z% E5 ]5 ?& h& C3 Y
  15.   HAL_UART_IRQHandler(&huart1);) E9 c* q! p* p0 b
  16.   /* USER CODE BEGIN USART1_IRQn 1 */  H* ], p2 z; `6 j/ O

  17. / R) X, U% m. C, X4 Q2 p$ D; d( V$ d
  18.   /* USER CODE END USART1_IRQn 1 */
    " v9 l: t8 O8 j; {3 I/ x5 J
  19. }
复制代码
* g6 {: P/ ?7 k2 ?6 T, M
( k/ }+ e6 V3 x. n

7 i% d4 s' J( n# \- G3 n测试代码 UATR.rar (832.17 KB, 下载次数: 46)
赞 收藏 1 评论0 发布时间:2019-5-17 14:06

举报

0个回答

所属标签

相似技术帖

官网相关资源

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