在线时间4635 小时
UID3441752
注册时间2017-11-21
NXP金币91869
TA的每日心情 | 奋斗 2024-11-8 16:43 |
---|
签到天数: 299 天 连续签到: 1 天 [LV.8]以坛为家I
管理员
  
- 积分
- 37888
- 最后登录
- 2025-4-27
|
如何使用NXP原厂SDK实现DMA操作详解
各位朋友好,逐飞科技连载的“基于RT1064的智能车应用入门指导”开发分享又来投稿啦!今天通过举例如何使用NXP原厂SDK,实现DMA操作的详解,来说明如何使用原厂的SDK。
感谢恩智浦的支持,感谢梁平老师的支持以及帮忙检查修改文中错误,感谢关注“逐飞科技”。接下来进入我们今天分享的主题----“如何使用NXP原厂SDK实现DMA操作详解”。
SDK实现DMA操作
如果有需要使用的功能,但发现逐飞科技提供的开源库里面还没有提供的话,可以自己直接调用SDK的底层,实现芯片的任意功能。
关于SDK的使用可以查看逐飞编写的库底层是如何调用SDK的,从而快速的了解SDK,并自己编写自己需求的功能。
接下来我们以DMA为例,来讲解SDK的使用。我们使用DMA来完成将一个数组中的数据拷贝到另外一个数组中。
1. DMA功能
DMA(Direct Memory Access)是直接内存访问。通过DMA访问内存可以完全不需要CPU的干预,这样将数据搬运的工作交给DMA完成,而CPU则可以干其他更重要的事,以此提高效率。
2. DMA库函数
以下函数均位于fsl_edma.c和fsl_edma.h:
EDMA_Init函数参数
EDMA_Deinit函数参数
EDMA_GetDefaultConfig函数参数
EDMA_CreateHandle函数参数
EDMA_SetCallback函数参数
EDMA_PrepareTransfer函数参数
EDMA_SubmitTransfer函数参数
EDMA_StartTransfer函数参数
EDMA_StopTransfer函数参数
EDMA_AbortTransfer函数参数
DMA使用示例
使用DMA进行内存数据拷贝
- #include "headfile.h"
- #include "fsl_edma.h"
- #include "fsl_dmamux.h"
-
- #define EXAMPLE_DMA DMA0
- #define EXAMPLE_DMAMUX DMAMUX
- #define DMA0_DMA16_DriverIRQHandler DMA_CH_0_16_DriverIRQHandler
- #define BUFF_LENGTH 4U
-
- edma_handle_t g_EDMA_Handle1;
- volatile bool g_Transfer_Done = false;
-
- //中断回调函数 void EDMA_Callback(edma_handle_t *handle, void *param, bool transferDone, uint32_t tcds)
- {
- if (transferDone)
- {
- g_Transfer_Done = true;
- }
- }
-
- AT_NONCACHEABLE_SECTION_INIT(uint32_t srcAddr[BUFF_LENGTH]) = {0x01, 0x02, 0x03, 0x04};
- AT_NONCACHEABLE_SECTION_INIT(uint32_t destAddr[BUFF_LENGTH]) = {0x00, 0x00, 0x00, 0x00};
-
-
- int main(void)
- {
- uint32_t i = 0;
- edma_transfer_config_t transferConfig;
- edma_config_t userConfig;
-
- BOARD_ConfigMPU();
- BOARD_InitPins();
- BOARD_BootClockRUN();
- BOARD_InitDebugConsole();
-
- //打印例程信息
- PRINTF("EDMA memory to memory transfer example begin.\r\n\r\n");
- PRINTF("Destination Buffer:\r\n");
- for (i = 0; i < BUFF_LENGTH; i++)
- {
- PRINTF("%d\t", destAddr[i]);
- }
- //配置DMA复用设置
- DMAMUX_Init(EXAMPLE_DMAMUX);
- #if defined(FSL_FEATURE_DMAMUX_HAS_A_ON) && FSL_FEATURE_DMAMUX_HAS_A_ON
- DMAMUX_EnableAlwaysOn(EXAMPLE_DMAMUX, 0, true);
- #else
- DMAMUX_SetSource(EXAMPLE_DMAMUX, 0, 63);
- #endif /* FSL_FEATURE_DMAMUX_HAS_A_ON */
- DMAMUX_EnableChannel(EXAMPLE_DMAMUX, 0);
- //配置EDMA为仅工作一次模式
- //userConfig.enableRoundRobinArbitration = false;
- //userConfig.enableHaltOnError = true;
- //userConfig.enableContinuousLinkMode = false;
- //userConfig.enableDebugMode = false;
- EDMA_GetDefaultConfig(&userConfig);
-
- EDMA_Init(EXAMPLE_DMA, &userConfig);
- EDMA_CreateHandle(&g_EDMA_Handle1, EXAMPLE_DMA, 0);
- EDMA_SetCallback(&g_EDMA_Handle1, EDMA_Callback, NULL);
- EDMA_PrepareTransfer(&transferConfig, srcAddr, sizeof(srcAddr[0]), destAddr, sizeof(destAddr[0]),
- sizeof(srcAddr[0]), sizeof(srcAddr), kEDMA_MemoryToMemory);
- EDMA_SubmitTransfer(&g_EDMA_Handle1, &transferConfig);
- EDMA_StartTransfer(&g_EDMA_Handle1);
-
- //等待DMA发送完成
- while (g_Transfer_Done != true)
- {
- }
-
- //打印目的数组信息
- PRINTF("\r\n\r\nEDMA memory to memory transfer example finish.\r\n\r\n");
- PRINTF("Destination Buffer:\r\n");
- for (i = 0; i < BUFF_LENGTH; i++)
- {
- PRINTF("%d\t", destAddr[i]);
- }
- while (1)
- {
- }
- }
复制代码编程要点:根据自己使用的模块包含对应的的头文件。
随着本期分享的结束,逐飞科技连载的“基于RT1064的智能车应用入门指导”开发分享也都结束了,共12期讲了19个应用示例,再次感谢NXP梁老师的支持。 大家在使用库的过程中如果遇到什么问题、或发现不足及建议请及时联系“逐飞科技”,我们将尽快完善。关注“逐飞科技”微信公众号与我们保持联系,下次再见!
|
|