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

dsPIC33CK X-IDE While跑丢了?

[复制链接]

该用户从未签到

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

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

该用户从未签到

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-9-11 01:49 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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