华芯微特开发论坛

 找回密码
 立即注册
搜索
热搜: SWM341 资料
查看: 209|回复: 1

swm34的dma问题

[复制链接]

1

主题

1

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2025-11-11 14:43:22 | 显示全部楼层 |阅读模式
我现在用swm34芯片的DMA接收大量的串口数据,波特率为57600,接收满特定长度后产生中断并把标志传入到主循环中,再在主循环内处理数据。现在发现我直接关闭DMA再打开串口,发现DMA仍然处于使能状态,导致UART无法产生中断。
我换了个方案,既然DMA关不掉,那我直接在DMA的目标地址读指令,现在又发现DMA的长度又无法配置了,到底是啥问题啊

void DMA_Handler(void)
{
        if(DMA_CH_INTStat(DMA_CH1))
        {
                DMA_CH_INTClr(DMA_CH1);
                SerialData_Read.DMA_Flag = 1;
        }
       
}

...省略以上函数
if(!SerialData_Read.remain_size)
    {
                                SerialData_Read.layer_count--;
                                if(SerialData_Read.layer_count)
                                {
                                        //不释放资源,直接读取发送的指令
                                        //DMA->EN = 0;
                                        //切换缓冲区

                                        //dma_buffers.current_buf = 1 - dma_buffers.current_buf;
                                DMA_CH_Close(DMA_CH1);
                                DMA_Init.Count = CODE_SIZE+1;
                                DMA_Init.DstAddr = (uint32_t)dma_buffers.buffer[dma_buffers.current_buf];
                                DMA_CH_Init(DMA_CH1, &DMA_Init);
                                DMA_CH_Open(DMA_CH1);
                                DMA_CH_INTEn(DMA_CH1);

//                       
                                        //UART_INTRXThresholdEn(UART0);
                                        SerialData_Write.status_code |= 0x40;
                                        delay_system_s(1000);
                                        write_serial_data();
                                        code_flag = 1;
                                        SerialData_Write.status_code &= ~0x40;
                                }
                                else
                                {
                                        SerialData_Write.status_code |= 0x40;
                                        write_serial_data();
                                        delay_system_s(100);
                                        NVIC_SystemReset(); //直接重启,强制释放资源
                                        break;
                                }
}


回复

使用道具 举报

14

主题

72

帖子

1055

积分

超级版主

Rank: 8Rank: 8

积分
1055
发表于 2025-11-18 14:29:49 | 显示全部楼层

可以参考下库里 SimplUART_DMA 例程的处理方法。。
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|华芯微特开发论坛

GMT+8, 2026-9-17 19:31 , Processed in 0.030423 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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