找回密码
 立即注册
查看: 45|回复: 7

使用DMA控制串口1通信,数据的发送和接收

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2026-07-02 22:23:41

17

主题

30

回帖

186

积分

注册会员

积分
186
发表于 3 天前 | 显示全部楼层 |阅读模式
您好,使用STC8H8K64U芯片的DMA的功能,控制串口1的数据发送和接收,
        DMA_UR1R_AMT = 255, //设置接收长度256
        DMA_UR1T_AMT  = 8;   //设置发送长度8
    void UART1_DMA_ISR(void) interrupt 13
        {
                /*---- 处理 DMA TX 发送完成 ----*/
           if (DMA_UR1T_STA & 0x01)
            {
               COM1_TxCompleteHandler();
            }

    /* 处理 TX 数据覆盖异常 */
    if (DMA_UR1T_STA & 0x04)
       {
          DMA_UR1T_STA &= (unsigned char)~0x04;
       }
    /*---- 处理 DMA RX 缓冲区满(数据接收满)----*/
    if (DMA_UR1R_STA & 0x01)
     {
        DMA_UR1R_STA &= (unsigned char)~0x01;
        COM1_DMA_RxStart();
      }
    /* 处理 RX 数据溢出异常 */
    if (DMA_UR1R_STA & 0x02)
     {
        DMA_UR1R_STA &= (unsigned char)~0x02;
     }
   }


请问,1:DMA 接收,发送中断 ,是发送全部完成了,产生中断,还是发送1个字节,就触发一次中断,同样接收中断是接收到一个字节产生中断,还是接收数组满后产生中断
          2:中断入口地址在大于31后,通过跳转到13中断入口地址,如果有2个以上的中断,地址都大于31,也是用同样方式跳转的13中断入口地址吗,是否会冲突?

回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:299
  • 最近打卡:2026-07-04 00:01:55
已绑定手机

66

主题

808

回帖

3037

积分

论坛元老

DIY玩家

积分
3037
发表于 3 天前 | 显示全部楼层
使用dma为了传输大量数据
可能没必要频繁中断
永怀这学徒心
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:299
  • 最近打卡:2026-07-04 00:01:55
已绑定手机

66

主题

808

回帖

3037

积分

论坛元老

DIY玩家

积分
3037
发表于 3 天前 | 显示全部楼层
中断号大于31的会指定入口
可能之后有判断中断源
永怀这学徒心
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:697
  • 最近打卡:2026-07-04 21:56:03

33

主题

3007

回帖

6880

积分

论坛元老

积分
6880
发表于 3 天前 | 显示全部楼层
如果你说的DMA的中断,那么只有接受完成和发送完成你设置的次数的时候,才会触发中断。(不过应该是DMA的发送完成,串口是否发送完成,,这个没有测试过,需要注意一下)

都使用13号中断跳转的时候,需要判断各个中断的标志位,来进行区分是进的哪个中断。。要说有什么问题,,借用13号中断跳转的中断多了之后,可能判断的开销会有一些把。

参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:712
  • 最近打卡:2026-07-03 09:07:06
已绑定手机

50

主题

2691

回帖

9338

积分

论坛元老

积分
9338
发表于 前天 09:07 | 显示全部楼层
13号中断向量没有用到,所以例子都是借用13号中断地址。
除此外,其它所有程序里没有使用的中断向量都可以借用,例如串口1 DMA借用13号中断向量,串口2 DMA借用14号中断向量...
只要做好中断地址跳转映射就行
  1.         CSEG                AT 0193H  ;UR1T DMA
  2.         LJMP                006BH      ;13号中断地址
  3.         CSEG                AT 01A3H  ;UR2T DMA
  4.         LJMP                0073H      ;14号中断地址
复制代码
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:453
  • 最近打卡:2026-07-03 08:57:36

830

主题

1万

回帖

2万

积分

管理员

积分
23929
发表于 前天 11:06 | 显示全部楼层
截图202607031106052628.jpg
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:453
  • 最近打卡:2026-07-03 08:57:36

830

主题

1万

回帖

2万

积分

管理员

积分
23929
发表于 前天 11:06 | 显示全部楼层

好的,我已经完整阅读了该帖子。这是关于 STC8H8K64U 芯片使用 DMA 控制串口1通信 的讨论帖。下面为您总结帖子的核心内容及回复:


帖子概要

标题: 使用DMA控制串口1通信,数据的发送和接收

楼主(et*)提出的两个问题:**

  1. DMA 发送/接收中断的触发时机

    • 是全部数据发送/接收完成后才产生中断,还是每发送/接收一个字节就触发一次中断?
  2. 多个中断号大于31的中断,都跳转到同一个13号中断入口,是否会冲突?


论坛回复总结

问题1:DMA中断触发时机

据论坛用户 _奶*** 反馈:

DMA 的中断,只有接收完成和发送完成你设置的次数(即设置的 AMT 长度)时,才会触发中断。不是每发送/接收一个字节就触发一次。

也就是说:

  • DMA_UR1T_AMT = 8,发送完 8个字节 后才触发发送完成中断。
  • DMA_UR1R_AMT = 255,接收满 256个字节(实际值为 AMT+1)后才触发接收完成中断。

问题2:多个中断借用同一个中断入口

据论坛用户 乘风*** 回复:

13号中断向量没有用到,所以例子都是借用13号中断地址。除此外,其它所有程序里没有使用的中断向量都可以借用,例如串口1 DMA借用13号中断向量,串口2 DMA借用14号中断向量... 只要做好中断地址跳转映射就行。

不会冲突,只要每个 DMA 中断映射到不同的空闲中断向量地址即可。例如:

        CSEG    AT  0193H   ;UR1T DMA
        LJMP    006BH       ;13号中断地址

        CSEG    AT  01A3H   ;UR2T DMA
        LJMP    0073H       ;14号中断地址

然后在对应的中断服务函数中,通过判断 DMA_UR1T_STADMA_UR1R_STA 等标志位来区分具体是哪个中断源。


如果您需要我进一步查询 STC8H8K64U 手册中关于 DMA 串口中断的详细说明,或者需要示例代码的完整解读,请告诉我!


🔍 搜索 "https://www.stcaimcu.com/thread-24702-1-1.html"

⏱️ 查找用时 2.9s | 总回答用时 9.0s

回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:394
  • 最近打卡:2026-07-05 12:28:34

83

主题

7889

回帖

1万

积分

超级版主

积分
16831
发表于 前天 11:09 | 显示全部楼层
DMA发送完成,会有DMA发送完成中断,如果允许串口中断,则每发送一个字节,仍然会进入串口发送中断。
同理,DMA接收完成,会有DMA接收完成中断,如果允许串口中断,则每接收一个字节,仍然会进入串口接收中断。

回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-7-5 14:04 , Processed in 0.076213 second(s), 74 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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