19.7.1.11
DMAC中断回调函数
DMAC中断回调函数如下所示:
列表10: 代码清单20‑9DMAC中断回调函数
左右滑动查看完整内容
// DMA 传输完成标志位 volatilebool dmac0_complete_transmission_sign =false; // 传输次数计数(中断次数) volatileuint16_t dmac0_transfer_count; /* DMAC 中断回调函数 */ voiddmac0_callback(dmac_callback_args_t *p_args) { (void)(p_args); dmac0_complete_transmission_sign =true; dmac0_transfer_count ++; }
dmac0_transfer_count用于记录DMAC产生中断的次数。
19.7.1.12
hal_entry 入口函数
在hal_entry函数中,程序遵循以下步骤来执行:
调用DMAC_Init函数初始化DMAC。
调用R_DMAC_Enable函数使能DMAC使之可以响应传输请求。
调用R_DMAC_SoftwareStart函数来发起软件触发请求信号来启动DMAC传输。
通过一定的延时等待所有传输完成,因为在产生多次的中断的情况下,仅通过中断标志位判断可能出错。
在传输完成之后,比较传输目标地址的数据(DST_Buffer)和期待的正确数据(Expected_DST_Buffer)是否一致。
传入R_DMAC_SoftwareStart函数的参数 TRANSFER_START_MODE_SINGLE和TRANS-FER_START_MODE_REPEAT的区别如下:
传入参数为TRANSFER_START_MODE_SINGLE时,正常模式和重复模式下每发起一次软件请求只会传输一个数据单元大小(transfer_size_tsize)的数据。块模式下则是只会传输一个块大小(transfer_info_t::length)的数据。
传入参数为TRANSFER_START_MODE_REPEAT时,会自动重复地触发传输,期间可能会产生多次中断,直至所有数据都传输完成为止。
hal_entry入口函数如下所示。
列表11:代码清单20‑10hal_entry入口函数
左右滑动查看完整内容
/*用户头文件包含*/ #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 调试串口初始化 /* 初始化 DMAC */ DMAC_Init(); dmac0_complete_transmission_sign =false;//传输完成标志位清零 printf("这是一个 DMAC 存储器到存储器的传输实验例程 "); printf("打开串口助手,查看接收窗口打印的相关提示信息 "); printf("观察板载 LED 灯,本实验使用两个 LED 灯来指示 DMAC 传输结果 "); printf("- DMA 数据传输失败,则 LED1 亮(红色) "); printf("- DMA 数据传输成功,则 LED2 亮(蓝色) "); printf("-------------------------------------------- "); /* 使能 DMAC 使之可以响应传输请求 */ R_DMAC_Enable(&g_transfer_dmac0_ctrl); /************************************/ /* 使用软件触发的方式启动 DMAC 传输 */ /************************************/ #ifndefUSE_MY_TRANSFER_INFOR_CONFIG /* 根据 FSP 配置界面的传输信息配置进行传输 */ //可以用下面这种方式: 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) (相当于重复次数为 1 的重复模式) //可以用下面这种方式: 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++) //{ // //重复模式 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 传输完成之后才再次软件触发启动,否则传输可能 R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MILLISECONDS); #elif (DMAC_TRANSFER_MODE == DMAC_TRANSFER_REPEAT_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 传输完成之后才再次软件触发启动,否则传输可能 R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MILLISECONDS); #endif//DMAC_TRANSFER_MODE #endif//USE_MY_TRANSFER_INFOR_CONFIG /* 判断传输完成中断(需至少触发过 1 次) */ while (false == dmac0_complete_transmission_sign); /* 等待所有传输完成(如果是 TRANSFER_IRQ_EACH 模式,传输过程中可能会触发多次中断) */ R_BSP_SoftwareDelay(5, BSP_DELAY_UNITS_MILLISECONDS); //加上延时确保所 有传输都已完成 printf(" 传输计数(中断次数):dmac0_transfer_count = %d ", dmac0_ →transfer_count); /* 将传输后的数据与我们所期待的结果相比较 */ res = BufferCompare(DST_Buffer, Expected_DST_Buffer, BUFFER_SIZE); printf("传输结果:"); /* 根据两者数据的比较结果进行判断 */ if( res != 0) { /* 源数据与传输后数据不相等时,LED1 亮(红色),表示传输失败 */ LED1_ON; printf("< 传输失败> "); } else { /*源数据与传输后数据相等时,LED1亮(蓝色),表示传输成功*/ LED2_ON; printf("<传输成功> "); } printf(" SRC:"); BufferShow_HexData(SRC_Buffer,BUFFER_SIZE); printf(" DST:(应与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
缓冲区数据比较函数
下面是DMAC在重复-块传输模式下传输的配置代码:
列表12:代码清单20‑11缓冲区数据比较函数
左右滑动查看完整内容
/*缓冲区数据比较函数
返回0表示两个缓冲区数据一致
*/
uint8_tBufferCompare(constuint32_t*pBuffer1,constuint32_t*pBuffer2,␣
→uint16_tBufferLength)
{
/*数据长度递减*/
while(BufferLength--)
{
/*判断两个数据源是否对应相等*/
if(*pBuffer1!= *pBuffer2)
{
/*对应数据源不相等马上退出函数,并返回1*/
return1;
}
/*递增两个数据源的地址指针*/
pBuffer1++;
pBuffer2++;
}
/*完成判断并且两组数据完全一致*/
return0;
}
19.7.1.14
打印缓冲区数据函数
列表13:代码清单20‑12打印缓冲区数据函数
左右滑动查看完整内容
/*打印缓冲区数据函数
打印缓冲区数据:十六进制格式
*/
voidBufferShow_HexData(constuint32_t*pBuffer,uint16_tBufferLength)
{
while(BufferLength)
{
if((BufferLength%4)==0)
printf("
");
printf("0x%08X",*pBuffer);
pBuffer++;
BufferLength--;
}
printf("
");
}
19.7.2
下载验证
首先通过宏USE_MY_TRANSFER_INFOR_CONFIG(在bsp_dmac_m2m.h文件中)来选择是使用我们自定义的传输信息,还是使用在FSP配置界面配置的传输信息。
其次通过宏DMAC_TRANSFER_MODE(在bsp_dmac_m2m.h文件中)来选择不同的传输模式。
最后编译工程并下载到开发板上,打开串口助手可以查看程序运行打印的提示信息。如果DMAC传输成功,则蓝色LED2亮起,如果传输失败则红色LED1亮起。
-
中断
+关注
关注
5文章
920浏览量
43868 -
编译
+关注
关注
0文章
696浏览量
35275 -
回调函数
+关注
关注
0文章
95浏览量
12236
原文标题:DMAC中断回调函数等——瑞萨RA系列FSP库开发实战指南(57)
文章出处:【微信号:瑞萨嵌入式小百科,微信公众号:瑞萨嵌入式小百科】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
瑞萨RA系列FSP库开发实战指南之DMAC+UART串口收发实验
瑞萨RA6M4系列DMAC和ADC的详细介绍(1)
瑞萨e2studio(1)----瑞萨芯片之搭建FSP环境
【瑞萨RA4系列开发板体验】体验过程
HAL库中断处理以及相关的回调函数
瑞萨RA系列FSP库开发实战指南之DMAC中断回调函数等
评论