|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
碰到一个问题,请教各位大侠:在使用DMA发送UART的时候,需要等待上一次发送完成后,才能进行下一次发送。但是出了问题了。1 t& L- N# W6 g* k ^- _; U- z
这是测试代码:
4 V& g6 N5 o# B5 R UART1_User = DMA0_Use_UART1;//设置UART1为DMA在使用
- e) U$ w1 ~- z6 t& g+ \# ]6 p4 ? SYSUARTAPP = true ;//UART1在使用状态% p, j0 }: P2 o
SendCCDMA(C_SysInf);//DMA发送数据; }1 f7 k4 n0 G1 e
U1TXREG = 0x58;//完成DMA设置(此时没有完成发送),发送一个"X"作为标志# ~. j0 D7 q6 ]( D4 a/ g u% F
while (SYSUARTAPP ){}//等待发送完成
7 c I& S; s* S: x3 r% S& U U1TXREG = 0x59; //发送完成后再发送一个"Y"作为标志. F7 r9 H5 U! U$ }; g4 J8 ]
: p. V8 T' F3 G9 p# h8 ]; k" s8 v; Q0 f0 n! B+ \
DMA中断程序:
/ N& y7 O. ?# Evoid __attribute__ ( ( interrupt, no_auto_psv ) ) _DMA0Interrupt ( void )
" i0 W4 p6 _% \; [{: s- F" ~$ }4 T' D2 d) `7 \5 \: F- \
IFS0bits.DMA0IF = 0;//清除DMA0中断
, d g: `! t& `8 _( V$ ` if (DMAINT0bits.HALFIF == 1) //半满中断
" o p# y3 C: p( C6 J. z {+ P3 s) P2 @6 ]0 p* B& ?" |
DMAINT0bits.HALFEN = 0;//下次全满中断/ ]2 M' h. m; j5 C
DMAINT0bits.HALFIF = 0;//清除半满中断标志
: Y) c( @9 r2 g* O: R" r* Y* ? }
) W1 n1 C- [$ b. _$ D, ~ else4 }$ u+ e, m- d2 |$ L+ `
{: U d: \( M7 T$ b) [$ z
UART1_User = 0 ;//结束DMA使用UART1状态
# T/ d7 ^* t" O" \" C SYSUARTAPP = false ;9 |$ J8 r# {1 Z: |8 D/ s- S
DMACH0bits.CHEN = 0; //关闭DMA0中断, t- z6 G9 L' ^: }( y3 k
// DMAINT0bits.HALFEN = 1;//下次半满中断8 _: _5 l7 T# I/ S3 D2 C
U1TXREG = 0x38;7 W$ A7 H0 {$ l) r
U1TXREG = 0x38;
; ]5 o( u% m$ d: B2 e U1TXREG = UART1_User;
% I- E' Y) o4 H0 Z3 i1 Q6 k* e* m T U1TXREG = 0x38;) i+ Y, x; Q6 x; {+ m. A
}
8 S+ a9 `" N' |* Z/ W}
" m' l6 u: W4 x0 H/ F; h) {1 ^2 n# ^; c4 y
可以看到,在DMA完成全部发送的时候,将UART1_User 设置为0,代表DMA使用UART1完成了,不再占用,同时设置了SYSUARTAPP为fales,也代表了UART1空了。同时还输出了四个字符作为标志,标志确实完成了DMA。" i) X1 l8 w: _; ]& |
然后结果是这样的:1 B) |+ _# l- ^. S& M* ^
1X973312021Echo0020211188*8$ v8 V. s3 I" c r4 I4 K% L
可以看到x发送成功了,代表了DMA发送成功,进入到了等待发送完成状态,同时最后也出现了标志DMA完成的四个字符,代表发送完成了,也就是说UART1_User 设置为0,SYSUARTAPP为fales,这两个设置设置都过了。但"Y"没有出现,也就是说这个while (SYSUARTAPP ){} 没有出来?啥情况呢?
" C5 `! v! b- H% y这两个标志最后加的,程序其他地方没有也检查过了,不会有其他地方改变它们。我试了很多次了,原来就用UART1_User作为判断标志的,后来不行,没办法再加个布尔型试试,但还是不行。我这编程水平有大问题了么?急急急
) ^8 M+ f/ r6 w8 C" q: l! r7 F |
|