19.7.1.11
DMAC中斷回調(diào)函數(shù)
DMAC中斷回調(diào)函數(shù)如下所示:
列表10: 代碼清單20?9DMAC中斷回調(diào)函數(shù)
左右滑動查看完整內(nèi)容
// DMA 傳輸完成標(biāo)志位 volatilebool dmac0_complete_transmission_sign =false; // 傳輸次數(shù)計數(shù)(中斷次數(shù)) volatileuint16_t dmac0_transfer_count; /* DMAC 中斷回調(diào)函數(shù) */ voiddmac0_callback(dmac_callback_args_t *p_args) { (void)(p_args); dmac0_complete_transmission_sign =true; dmac0_transfer_count ++; }
dmac0_transfer_count用于記錄DMAC產(chǎn)生中斷的次數(shù)。
19.7.1.12
hal_entry 入口函數(shù)
在hal_entry函數(shù)中,程序遵循以下步驟來執(zhí)行:
調(diào)用DMAC_Init函數(shù)初始化DMAC。
調(diào)用R_DMAC_Enable函數(shù)使能DMAC使之可以響應(yīng)傳輸請求。
調(diào)用R_DMAC_SoftwareStart函數(shù)來發(fā)起軟件觸發(fā)請求信號來啟動DMAC傳輸。
通過一定的延時等待所有傳輸完成,因?yàn)樵诋a(chǎn)生多次的中斷的情況下,僅通過中斷標(biāo)志位判斷可能出錯。
在傳輸完成之后,比較傳輸目標(biāo)地址的數(shù)據(jù)(DST_Buffer)和期待的正確數(shù)據(jù)(Expected_DST_Buffer)是否一致。
傳入R_DMAC_SoftwareStart函數(shù)的參數(shù) TRANSFER_START_MODE_SINGLE和TRANS-FER_START_MODE_REPEAT的區(qū)別如下:
傳入?yún)?shù)為TRANSFER_START_MODE_SINGLE時,正常模式和重復(fù)模式下每發(fā)起一次軟件請求只會傳輸一個數(shù)據(jù)單元大?。╰ransfer_size_tsize)的數(shù)據(jù)。塊模式下則是只會傳輸一個塊大小(transfer_info_t::length)的數(shù)據(jù)。
傳入?yún)?shù)為TRANSFER_START_MODE_REPEAT時,會自動重復(fù)地觸發(fā)傳輸,期間可能會產(chǎn)生多次中斷,直至所有數(shù)據(jù)都傳輸完成為止。
hal_entry入口函數(shù)如下所示。
列表11:代碼清單20?10hal_entry入口函數(shù)
左右滑動查看完整內(nèi)容
/*用戶頭文件包含*/ #include"led/bsp_led.h" #include"debug_uart/bsp_debug_uart.h" #include"dmac/bsp_dmac_m2m.h" externconstuint32_tSRC_Buffer[BUFFER_SIZE]; externuint32_tDST_Buffer[BUFFER_SIZE]; externuint32_tExpected_DST_Buffer[BUFFER_SIZE]; externvolatilebooldmac0_complete_transmission_sign; externvolatileuint16_tdmac0_transfer_count; uint8_tBufferCompare(constuint32_t*pBuffer1,constuint32_t*pBuffer2,? →uint16_tBufferLength); voidBufferShow_HexData(constuint32_t*pBuffer,uint16_tBufferLength); voidhal_entry(void) { /*TODO:addyourowncodehere*/ fsp_err_terr= FSP_SUCCESS; uint8_tres; LED_Init(); // LED 初始化 Debug_UART4_Init();// SCI4 UART 調(diào)試串口初始化 /* 初始化 DMAC */ DMAC_Init(); dmac0_complete_transmission_sign =false;//傳輸完成標(biāo)志位清零 printf("這是一個 DMAC 存儲器到存儲器的傳輸實(shí)驗(yàn)例程 "); printf("打開串口助手,查看接收窗口打印的相關(guān)提示信息 "); printf("觀察板載 LED 燈,本實(shí)驗(yàn)使用兩個 LED 燈來指示 DMAC 傳輸結(jié)果 "); printf("- DMA 數(shù)據(jù)傳輸失敗,則 LED1 亮(紅色) "); printf("- DMA 數(shù)據(jù)傳輸成功,則 LED2 亮(藍(lán)色) "); printf("-------------------------------------------- "); /* 使能 DMAC 使之可以響應(yīng)傳輸請求 */ R_DMAC_Enable(&g_transfer_dmac0_ctrl); /************************************/ /* 使用軟件觸發(fā)的方式啟動 DMAC 傳輸 */ /************************************/ #ifndefUSE_MY_TRANSFER_INFOR_CONFIG /* 根據(jù) FSP 配置界面的傳輸信息配置進(jìn)行傳輸 */ //可以用下面這種方式: R_DMAC_SoftwareStart(&g_transfer_dmac0_ctrl, TRANSFER_START_MODE_ →REPEAT); //也可以用這種方式: //for (uint16_t i = 0; i < 1; i++) //{ // err =?R_DMAC_SoftwareStart(&g_transfer_dmac0_ctrl, TRANSFER_ →START_MODE_SINGLE); // assert(FSP_SUCCESS == err); //} #else// 下面的這些是使用自定義的傳輸配置信息配置 #if?(DMAC_TRANSFER_MODE == DMAC_TRANSFER_NORMAL_MODE) (相當(dāng)于重復(fù)次數(shù)為?1?的重復(fù)模式) //可以用下面這種方式: R_DMAC_SoftwareStart(&g_transfer_dmac0_ctrl, TRANSFER_START_MODE_ →REPEAT); //也可以用這種方式: //for (uint16_t i = 0; i < BUFFER_SIZE; i++) //{ // //正常模式 err =?R_DMAC_SoftwareStart(&g_transfer_dmac0_ctrl, TRANSFER_ →START_MODE_SINGLE); // assert(FSP_SUCCESS == err); //} #elif?(DMAC_TRANSFER_MODE == DMAC_TRANSFER_REPEAT_MODE) //可以用下面這種方式: R_DMAC_SoftwareStart(&g_transfer_dmac0_ctrl, TRANSFER_START_MODE_ →REPEAT); //也可以用這種方式: //for (uint16_t i = 0; i < BUFFER_SIZE; i++) //{ // //重復(fù)模式 err =?R_DMAC_SoftwareStart(&g_transfer_dmac0_ctrl, TRANSFER_ →START_MODE_SINGLE); // assert(FSP_SUCCESS == err); //} #elif?(DMAC_TRANSFER_MODE == DMAC_TRANSFER_BLOCK_MODE) //可以用下面這種方式: R_DMAC_SoftwareStart(&g_transfer_dmac0_ctrl, TRANSFER_START_MODE_ →REPEAT); //塊模式 //也可以用這種方式: //for (uint16_t i = 0; i < 4; i++) //{ // err =?R_DMAC_SoftwareStart(&g_transfer_dmac0_ctrl, TRANSFER_ →START_MODE_SINGLE); // assert(FSP_SUCCESS == err); // // 出錯 // //} //加個小延時,確保 DMAC 通道 0 傳輸完成之后才再次軟件觸發(fā)啟動,否則傳輸可能 R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MILLISECONDS); #elif?(DMAC_TRANSFER_MODE == DMAC_TRANSFER_REPEAT_BLOCK_MODE)?//重復(fù)-塊模 式 //可以用下面這種方式: R_DMAC_SoftwareStart(&g_transfer_dmac0_ctrl, TRANSFER_START_MODE_ →REPEAT); //也可以用這種方式: //for (uint16_t i = 0; i < 4; i++) //{ // err =?R_DMAC_SoftwareStart(&g_transfer_dmac0_ctrl, TRANSFER_ →START_MODE_SINGLE); // assert(FSP_SUCCESS == err); // // 出錯 // //} //加個小延時,確保 DMAC 通道 0 傳輸完成之后才再次軟件觸發(fā)啟動,否則傳輸可能 R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MILLISECONDS); #endif//DMAC_TRANSFER_MODE #endif//USE_MY_TRANSFER_INFOR_CONFIG /* 判斷傳輸完成中斷(需至少觸發(fā)過 1 次) */ while?(false?== dmac0_complete_transmission_sign); /* 等待所有傳輸完成(如果是 TRANSFER_IRQ_EACH 模式,傳輸過程中可能會觸發(fā)多次中斷) */ R_BSP_SoftwareDelay(5, BSP_DELAY_UNITS_MILLISECONDS);?//加上延時確保所 有傳輸都已完成 printf(" 傳輸計數(shù)(中斷次數(shù)):dmac0_transfer_count = %d ", dmac0_ →transfer_count); /* 將傳輸后的數(shù)據(jù)與我們所期待的結(jié)果相比較 */ res =?BufferCompare(DST_Buffer, Expected_DST_Buffer, BUFFER_SIZE); printf("傳輸結(jié)果:"); /* 根據(jù)兩者數(shù)據(jù)的比較結(jié)果進(jìn)行判斷 */ if( res !=?0) { /* 源數(shù)據(jù)與傳輸后數(shù)據(jù)不相等時,LED1 亮(紅色),表示傳輸失敗 */ LED1_ON; printf("< 傳輸失敗> "); } else { /*源數(shù)據(jù)與傳輸后數(shù)據(jù)相等時,LED1亮(藍(lán)色),表示傳輸成功*/ LED2_ON; printf("<傳輸成功> "); } printf(" SRC:"); BufferShow_HexData(SRC_Buffer,BUFFER_SIZE); printf(" DST:(應(yīng)與Expected_DST一致)"); BufferShow_HexData(DST_Buffer,BUFFER_SIZE); printf(" Expected_DST:"); BufferShow_HexData(Expected_DST_Buffer,BUFFER_SIZE); while(1) { } #ifBSP_TZ_SECURE_BUILD /*Enternon-securecode*/ R_BSP_NonSecureEnter(); #endif }
19.7.1.13
緩沖區(qū)數(shù)據(jù)比較函數(shù)
下面是DMAC在重復(fù)-塊傳輸模式下傳輸?shù)呐渲么a:
列表12:代碼清單20?11緩沖區(qū)數(shù)據(jù)比較函數(shù)
左右滑動查看完整內(nèi)容
/*緩沖區(qū)數(shù)據(jù)比較函數(shù)
返回0表示兩個緩沖區(qū)數(shù)據(jù)一致
*/
uint8_tBufferCompare(constuint32_t*pBuffer1,constuint32_t*pBuffer2,?
→uint16_tBufferLength)
{
/*數(shù)據(jù)長度遞減*/
while(BufferLength--)
{
/*判斷兩個數(shù)據(jù)源是否對應(yīng)相等*/
if(*pBuffer1!= *pBuffer2)
{
/*對應(yīng)數(shù)據(jù)源不相等馬上退出函數(shù),并返回1*/
return1;
}
/*遞增兩個數(shù)據(jù)源的地址指針*/
pBuffer1++;
pBuffer2++;
}
/*完成判斷并且兩組數(shù)據(jù)完全一致*/
return0;
}
19.7.1.14
打印緩沖區(qū)數(shù)據(jù)函數(shù)
列表13:代碼清單20?12打印緩沖區(qū)數(shù)據(jù)函數(shù)
左右滑動查看完整內(nèi)容
/*打印緩沖區(qū)數(shù)據(jù)函數(shù)
打印緩沖區(qū)數(shù)據(jù):十六進(jìn)制格式
*/
voidBufferShow_HexData(constuint32_t*pBuffer,uint16_tBufferLength)
{
while(BufferLength)
{
if((BufferLength%4)==0)
printf("
");
printf("0x%08X",*pBuffer);
pBuffer++;
BufferLength--;
}
printf("
");
}
19.7.2
下載驗(yàn)證
首先通過宏USE_MY_TRANSFER_INFOR_CONFIG(在bsp_dmac_m2m.h文件中)來選擇是使用我們自定義的傳輸信息,還是使用在FSP配置界面配置的傳輸信息。
其次通過宏DMAC_TRANSFER_MODE(在bsp_dmac_m2m.h文件中)來選擇不同的傳輸模式。
最后編譯工程并下載到開發(fā)板上,打開串口助手可以查看程序運(yùn)行打印的提示信息。如果DMAC傳輸成功,則藍(lán)色LED2亮起,如果傳輸失敗則紅色LED1亮起。
-
中斷
+關(guān)注
關(guān)注
5文章
917瀏覽量
43722 -
編譯
+關(guān)注
關(guān)注
0文章
693瀏覽量
35115 -
回調(diào)函數(shù)
+關(guān)注
關(guān)注
0文章
95瀏覽量
12178
原文標(biāo)題:DMAC中斷回調(diào)函數(shù)等——瑞薩RA系列FSP庫開發(fā)實(shí)戰(zhàn)指南(57)
文章出處:【微信號:瑞薩嵌入式小百科,微信公眾號:瑞薩嵌入式小百科】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
瑞薩RA系列FSP庫開發(fā)實(shí)戰(zhàn)指南之DMAC+UART串口收發(fā)實(shí)驗(yàn)
瑞薩RA系列FSP庫開發(fā)實(shí)戰(zhàn)指南之I2C讀寫EEPROM實(shí)驗(yàn)
瑞薩RA6M4系列DMAC和ADC的詳細(xì)介紹(1)
瑞薩e2studio(1)----瑞薩芯片之搭建FSP環(huán)境
【瑞薩RA4系列開發(fā)板體驗(yàn)】開發(fā)環(huán)境搭建和新手點(diǎn)燈指南
【瑞薩RA4系列開發(fā)板體驗(yàn)】10. 我的試用總結(jié)
【瑞薩RA4系列開發(fā)板體驗(yàn)】體驗(yàn)過程
STM32Cube HAL庫中斷處理機(jī)制 以及回調(diào)函數(shù)實(shí)現(xiàn)原理
HAL庫中斷處理以及相關(guān)的回調(diào)函數(shù)
【有獎直播預(yù)報名】瑞薩電子RA系列產(chǎn)品開發(fā)工具之FSP4.0.0新特性介紹
【視頻教程】瑞薩RA單片機(jī)FSP開發(fā)(3)FSP架構(gòu)-解釋Blinky架構(gòu)[上]
瑞薩RA產(chǎn)品家族初學(xué)者指南-第11章(3)
基于瑞薩RA0E1開發(fā)板的ThreadX實(shí)時操作系統(tǒng)串口回顯測試
瑞薩RA系列FSP庫開發(fā)實(shí)戰(zhàn)指南之DMAC中斷回調(diào)函數(shù)等
評論