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

dsPIC33CK X-IDE While跑丢了?

[复制链接]

该用户从未签到

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

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

该用户从未签到

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-6-27 12:53 , Processed in 0.078125 second(s), 23 queries , Gzip On.

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

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

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