|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
碰到一个问题,请教各位大侠:在使用DMA发送UART的时候,需要等待上一次发送完成后,才能进行下一次发送。但是出了问题了。& b/ R' L8 e& @# h! A' h
这是测试代码:2 X2 V d Z2 D$ o0 J
UART1_User = DMA0_Use_UART1;//设置UART1为DMA在使用
M( ^/ c( E: \3 M" N" W7 L SYSUARTAPP = true ;//UART1在使用状态) {$ {! [+ B: d: v
SendCCDMA(C_SysInf);//DMA发送数据7 s" R8 U6 m3 ?' A: p
U1TXREG = 0x58;//完成DMA设置(此时没有完成发送),发送一个"X"作为标志& y; I* K. ^* \
while (SYSUARTAPP ){}//等待发送完成, u8 T/ l. H# F' u: o* l
U1TXREG = 0x59; //发送完成后再发送一个"Y"作为标志1 j* H0 @6 s! c+ ~ l
8 B& _4 E; T+ Q- f+ F! F' W& r1 M4 v& o' j+ V+ e$ K+ o& r# W7 H
DMA中断程序:
+ j$ a- J4 ?- Avoid __attribute__ ( ( interrupt, no_auto_psv ) ) _DMA0Interrupt ( void )( V) k: O f+ E5 |
{% d: }5 @ y. t7 G# g
IFS0bits.DMA0IF = 0;//清除DMA0中断
1 Q; k: p$ L' c6 l/ A# H1 z if (DMAINT0bits.HALFIF == 1) //半满中断
# x/ b2 k8 d$ }8 g& U {
" R$ Q( U z$ j8 s DMAINT0bits.HALFEN = 0;//下次全满中断$ A/ d* ]; u% b$ i& [
DMAINT0bits.HALFIF = 0;//清除半满中断标志+ g( @, b& c/ e8 Y9 ^
}
4 ? Y' m, o5 U# N. _% G c5 B else
) C4 T, V! P1 M9 g# Q {' C, Z* s- g0 W) \$ ]
UART1_User = 0 ;//结束DMA使用UART1状态
8 a2 O) R' H1 F! p" w% { SYSUARTAPP = false ;2 k& O0 L$ s" T1 n: x
DMACH0bits.CHEN = 0; //关闭DMA0中断+ i9 s! R2 z9 J" X _! g! ?. R; n
// DMAINT0bits.HALFEN = 1;//下次半满中断
- r; G$ Y5 m8 g% e- U; x U1TXREG = 0x38;4 j3 A5 j6 r/ f& n0 m3 S
U1TXREG = 0x38;
5 c: ?7 N, S; d0 i U1TXREG = UART1_User;
" d) I! Z8 F C1 d6 w' z: |$ r U1TXREG = 0x38;, H! D% p4 V2 w& W& G8 _
}
' n& w6 s6 D& z& A6 Z- s; \) t2 E5 T}
$ ^0 c8 Y" z H. _: o4 }! B) X7 X* m; ~
l# z) q3 y$ U* y+ W可以看到,在DMA完成全部发送的时候,将UART1_User 设置为0,代表DMA使用UART1完成了,不再占用,同时设置了SYSUARTAPP为fales,也代表了UART1空了。同时还输出了四个字符作为标志,标志确实完成了DMA。# P, o4 K! C8 s# ?( l5 i' Y9 h
然后结果是这样的:
2 X8 E( w& g% U" i1X973312021Echo0020211188*8( k: H% ]5 J |# Q) j5 B
可以看到x发送成功了,代表了DMA发送成功,进入到了等待发送完成状态,同时最后也出现了标志DMA完成的四个字符,代表发送完成了,也就是说UART1_User 设置为0,SYSUARTAPP为fales,这两个设置设置都过了。但"Y"没有出现,也就是说这个while (SYSUARTAPP ){} 没有出来?啥情况呢?: l' M2 x: ]. |
这两个标志最后加的,程序其他地方没有也检查过了,不会有其他地方改变它们。我试了很多次了,原来就用UART1_User作为判断标志的,后来不行,没办法再加个布尔型试试,但还是不行。我这编程水平有大问题了么?急急急
. x% X* F2 C+ Y' r G |
|