在使用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); } }
实际代码对应行数如下图
执行结果(串口接收的数据)如下图
表现现象
829行正常执行, 830行开启中断, 然后831行未被执行
之后全部在执行中断回调函数, 获取到的标志位为4D, DMA传输完成标志被置位, 之后对寄存器写值清标志位, 但是清除完后读取到的值仍为4D, 清除没有效果。
请问这种情况改如何解决呢
热门产品 :
CH32X035: 32位USB+USB PD单片机