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

dsPIC33CK X-IDE While跑丢了?

[复制链接]

该用户从未签到

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

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

该用户从未签到

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-29 06:20 , Processed in 0.109375 second(s), 24 queries , Gzip On.

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

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

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