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

dsPIC33CK X-IDE While跑丢了?

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
碰到一个问题,请教各位大侠:在使用DMA发送UART的时候,需要等待上一次发送完成后,才能进行下一次发送。但是出了问题了。
3 N6 d8 F) x! g9 I这是测试代码:& P( k* B# s( t  X8 @- z
  UART1_User = DMA0_Use_UART1;//设置UART1为DMA在使用
: |7 d' f4 x6 ^+ E3 g$ [& B9 b/ A  SYSUARTAPP = true ;//UART1在使用状态
5 W5 d% L) O; q* v) N  SendCCDMA(C_SysInf);//DMA发送数据
8 Q6 d) S" O" q+ a3 @+ G  U1TXREG = 0x58;//完成DMA设置(此时没有完成发送),发送一个"X"作为标志
4 f/ f0 a7 Q+ P0 w& r  while (SYSUARTAPP ){}//等待发送完成# {* X' ~/ S2 d
U1TXREG = 0x59; //发送完成后再发送一个"Y"作为标志+ q5 V" ?/ i5 S, Z9 e/ V
3 k" X8 i6 L/ c. z& y  K4 B

1 p2 L# ^8 T, b& C7 q! n: a, W7 R) a9 vDMA中断程序:
; L; g2 y9 E+ y  ~void __attribute__ ( ( interrupt, no_auto_psv ) ) _DMA0Interrupt ( void )# \  s) T5 ?! \1 L: l+ |
{, ~' z' W; F) W3 I3 `2 x3 g
    IFS0bits.DMA0IF = 0;//清除DMA0中断( n/ n( ~0 n) I: l/ u
                if (DMAINT0bits.HALFIF == 1) //半满中断
  l! C5 z1 N3 @, O- F                {
! Q* g- N9 h- L1 v; ^% h                        DMAINT0bits.HALFEN = 0;//下次全满中断
% q' T3 x9 Y5 `/ s+ L! B4 ]            DMAINT0bits.HALFIF = 0;//清除半满中断标志
3 j# z( K& a, R& a, d                }
- S3 U7 R1 ]6 g                else
- x) }' K5 X/ p+ \/ {7 g8 |7 U4 v                {, g& P& }& u" L$ O- q
                        UART1_User = 0 ;//结束DMA使用UART1状态
' U' c) @6 ?3 a& A, @/ b* p1 ?. g                        SYSUARTAPP = false ;
+ h2 F% f$ Y" B. ]) x. s                        DMACH0bits.CHEN = 0; //关闭DMA0中断( W. e- d7 |$ _% @+ ^$ e" v; ~* V1 I8 ?
//                        DMAINT0bits.HALFEN = 1;//下次半满中断% w$ c0 \: s( Z$ l% c$ S
                        U1TXREG =  0x38;1 I0 B. h! M% \! g4 R# @
                        U1TXREG =  0x38;1 p7 y' M9 y- i1 l7 y& t
                        U1TXREG = UART1_User;
: U- W! N+ }. i* C                        U1TXREG =  0x38;
' k0 [7 d# @6 K) H1 ^( B, l                }           
7 \+ r2 E. z# d6 G3 ^3 x# ?1 C}4 j( B/ G  R4 @$ Q& S: {5 T; \& v

1 g  G8 U* C! ~" a1 x6 y可以看到,在DMA完成全部发送的时候,将UART1_User 设置为0,代表DMA使用UART1完成了,不再占用,同时设置了SYSUARTAPP为fales,也代表了UART1空了。同时还输出了四个字符作为标志,标志确实完成了DMA。
0 k2 C% f- }2 i* Y然后结果是这样的:
5 S! o6 d- G5 M5 [, w& B" z& B1X973312021Echo0020211188*84 b: {/ j4 z  i' T% o8 A6 L" g2 ?
可以看到x发送成功了,代表了DMA发送成功,进入到了等待发送完成状态,同时最后也出现了标志DMA完成的四个字符,代表发送完成了,也就是说UART1_User 设置为0,SYSUARTAPP为fales,这两个设置设置都过了。但"Y"没有出现,也就是说这个while (SYSUARTAPP ){}  没有出来?啥情况呢?
$ `6 Y4 w; L+ K6 Z6 a/ E这两个标志最后加的,程序其他地方没有也检查过了,不会有其他地方改变它们。我试了很多次了,原来就用UART1_User作为判断标志的,后来不行,没办法再加个布尔型试试,但还是不行。我这编程水平有大问题了么?急急急
+ p! }- X- e8 [" d, w% n2 H5 Y9 i+ D

该用户从未签到

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-17 11:56 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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