Alohaq 发表于 2024-1-19 16:19

HC32F460_DDL_Rev3.2.0中DMA函数存在问题

本帖最后由 Alohaq 于 2024-2-4 14:17 编辑

若在DMA_ChCmd使用中有中断触发,导致第二次DMA_ChCmd触发,则会直接返回LL_ERR; 假如我用的两个DMA单元,则会导致被中断触发的DMA单元被正在使能的DMA单元使能失败,如DMA1正在通道使能,这时外部中断触发,去使能DMA2的通道,结果DMA2使能失败,直接导致传输失败,所以需要分开,设为DMA_ChCmd_1和DMA_ChCmd_2

int32_t DMA_ChCmd(CM_DMA_TypeDef *DMAx, uint8_t u8Ch, en_functional_state_t enNewState)
{
    static __IO uint8_t u8DmaChEnState = DMA_IDLE;
    ```
    ```
    if (DMA_IDLE == u8DmaChEnState) {
       ```
       return LL_OK;
    }
        return LL_ERR;
}






elephant00 发表于 2024-1-31 10:01

一般是DMA初始化、数据传输等问题

jinyuhang123456 发表于 2024-1-31 14:14

意思是这个函数要写两遍?还是说,函数内容里面要将两个DMA分开?

Alohaq 发表于 2024-2-4 14:21

jinyuhang123456 发表于 2024-1-31 14:14
意思是这个函数要写两遍?还是说,函数内容里面要将两个DMA分开?
就是我用了两个DMA单元,库函数里只有一个DMA_ChCmd,假设正在使能DMA2的通道,恰好外部中断来了,触发DMA1的传输,那么这时候使能DMA1的通道,也需要用到DMA_ChCmd,这里直接返回Err,按理DMA1和2两者之间的通道使能不会冲突,这个函数里没处理好导致两者冲突了,我单独为两个DMA搞了使能通道函数,分别为DMA_ChCmd_1和DMA_ChCmd_2,就不会引起冲突了

xdvca 发表于 2024-7-31 22:42

一个DMA通道正在进行传输,另一个DMA通道的使能请求可能会由于并发操作而导致冲突。针对这个问题,可以采取一些措施来确保DMA通道的稳定性和数据传输的可靠性。
禁用中断:在进行DMA通道使能或禁用时,临时禁用相关的中断,以避免中断请求导致的并发问题。例如,可以使用__disable_irq()和__enable_irq()函数在操作时禁用和恢复全局中断。
使用互斥锁:在多线程环境下,可以使用互斥锁或其他同步机制来确保同一时间只有一个DMA通道的使能操作在进行。

页: [1]
查看完整版本: HC32F460_DDL_Rev3.2.0中DMA函数存在问题