1577|5

111

帖子

0

资源

一粒金砂(中级)

(3)UART之DMA加IDLE中断不定长字节接收 [复制链接]

雷达应用接收的数据量比较大,因此需要用到DMA来提高速度,降低MCU负载。之前的项目已经在STM32F103芯片上使用了DMA+IDLE中断的方式实现了不定长的UART数据接收,这里也想在GD32L233C实现。

 

GD32L233C-START开发板配套的例程GD32L233K_START_Demo_Suites只有6个例程。关于UART接口的只有04_USART_HyperTerminal_Interrupt这一个例程。也不是我想要的DMA。但是我看到GD32L23x_Demo_Suites_V1.1.0这个例程包里面还有另外一个开发板的配套例程GD32L233R_EVAL_Demo_Suites,里面有多达24个例程。光UART相关就有4个,特别是包含DMA的例程,真是柳暗花明又一村。

 

例程是这样的:启动后,USART将输出“USART DMA interrupt receive and transmit example, please input 10 bytes:”并等待接收由超级终端发送10个字节的数据。MCU接收到数据后,串口将接收到的数据继续输出到超级终端。

 

功能实在是太简单了,好在DMA收发功能都已经初始化完毕,因此只需要进行简单修改就好了。

 

首先是GD32L233C-START开发板使用的是USART0,对应的IO是PA9和PA10,因此需要修改所有相关代码。这里就不展开了。

 

其次是需要添加IDLE中断相关使能代码。

main.c中系统初始化UART后面添加UART中断使能以及IDLE中断使能,

    /* USART interrupt configuration */
    nvic_irq_enable(USART0_IRQn, 0);
    /* enable USART1 IDLE interrupt */
    usart_interrupt_enable(USART0, USART_INT_IDLE);

   特别是前一句,如果未添加的话无法进入中断,也就没有IDLE中断了。我也是看了05_USART_HyperTerminal_Interrupt这个例程才找到原因的。

gd32l23x_it.c中添加IDLE中断调用:

void USART0_IRQHandler(void)
{
    if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_IDLE)) {
      usart_interrupt_flag_clear(USART0, USART_INT_FLAG_IDLE);  // 清标志
      dma_channel_disable(DMA_CH1);  // 关闭DMA
      //DMA接收到数据后CHCNT是往下减的,因此已经接收到的数据长度=DMA总长-当前CHCNT
      g_receive_count = RX_NUM - DMA_CHCNT(DMA_CH1);  
      /* configure the number of remaining data to be transferred */
      DMA_CHCNT(DMA_CH1) = RX_NUM;  // 复位DMA计数
      dma_channel_enable(DMA_CH1);  // 使能DMA
      g_receive_complete = SET;  // 接收数据标志置高
    }
    // 这里可以添加各种通讯错误处理
}

   这里需要对DMA进行干预,因为发生了IDLE事件,即收到一个短于DMA设置长度的数据段,此时可将数据进行处理,然后重新复位DMA计数,否则DMA会将两个甚至多个数据段拼合,导致错误。当然,如果不是像我一样设置了较大的DMA缓存,主要通过IDLE中断来接收不定长数据的话,也可能正合适。

下面通过串口软件发送不同长度的数据进行简单测试:

不定长数据接收

不定长数据接收 都能正确接收回送。附: main.c (7.5 KB, 下载次数: 3)
此帖出自GD32 MCU论坛

回复

7110

帖子

0

资源

五彩晶圆(中级)

如果未添加的话无法进入中断,也就没有IDLE中断了,这个具体什么原因呢

此帖出自GD32 MCU论坛

点评

就是必须先开USART中断,再开USART里面的IDLE中断  详情 回复 发表于 2022-4-22 18:27

回复

2691

帖子

3

资源

版主

建议标题,咱加上是哪一款芯片,这样一看就明白。希望下次的文章有进步!谢谢
此帖出自GD32 MCU论坛

点评

外边选择了主题,再加上芯片是不是太长了  详情 回复 发表于 2022-4-19 22:26

回复

5846

帖子

18

资源

五彩晶圆(中级)

DMA IDLE倒是一个不错的硬件机制,有些硬件没有,只能用硬件定时器来做

此帖出自GD32 MCU论坛
个人签名

默认摸鱼,再摸鱼。2022、9、28


回复

1265

帖子

0

资源

版主

lugl4313820 发表于 2022-4-18 07:49 建议标题,咱加上是哪一款芯片,这样一看就明白。希望下次的文章有进步!谢谢

外边选择了主题,再加上芯片是不是太长了

此帖出自GD32 MCU论坛

回复

111

帖子

0

资源

一粒金砂(中级)

Jacktang 发表于 2022-4-18 07:11 如果未添加的话无法进入中断,也就没有IDLE中断了,这个具体什么原因呢

就是必须先开USART中断,再开USART里面的IDLE中断

此帖出自GD32 MCU论坛

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

相关帖子
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
    关闭
    站长推荐上一条 1/6 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表