时间:2025-12-26 09:25
人气:
作者:admin
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);
/