|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
STM32 UART串口在中断中不能循环接收数据帧的问题) S j# Q* L/ l; D2 i9 ~% U# |
2 e6 E+ W# P4 A; p7 P3 j! }2 O+ h# Y; b; ^4 L8 ~) ]9 U" O
我要用STM32的串口接收一帧这样类型的数据:01 xx xx xx xx xx xx xx FD 9 X) b, d8 ]) Q9 n: R* Q
这个数据长度不超过30个,结束字节是FD(数据里面没有FD)。我的程序设计是这样的,当接收到串口数据后进中断处理,循环接收数据,直到接收到的数据是FD就退出中断(中间断接收超时处理)。程序思路如:进中断后,关闭接收中断,通过读取USART_FLAG_RXNE标志来接收数据。我现在遇到的问题是在中断中不能根据USART_FLAG_RXNE标志来完成数据阿帧接收,
- H' [ f: T2 k4 ~: v& r+ I8 p
% t0 E/ L" l, q不知道为什么啊?代码如下:
0 C5 h& G& s1 U: D0 ?void Systick_Handler(void)
" p) p0 R1 V9 y+ L: b" d6 k; H6 Z: V& t{
- U1 j9 \) y6 Y T" q if (TimingDelayBuffer != 0x00)( a6 r+ S* W: ]5 l" G
{ . q0 q' i6 k9 q+ W$ l8 H; w6 o+ y
TimingDelayBuffer--;6 j( z5 I3 h0 o
}1 ^) Y1 L6 }) U! Z, S( f. e
}
5 n2 p- ]3 e; \" M2 H
3 u$ j! ]5 o) q1 N2 O$ zvoid USART1_IRQHandler (void) * F1 `6 I) ~) Q. Z
{3 Q+ q+ }' d3 X% ^" Q7 s. R
unsigned char i = 0;) Z* m. w' G8 C3 t. L5 j
5 x; v/ A- Y% T* |( x1 ^9 V
if (USART1->SR & USART_FLAG_RXNE) // read interrupt) a/ j, J- ^# n: n' j7 V
{
8 h4 n" I( [4 v0 z2 [% e, j; A USART1->CR1 &= USART_FLAG_RXNE; // Disable the USART Receive interrupt4 S$ U J+ O( X/ z- Y9 |+ W, x
6 F1 U k1 h& Y3 J; z- @
RxCounter = 0;2 y9 I5 A6 N3 l9 j7 {3 K& R1 w
RxBuffer[RxCounter++] = ((int)(USART1->DR & 0x1FF));
! k& l" T2 o( ~! v. C& _2 B8 p2 [9 b USART1->SR &= ~USART_FLAG_RXNE; // clear interrupt flag$ K: c' P, W: C# b7 ^$ H
9 B' k1 N0 ?; E, S' R for (i=0; i<30; i++)
8 S/ P# c- Q/ p9 O {5 s8 `; r8 Y$ E( D6 T
SysTick->CTRL |= SysTick_Counter_Enable; //允许计数//用SysTick做的一个定时器。
9 x- R- D0 O" A- b {, R6 d TimingDelayBuffer = 1000;6 |; y, F: j2 s3 a
# c1 U5 T9 M( A; @: l
while (!(USART1->SR & USART_FLAG_RXNE))
* j4 J8 D) `" T% A" `8 O3 I {, o; a: U) f+ s
if (TimingDelayBuffer == 0) //定时一秒没有数据就退出
( d4 Q3 I( ~& _% G {
; s- f& }+ h' O7 u USART1->CR1 |= USART_FLAG_RXNE; //Eneble the USART Receive interrupt
9 h5 d/ r! v4 V5 }' o return;
3 S7 s- e1 j1 }) W }' n1 d; [/ |9 N0 d3 G% H @( b
' |$ e. B9 D* Y' H* W" t8 ]& w
}1 b! y% I" [* d$ I- a% k) [
3 C1 Y, Y/ F% \* U0 }3 F SysTick->CTRL &= SysTick_Counter_Disable; //禁止计数
- o7 m! r; g. Y SysTick->VAL = SysTick_Counter_Clear; //计数器清0' W$ \/ ?3 A' T! v3 l
9 N6 K" `- G. j* ~2 y+ ? R3 p
RxBuffer[RxCounter] = ((int)(USART1->DR & 0x1FF));
3 F& |. ~, l) y0 W USART1->SR &= ~USART_FLAG_RXNE; // clear interrupt flag
/ C' s6 q" j6 N# x5 I8 o. q, t/ H3 W
4 B" ~$ B# h+ i1 {' _ if (RxBuffer[RxCounter] == 0xFD)2 {7 U/ w0 {- s/ t ~- \
{7 G% {$ n9 \- \) N1 u. G; @
RxdDisposeFlag = 1;
/ p7 ^" R6 s. J* I return;
& v" \. a- E* ^' M, A8 ?' T }
3 n8 h4 n- I* a
. F) U2 m! ]/ K- W. D6 S RxCounter++;$ }: Z9 b# p% D4 {
}( l6 n+ H8 r( z0 \! }
. ], A! n' i) r/ C& H USART1->CR1 |= USART_FLAG_RXNE; //Eneble the USART Receive interrupt / o* t2 i k3 |. S
}
. X0 J+ l- [7 | ^/ G( Y}5 P: U7 O4 L$ G0 C" L/ }5 g9 l
* Y7 C# |% I& g |
|