#include "SmartM_M4.h"
/*-------------------------------------------------------*/
/* 变量区 */
/*-------------------------------------------------------*/
UINT32 PDMA_TEST_LENGTH = 64;
UINT8 g_szSrcArray[260];
UINT8 g_szDestArray[260];
UINT32 VOLATILE g_bIsTestOver = 0;
/*-------------------------------------------------------*/
/* 函数区 */
/*-------------------------------------------------------*/
/****************************************
*函数名称:main
*输 入:无
*输 出:无
*功 能:函数主体
*****************************************/
INT32 main(VOID)
{
PROTECT_REG
(
/* 系统时钟初始化 */
SYS_Init(PLL_CLOCK);
/* 串口 0 初始化 */
UART0_Init(115200);
/* 使能 PDMA 时钟源 */
CLK_EnableModuleClock(PDMA_MODULE);
)
/* 源数组内容全部初始化为字母 Q */
memset(g_szSrcArray,'Q',sizeof g_szSrcArray);
/* 使能通道 2 的 PDMA 功能 */
PDMA_Open(0x4);
/* 设置通道 2 每次传输数据的宽度为 32 位,总字节数为 64*4=256 字节 */
PDMA_SetTransferCnt(2, PDMA_WIDTH_32, PDMA_TEST_LENGTH);
/* 设置通道 2 的源地址与目的地址,源地址与目的地址增量的大小 */
PDMA_SetTransferAddr(2,
(UINT32)g_szSrcArray,
PDMA_SAR_INC,
(UINT32)g_szDestArray,
PDMA_DAR_INC);
/* 设置通道 2 用于内存外设的 PDMA 传输,不使用“分散-收集”模式 */
PDMA_SetTransferMode(2, PDMA_MEM, FALSE, 0);
/* 设置通道 2 为批量传输,每次传输 4 个数据 */
PDMA_SetBurstType(2, PDMA_REQ_BURST, PDMA_BURST_4);
/* 设置通道 2 触发的中断是 PDMA 传输完成中断 */
PDMA_EnableInt(2, PDMA_INT_TRANS_DONE);
/* 使能 PDMA NVIC 中断 */
NVIC_EnableIRQ(PDMA_IRQn);
g_bIsTestOver = 0;
/* 触发通道 2PDMA 数据传输 */
PDMA_Trigger(2);
/* 等待 PDMA 传输数据完成 */
while(g_bIsTestOver == 0);
/* 检测传输的结果 */
if(g_bIsTestOver == 1)
printf("test done...\n");
else if(g_bIsTestOver == 2)
printf("target abort...\n");
printf("Dest Array:\r\n");
printf(g_szDestArray);
/* 关闭 PDMA 模块 */
PDMA_Close();
while(1);
}
/*-------------------------------------------------------*/
/* 中断服务函数 */
/*-------------------------------------------------------*/
/****************************************
*函数名称:PDMA_IRQHandler
*输 入:无
*输 出:无
*功 能:PDMA 中断服务函数
*****************************************/
VOID PDMA_IRQHandler(VOID)
{
/* 获取 PDMA 的中断状态 */
UINT32 status = PDMA_GET_INT_STATUS();
/* 检测到 PDMA 读/写目标终止中断标志 */
if(status & 0x1)
{
/* 检测是否通道 2 收到 AHB 总线错误响应 */
if(PDMA_GET_ABORT_STS() & 0x4)
g_bIsTestOver = 2;
/* 清除所有通道 AHB 总线错误响应标志位 */
PDMA_CLR_ABORT_FLAG(PDMA_ABTSTS_ABTIFn_Msk);
}
/* 检测到 PDMA 传输完成中断标志 */
else if(status & 0x2)
{
/* 检测是否通道 2 传输数据完成 */
if(PDMA_GET_TD_STS() & 0x4)
g_bIsTestOver = 1;
/* 清除所有通道传输完成标志位 */
PDMA_CLR_TD_FLAG(PDMA_TDSTS_TDIFn_Msk);
}
else
printf("unknown interrupt !!\n");
}
|