- #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");
- }
|