|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
STM32 UART串口在中断中不能循环接收数据帧的问题* l, F6 a# R* [8 N# W) ?
+ U6 \: v. D" w6 s( c
, y* g. J7 p$ s
我要用STM32的串口接收一帧这样类型的数据:01 xx xx xx xx xx xx xx FD 6 I8 y6 f6 d$ [
这个数据长度不超过30个,结束字节是FD(数据里面没有FD)。我的程序设计是这样的,当接收到串口数据后进中断处理,循环接收数据,直到接收到的数据是FD就退出中断(中间断接收超时处理)。程序思路如:进中断后,关闭接收中断,通过读取USART_FLAG_RXNE标志来接收数据。我现在遇到的问题是在中断中不能根据USART_FLAG_RXNE标志来完成数据阿帧接收,
- G7 D8 B, _. R' y B- z, e4 Y7 r! |7 c4 T1 A
不知道为什么啊?代码如下:
" r2 F% m0 ^# g8 }: x, _5 Vvoid Systick_Handler(void)
9 H @( k6 x5 K# R{
1 T( D; v4 {) E7 W. \" v if (TimingDelayBuffer != 0x00)
+ t8 f& V1 O2 _ { " F3 I3 t5 m/ w, }* l1 L
TimingDelayBuffer--;, z& y+ n: u& f- u5 ~* T- t4 `* ?
}; E8 V+ V% W9 j( H3 _7 r5 b
}
# o6 ^7 Z5 a4 S' j3 A
& h, f _3 y4 w7 Z" R+ [' G/ y; fvoid USART1_IRQHandler (void)
# m6 L t# n _{; E, m: I7 z" t8 J4 z, L5 y
unsigned char i = 0;
! L# W! e2 M# K, Q9 n* ?( B9 N( o# d) e4 G! R0 b% w( S [2 h
if (USART1->SR & USART_FLAG_RXNE) // read interrupt3 f2 K: `7 `; i# k2 _: H: c
{
, S+ V4 ]5 Y. V: h( }6 m( w USART1->CR1 &= USART_FLAG_RXNE; // Disable the USART Receive interrupt
3 y" Y1 f1 J; i3 _% @8 k# ?8 p $ q. w0 K# i" ~1 U% D9 `
RxCounter = 0;
% L0 {7 A. k# J' M RxBuffer[RxCounter++] = ((int)(USART1->DR & 0x1FF));
6 p2 \5 |+ j( [8 L0 k! B& [ USART1->SR &= ~USART_FLAG_RXNE; // clear interrupt flag
& `7 m+ [4 s7 D9 Y1 O
1 N$ B; p. w, K T0 h for (i=0; i<30; i++)
4 M3 T+ @, Z8 d4 p- D+ C {
. C/ ?. _! I) M& V J6 g3 Z- l0 k SysTick->CTRL |= SysTick_Counter_Enable; //允许计数//用SysTick做的一个定时器。" ?& f1 ~& B) m- @
TimingDelayBuffer = 1000;
a* r9 M2 t6 E9 |/ i q# P. o: ~0 M! p
while (!(USART1->SR & USART_FLAG_RXNE)), X- G9 Z1 O$ p9 J$ l/ o% a
{
. z3 J6 s) N5 a* d5 o if (TimingDelayBuffer == 0) //定时一秒没有数据就退出- g6 r/ Z+ u9 k* N
{
! `( g$ J5 Y( e$ \& A USART1->CR1 |= USART_FLAG_RXNE; //Eneble the USART Receive interrupt 8 f4 O* ~9 Z U+ A$ H6 v$ M
return;& C! M1 ]3 u# z. e$ A6 N M
}7 E M8 n/ u; h4 M9 g+ u9 T
# E5 N( Y4 {, O% q) [ }
2 c( D, U. \& I
$ R( J4 I# k# T3 I f* @7 r SysTick->CTRL &= SysTick_Counter_Disable; //禁止计数
& t! v* B' e0 K# E+ V SysTick->VAL = SysTick_Counter_Clear; //计数器清0
2 f4 z8 |" ?5 `6 d$ _9 J
9 Q8 |( B; e# z5 \: R. h1 ] RxBuffer[RxCounter] = ((int)(USART1->DR & 0x1FF));/ c! B6 F. p- M; t
USART1->SR &= ~USART_FLAG_RXNE; // clear interrupt flag1 K- V! T, x" L
% x" k5 {1 L( T0 i8 M! E6 P4 [' \ if (RxBuffer[RxCounter] == 0xFD)
2 J8 ^1 b# p* l( t$ d/ D {
* P( B% C! |5 C+ D+ D8 f RxdDisposeFlag = 1;
: Y6 a0 R6 A' F return;& J! x* F3 m' o$ C8 j6 ^, B7 C
}) H3 N: r& x( F5 Q8 `" _ ~# ?
& \& }' {1 g$ Z* d: K! l* d' {
RxCounter++;
( ]- r9 l+ n3 _ x }( L F( ^: s3 P
* Y1 \0 M# \5 y7 k
USART1->CR1 |= USART_FLAG_RXNE; //Eneble the USART Receive interrupt % m7 t5 ^8 M: O7 w6 e3 x
}
- t. I2 i: }. P9 E8 b7 R}
7 p5 K5 a1 u$ M7 {
p. Y. f$ p! g& q! Q6 s8 H- ] |
|