|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
碰到一个问题,请教各位大侠:在使用DMA发送UART的时候,需要等待上一次发送完成后,才能进行下一次发送。但是出了问题了。
5 Q! v" z/ \9 q, f5 D& F% m这是测试代码:9 K9 s' i- J" N1 {4 I* U3 |( p! O# r1 y
UART1_User = DMA0_Use_UART1;//设置UART1为DMA在使用
; B. u: J: X; q% Z5 _; q SYSUARTAPP = true ;//UART1在使用状态
8 v- o6 T" o+ Q SendCCDMA(C_SysInf);//DMA发送数据
; s) M) s: \3 Y% G4 p' G1 A U1TXREG = 0x58;//完成DMA设置(此时没有完成发送),发送一个"X"作为标志
6 j6 N2 w, {! W7 ^) y while (SYSUARTAPP ){}//等待发送完成
6 G7 h! k' r( \; R4 T& [" s) B U1TXREG = 0x59; //发送完成后再发送一个"Y"作为标志! L) b6 Z( V( s$ k
j3 l( Y; L; H i) h
4 s: @2 c/ Y ^& i
DMA中断程序:+ p+ |5 o1 _2 g* X4 g
void __attribute__ ( ( interrupt, no_auto_psv ) ) _DMA0Interrupt ( void ) ]/ K: f+ p8 i+ s! z
{" _( h" t4 N M; D4 H
IFS0bits.DMA0IF = 0;//清除DMA0中断) ], z1 e! v( E$ \
if (DMAINT0bits.HALFIF == 1) //半满中断
: m$ O; O& x4 G, o: ~% ^/ n1 { {
% _* N/ B2 J. ^1 M7 O DMAINT0bits.HALFEN = 0;//下次全满中断
7 [- v1 X$ ~, b: L# Q* x; o- P DMAINT0bits.HALFIF = 0;//清除半满中断标志2 N) |, A1 i% O
}
0 L/ v" D4 a* ? G else! |( ~* S8 M) k: A* ?
{
: `. C: y+ A# A( N UART1_User = 0 ;//结束DMA使用UART1状态
2 H. d- {- l+ d# t SYSUARTAPP = false ;7 t: H, P% e3 k; o' \1 G1 c6 X
DMACH0bits.CHEN = 0; //关闭DMA0中断
; y' G" }# b3 x; y ]3 Z; B// DMAINT0bits.HALFEN = 1;//下次半满中断* C% @- h( x* i5 z5 e0 c/ Q
U1TXREG = 0x38;: |# ^6 ~ P) E2 v1 x) m
U1TXREG = 0x38;9 Y5 c0 _! }; P( P5 H3 I8 O
U1TXREG = UART1_User;1 C" Q: l2 W8 c* o$ H
U1TXREG = 0x38;/ Y+ o) i, K7 v7 x- V0 }! Y# X3 m0 _
}
8 G) I9 ]+ Z5 B. c9 L% Q}3 ^* D2 O4 l3 q* |
' h) S, H T% c4 E" J可以看到,在DMA完成全部发送的时候,将UART1_User 设置为0,代表DMA使用UART1完成了,不再占用,同时设置了SYSUARTAPP为fales,也代表了UART1空了。同时还输出了四个字符作为标志,标志确实完成了DMA。" C* L8 X- N% C m5 p/ d
然后结果是这样的:) R5 N& w) i6 B1 V; h- o2 \$ Q; ]
1X973312021Echo0020211188*8
% ?) j( C' J0 ]$ `可以看到x发送成功了,代表了DMA发送成功,进入到了等待发送完成状态,同时最后也出现了标志DMA完成的四个字符,代表发送完成了,也就是说UART1_User 设置为0,SYSUARTAPP为fales,这两个设置设置都过了。但"Y"没有出现,也就是说这个while (SYSUARTAPP ){} 没有出来?啥情况呢?
) ~6 H* l% h5 n1 ^3 l. J' a这两个标志最后加的,程序其他地方没有也检查过了,不会有其他地方改变它们。我试了很多次了,原来就用UART1_User作为判断标志的,后来不行,没办法再加个布尔型试试,但还是不行。我这编程水平有大问题了么?急急急9 f. a+ F3 o9 z0 m: s+ A
|
|