DMA带中断的内存到内存传输

控制/MCU

1877人已加入

描述

  要使用中断配置 DMA,请按照内存到内存模式部分中详述的步骤进行操作。

  在System Core 》 NVIC中启用DMA1 Channel 1 Global Interrupt如下图所示:

  

 

微控制器

 

  现在按以下键生成代码:Ctrl + S

  4.1 HAL 库 DMA 与 IT 流程↑

  DMA 初始化在main.c中生成。

  HAL_DMA_Start_IT:开始DMA缓冲区传输

  DMA1_Channel1_IRQHandler 在stm32f4xx_it.c中生成:它指示 DMA 过程是半/完成还是检测到错误。

  HAL_DMA_IRQHandler定义在stm32f4xx_hal_dma.c:处理中断信息。

  DMA_XferCpltCallback:数据正确传输完成回调函数。

  DMA_XferErrorCallback:检测到错误错误回调函数。

  

 

微控制器

 

  4.2 IT 配置的 DMA M2M↑

  我们将使用与 DMA M2M 配置中相同的代码。

  在标签/* USER CODE BEGIN 0 */和/* USER CODE END 0 */之间插入您的代码

  /* 用户代码开始 0 */

  void XferCpltCallback ( DMA_HandleTypeDef * hdma );

  uint8_t Buffer_Src [] = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 };

  uint8_t Buffer_Dest [ 10 ];

  /* 用户代码从 0 开始 */

 

  在标签/* USER CODE BEGIN 4 */和/* USER CODE END 4 */之间插入您的代码

  /* 用户代码开始 4 */

  void XferCpltCallback ( DMA_HandleTypeDef * hdma )

  {

  __NOP (); //仅当传输成功时才到达线路。在此处切换断点

  }

  /* USER CODE END 4 */

  在使用中断启动 DMA 之前,我们需要将回调设置为 DMA 结构。

  然后,可以使用 HAL_DMA_Start_IT 开始 DMA 传输。

  在标签/* USER CODE BEGIN 2 */和/* USER CODE END 2 */之间插入您的代码

  /* 用户代码开始 2 */

  hdma_memtomem_dma1_Channel1 。 XferCpltCallback =& XferCpltCallback ;

  HAL_DMA_Start_IT ( & hdma_memtomem_dma1_Channel1 ,( uint32_t ) Buffer_Src , ( uint32_t ) Buffer_Dest , 10 );

  /* 用户代码结束 2 */

  4.3编译烧录↑

  点击调试一步步运行

微控制器

  点击Resume继续执行

微控制器

  如果您在回调函数中切换断点,执行应该会自动停止。将Buffer_Src和Buffer_Dest

  添加到Expressions中,在 STM32CubeIDE 的右侧,以监控它们的值。源数据已传输到目标缓冲区。

  

 

微控制器

 
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分