|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
STM32 UART串口在中断中不能循环接收数据帧的问题5 l& w/ Z K( |% H/ G
9 H3 C" u- g. K/ o& N% X* K$ m8 o, u' @3 ?; U5 r
我要用STM32的串口接收一帧这样类型的数据:01 xx xx xx xx xx xx xx FD # h6 s; ~$ I+ R/ O( d
这个数据长度不超过30个,结束字节是FD(数据里面没有FD)。我的程序设计是这样的,当接收到串口数据后进中断处理,循环接收数据,直到接收到的数据是FD就退出中断(中间断接收超时处理)。程序思路如:进中断后,关闭接收中断,通过读取USART_FLAG_RXNE标志来接收数据。我现在遇到的问题是在中断中不能根据USART_FLAG_RXNE标志来完成数据阿帧接收, t3 e! ]' f. M% f
3 {' [. X0 P F3 D% z8 W/ {不知道为什么啊?代码如下:
# i! n/ U, s% B1 C) O, e# n2 P. k6 v" uvoid Systick_Handler(void)
# s1 C' Z% |6 i& _+ x% g6 ~$ n{7 ]9 `0 d3 [ P0 W0 J
if (TimingDelayBuffer != 0x00)
; s4 @/ i+ Q6 M9 R { _ o9 {1 Z% k
TimingDelayBuffer--;
3 ]" u! H, d2 P; D9 j( c6 I4 o }
3 t3 I. T- i7 D}1 t: m5 y' _# [; j
0 W* i# V; h8 K6 x: l/ Tvoid USART1_IRQHandler (void)
0 g# s# `" H Y7 A3 u; L" d{' z1 L* b) ?" \& u+ Q( S1 {
unsigned char i = 0;
, z" P# }, [, t* ~! q% \5 j% N) F% U
if (USART1->SR & USART_FLAG_RXNE) // read interrupt
* M6 J c' a0 l0 j' a {: s6 e3 N3 L" R" T K- T5 c1 v
USART1->CR1 &= USART_FLAG_RXNE; // Disable the USART Receive interrupt
; C/ j# T( m+ j8 t : T2 [+ ?# M6 m6 }' k6 D0 Y. l
RxCounter = 0;
& X( W& n1 ]2 x RxBuffer[RxCounter++] = ((int)(USART1->DR & 0x1FF));
4 S9 W* G0 {" k USART1->SR &= ~USART_FLAG_RXNE; // clear interrupt flag
) H# |+ B4 ], L, Y- B' S& f
( y. j$ u7 b% C4 B6 o for (i=0; i<30; i++)* D( G! @$ g& F, v3 v1 C( m
{
3 c/ h h' E% L `* x% r0 B: z SysTick->CTRL |= SysTick_Counter_Enable; //允许计数//用SysTick做的一个定时器。
; A4 M( m' f: d |; f, U TimingDelayBuffer = 1000;" b/ a* y+ z/ G% W6 m0 A/ T j, E
8 Y% R& ~! a* E+ v; l while (!(USART1->SR & USART_FLAG_RXNE))
! v3 e9 Q( x2 a/ Q3 s r8 K3 B$ Q {
8 `- K# x3 [5 O8 @. X if (TimingDelayBuffer == 0) //定时一秒没有数据就退出. I/ h3 V* s, j5 O0 }5 {( d
{
) e# X- W7 ?7 [2 R9 T USART1->CR1 |= USART_FLAG_RXNE; //Eneble the USART Receive interrupt
" f+ f" q+ R. F/ f return;
( G9 ~( Q, \1 f J" V }
& S: K+ v9 z* k, W4 e. B 1 W1 J- B* V% Z# |
}: W, |% t7 L. q5 ?
6 l. j# J3 z5 g6 Z( U SysTick->CTRL &= SysTick_Counter_Disable; //禁止计数0 v: Y( Z; K! N" l# J3 K: z9 `
SysTick->VAL = SysTick_Counter_Clear; //计数器清0# q5 m% r k2 j- C2 Y
3 b4 v1 S0 j2 p/ ~ W t. I4 e RxBuffer[RxCounter] = ((int)(USART1->DR & 0x1FF));
8 C# E7 T4 [# j0 E USART1->SR &= ~USART_FLAG_RXNE; // clear interrupt flag5 ?, O4 f% [; i A% v! E8 w
- h& s( j; j$ ]
if (RxBuffer[RxCounter] == 0xFD)& O6 N- j s$ z2 @! M- @* k
{
$ o1 n( ^; ^- n RxdDisposeFlag = 1;3 c3 D$ H4 {1 k
return;3 T; b# F" K9 D6 g$ D E
}. O, h+ h" f4 S& Y' {
# O3 B& }, {; e3 M6 b+ J
RxCounter++;
; w9 I# J( u1 V3 K8 R }( \& [& i2 b. O+ i
5 B& g& E) H& }+ Z) H" l- y" ^ USART1->CR1 |= USART_FLAG_RXNE; //Eneble the USART Receive interrupt
. |- b) @! G! N }& W% H5 v# F$ C1 m h
}
9 ]! h+ p0 w; ^( Y" f4 k/ S
7 ^; n- V) F$ @& n( w i8 M8 ]6 { |
|