在使用SPI0的DMA時, 開啟了DMA傳輸完成中斷, 還沒開始配置DMA, 但是傳輸完成標(biāo)志位已經(jīng)被置位, 在中斷服務(wù)函數(shù)中清除標(biāo)志位無效, 一直進入中斷服務(wù)函數(shù)。
代碼如下
先清除標(biāo)志位, 按照手冊, 給R8_SPI0_INT_FLAG寄存器的第四位置1來清除
之后配置中斷, 開啟中斷
void?prepare_to_send(void) { ????int?asdtg?=?0; ????IPS_Addr_Set(0,?0,?99,?63);?//?設(shè)置光標(biāo)位置 ????????????????????????????????//?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); ????} }
實際代碼對應(yīng)行數(shù)如下圖
執(zhí)行結(jié)果(串口接收的數(shù)據(jù))如下圖
表現(xiàn)現(xiàn)象
829行正常執(zhí)行, 830行開啟中斷, 然后831行未被執(zhí)行
之后全部在執(zhí)行中斷回調(diào)函數(shù), 獲取到的標(biāo)志位為4D, DMA傳輸完成標(biāo)志被置位, 之后對寄存器寫值清標(biāo)志位, 但是清除完后讀取到的值仍為4D, 清除沒有效果。
請問這種情況改如何解決呢