找回密码
 注册
关于网站域名变更的通知
查看: 314|回复: 2
打印 上一主题 下一主题

dsPIC33CK X-IDE While跑丢了?

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-12-2 09:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

该用户从未签到

2#
发表于 2022-12-2 10:54 | 只看该作者
需要关掉UART发送中断,这个容易忘记的

该用户从未签到

3#
发表于 2022-12-2 13:27 | 只看该作者
STM32扛不住,换更能扛的dsPIC芯片了。这款芯片的资料着实不好找,没有32那么普及,但官方说明文档倒是写得比ST好很多,手册看起来也比较详细,上手也算是比较快了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-6 19:56 , Processed in 0.093750 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表