|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
碰到一个问题,请教各位大侠:在使用DMA发送UART的时候,需要等待上一次发送完成后,才能进行下一次发送。但是出了问题了。
3 N6 d8 F) x! g9 I这是测试代码:& P( k* B# s( t X8 @- z
UART1_User = DMA0_Use_UART1;//设置UART1为DMA在使用
: |7 d' f4 x6 ^+ E3 g$ [& B9 b/ A SYSUARTAPP = true ;//UART1在使用状态
5 W5 d% L) O; q* v) N SendCCDMA(C_SysInf);//DMA发送数据
8 Q6 d) S" O" q+ a3 @+ G U1TXREG = 0x58;//完成DMA设置(此时没有完成发送),发送一个"X"作为标志
4 f/ f0 a7 Q+ P0 w& r while (SYSUARTAPP ){}//等待发送完成# {* X' ~/ S2 d
U1TXREG = 0x59; //发送完成后再发送一个"Y"作为标志+ q5 V" ?/ i5 S, Z9 e/ V
3 k" X8 i6 L/ c. z& y K4 B
1 p2 L# ^8 T, b& C7 q! n: a, W7 R) a9 vDMA中断程序:
; L; g2 y9 E+ y ~void __attribute__ ( ( interrupt, no_auto_psv ) ) _DMA0Interrupt ( void )# \ s) T5 ?! \1 L: l+ |
{, ~' z' W; F) W3 I3 `2 x3 g
IFS0bits.DMA0IF = 0;//清除DMA0中断( n/ n( ~0 n) I: l/ u
if (DMAINT0bits.HALFIF == 1) //半满中断
l! C5 z1 N3 @, O- F {
! Q* g- N9 h- L1 v; ^% h DMAINT0bits.HALFEN = 0;//下次全满中断
% q' T3 x9 Y5 `/ s+ L! B4 ] DMAINT0bits.HALFIF = 0;//清除半满中断标志
3 j# z( K& a, R& a, d }
- S3 U7 R1 ]6 g else
- x) }' K5 X/ p+ \/ {7 g8 |7 U4 v {, g& P& }& u" L$ O- q
UART1_User = 0 ;//结束DMA使用UART1状态
' U' c) @6 ?3 a& A, @/ b* p1 ?. g SYSUARTAPP = false ;
+ h2 F% f$ Y" B. ]) x. s DMACH0bits.CHEN = 0; //关闭DMA0中断( W. e- d7 |$ _% @+ ^$ e" v; ~* V1 I8 ?
// DMAINT0bits.HALFEN = 1;//下次半满中断% w$ c0 \: s( Z$ l% c$ S
U1TXREG = 0x38;1 I0 B. h! M% \! g4 R# @
U1TXREG = 0x38;1 p7 y' M9 y- i1 l7 y& t
U1TXREG = UART1_User;
: U- W! N+ }. i* C U1TXREG = 0x38;
' k0 [7 d# @6 K) H1 ^( B, l }
7 \+ r2 E. z# d6 G3 ^3 x# ?1 C}4 j( B/ G R4 @$ Q& S: {5 T; \& v
1 g G8 U* C! ~" a1 x6 y可以看到,在DMA完成全部发送的时候,将UART1_User 设置为0,代表DMA使用UART1完成了,不再占用,同时设置了SYSUARTAPP为fales,也代表了UART1空了。同时还输出了四个字符作为标志,标志确实完成了DMA。
0 k2 C% f- }2 i* Y然后结果是这样的:
5 S! o6 d- G5 M5 [, w& B" z& B1X973312021Echo0020211188*84 b: {/ j4 z i' T% o8 A6 L" g2 ?
可以看到x发送成功了,代表了DMA发送成功,进入到了等待发送完成状态,同时最后也出现了标志DMA完成的四个字符,代表发送完成了,也就是说UART1_User 设置为0,SYSUARTAPP为fales,这两个设置设置都过了。但"Y"没有出现,也就是说这个while (SYSUARTAPP ){} 没有出来?啥情况呢?
$ `6 Y4 w; L+ K6 Z6 a/ E这两个标志最后加的,程序其他地方没有也检查过了,不会有其他地方改变它们。我试了很多次了,原来就用UART1_User作为判断标志的,后来不行,没办法再加个布尔型试试,但还是不行。我这编程水平有大问题了么?急急急
+ p! }- X- e8 [" d, w% n2 H5 Y9 i+ D |
|