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