|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
碰到一个问题,请教各位大侠:在使用DMA发送UART的时候,需要等待上一次发送完成后,才能进行下一次发送。但是出了问题了。, S# A2 B7 O6 j' I1 ]. O
这是测试代码:
2 D3 W" s% ]( C4 ] UART1_User = DMA0_Use_UART1;//设置UART1为DMA在使用2 X f: N) p& C- ?/ \- i
SYSUARTAPP = true ;//UART1在使用状态' i V8 U4 d% A" P: Z$ p5 ?
SendCCDMA(C_SysInf);//DMA发送数据0 l% s- o3 F) C9 s& g7 l
U1TXREG = 0x58;//完成DMA设置(此时没有完成发送),发送一个"X"作为标志
# S, g5 u1 X! S! N+ b) u while (SYSUARTAPP ){}//等待发送完成7 t: S! I, x8 M8 D+ B# ~! d% \3 q
U1TXREG = 0x59; //发送完成后再发送一个"Y"作为标志! S% q9 ?$ Y8 ^
4 Z1 k- X3 t# {
, `; t. v' p @; t' Z; q' j
DMA中断程序:
7 @3 e/ P" Y# c8 z3 g; V4 e% Gvoid __attribute__ ( ( interrupt, no_auto_psv ) ) _DMA0Interrupt ( void )3 ?$ A# u1 v! I5 g
{+ a+ V( K9 D$ p8 f+ N
IFS0bits.DMA0IF = 0;//清除DMA0中断/ b, r8 H+ K& e0 p' l; }. R
if (DMAINT0bits.HALFIF == 1) //半满中断/ l# P/ ]4 F) B6 n* B% f
{
3 I' ]% W# Z: U* Z- ~: ]7 }% Y; t DMAINT0bits.HALFEN = 0;//下次全满中断
, P: W4 b& D: @ DMAINT0bits.HALFIF = 0;//清除半满中断标志
. {4 r4 Q- W$ M0 V }
4 B4 }) z+ {- _% q! d# t2 e else
9 Q4 t1 i2 {2 u; U0 r {3 G- ~6 n6 @) G/ l- L
UART1_User = 0 ;//结束DMA使用UART1状态& h; T' A# d8 ?8 c4 F7 ?; V
SYSUARTAPP = false ;$ k [' `- `! H. o/ w
DMACH0bits.CHEN = 0; //关闭DMA0中断
# H/ i4 o- a' D) U// DMAINT0bits.HALFEN = 1;//下次半满中断
1 s1 W5 x& r5 `, X* R3 ~ U1TXREG = 0x38;
# }# r) R; n) z: i G& T ^ U1TXREG = 0x38;
0 j8 ^; ?3 P* I G9 G U1TXREG = UART1_User;- X; W0 h$ m9 L$ ~0 S6 h2 D
U1TXREG = 0x38;8 ]% y/ B- J$ q; U6 ?9 Z5 T1 m
}
+ R2 |7 C) R' F4 `7 e' ^% T4 @}
3 c$ d5 k1 c- `) m9 A5 Y
: B0 C) p9 w) y# X/ Q可以看到,在DMA完成全部发送的时候,将UART1_User 设置为0,代表DMA使用UART1完成了,不再占用,同时设置了SYSUARTAPP为fales,也代表了UART1空了。同时还输出了四个字符作为标志,标志确实完成了DMA。
6 N5 X/ V, w# k" {5 R2 P9 s然后结果是这样的:
+ B( H* H( P# c3 o8 A9 W' m {* j1X973312021Echo0020211188*8
5 o* ?0 f1 _- m9 f! m' K. ?2 T可以看到x发送成功了,代表了DMA发送成功,进入到了等待发送完成状态,同时最后也出现了标志DMA完成的四个字符,代表发送完成了,也就是说UART1_User 设置为0,SYSUARTAPP为fales,这两个设置设置都过了。但"Y"没有出现,也就是说这个while (SYSUARTAPP ){} 没有出来?啥情况呢?+ i* H O& M, i8 j/ J4 v5 R
这两个标志最后加的,程序其他地方没有也检查过了,不会有其他地方改变它们。我试了很多次了,原来就用UART1_User作为判断标志的,后来不行,没办法再加个布尔型试试,但还是不行。我这编程水平有大问题了么?急急急
5 S& ` U: d5 T1 @( E |
|