CH582F, SPI0 DMA传输完成中断的中断标志位无法清除

在使用SPI0的DMA时, 开启了DMA传输完成中断, 还没开始配置DMA, 但是传输完成标志位已经被置位, 在中断服务函数中清除标志位无效, 一直进入中断服务函数。

代码如下

先清除标志位, 按照手册, 给R8_SPI0_INT_FLAG寄存器的第四位置1来清除

之后配置中断, 开启中断

void prepare_to_send(void)
{
    int asdtg = 0;
    IPS_Addr_Set(0, 0, 99, 63); // 设置光标位置
                                // memcpy(scr_buffer, cat_background, sizeof(scr_buffer));
                                // SPI0_MasterDMATrans(scr_buffer, sizeof(scr_buffer));
    // R8_SPI0_INT_FLAG = 0xff;
    PRINT("R8_SPI0_INT_FLAG = %02X\n", R8_SPI0_INT_FLAG);
    SPI0_ClearITFlag(SPI0_IT_DMA_END);
    PRINT("After: R8_SPI0_INT_FLAG = %02X\n", R8_SPI0_INT_FLAG);

    SPI0_ITCfg(1, SPI0_IT_DMA_END);
    PRINT("L%d\n", __LINE__);
    PFIC_EnableIRQ(SPI0_IRQn);
    PRINT("L%d\n", __LINE__);
}
__INTERRUPT
__HIGH_CODE
void SPI0_IRQHandler(void)
{
    // SPI0_ClearITFlag(SPI0_IT_DMA_END);
    if (SPI0_GetITFlag(SPI0_IT_DMA_END))
    {
        PRINT("In IRQHandler: R8_SPI0_INT_FLAG = %02X\n", R8_SPI0_INT_FLAG);
        SPI0_ClearITFlag(SPI0_IT_DMA_END);
        PRINT("L%d\n", __LINE__);
        PRINT("In IRQHandler clear: R8_SPI0_INT_FLAG = %02X\n", R8_SPI0_INT_FLAG);
    }
}

实际代码对应行数如下图

image.png

执行结果(串口接收的数据)如下图

image.png

表现现象

829行正常执行, 830行开启中断, 然后831行未被执行

之后全部在执行中断回调函数, 获取到的标志位为4D, DMA传输完成标志被置位, 之后对寄存器写值清标志位, 但是清除完后读取到的值仍为4D, 清除没有效果。

请问这种情况改如何解决呢

传输完成清除标志,并注意再修改一下DMA的起始和结束的地址。配置spi+dma可以参考该博客:

CH58xSPI0中断DMA - SweetTea_lllpc - 博客园 (cnblogs.com)


只有登录才能回复,可以选择微信账号登录