完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
直接存储器访问 (DMA) 用于在外设与存储器之间以及存储器与存储器之间提供高速数据传输。可以在无需任何 CPU 操作的情况下通过 DMA 快速移动数据。这样节省的 CPU 资源可供其它操作使用。说白了DMA就是一个搬运工,将数据从一个地方搬到另一个地方而不需要CPU处理。
作为一个搬运工,要他正常工作必须要确定几个重要的参数。 1.传输模式:数据从哪里搬到哪里。三种可能的传输方向:存储器到外设、外设到存储器或存储器到存储器。 2.通道选择:就是数据传输的是走那条道路 3.仲裁器:多个DMA传输是优先级高的优先传输。 4.数据长度:每次传输的数据长度,可以一个字节,两个字节(半字),四个字节(字) 5.指针递增:如果使能了递增模式,则下一次传输的地址将是前一次传输的地址递增 1(对于字节)、2(对于半字)或4(对于字)。 软件配置 打开STM32CubeMX新建工程。
开启串口 开启串口中断 使用直接内存存取(DMA)方式,除以上步骤外(串口中断要开启,否则程序只能发送一次数据,且不能判断DMA传输是否完成,USART一直处于busy状态)还需要设置DMA传输方向、通道、优先级、数据长度以及指针递增与否 输入工程名,选择工程路径(不要有中文),选择MDK-ARM V5;勾选Generated periphera initialization as a pair of ‘.c/.h’ files per IP ;点击GENERATE CODE,生成工程代码 在usart.c文件中,可以找到刚才的DMA设置。 hdma_usart1_rx.Instance = DMA1_Channel5; hdma_usart1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; // 传输方向 hdma_usart1_rx.Init.PeriphInc = DMA_PINC_DISABLE; // 外设地址增量模式 hdma_usart1_rx.Init.MemInc = DMA_MINC_ENABLE; // 存储器地址增量模式 hdma_usart1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;// 外设数据宽度 hdma_usart1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; // 存储器数据宽度 hdma_usart1_rx.Init.Mode = DMA_NORMAL; // 模式选择 hdma_usart1_rx.Init.Priority = DMA_PRIORITY_LOW; // 通道优先级 HAL_DMA_Init(&hdma_usart1_rx); __HAL_LINKDMA(uartHandle,hdmarx,hdma_usart1_rx); //UART与DMA绑定核心代码 /* USART1_TX Init */ hdma_usart1_tx.Instance = DMA1_Channel4; hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; // 传输方向 hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE; // 外设地址增量模式 hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE; // 存储器地址增量模式 hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;// 外设数据宽度 hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; // 存储器数据宽度 hdma_usart1_tx.Init.Mode = DMA_NORMAL; // 模式选择 hdma_usart1_tx.Init.Priority = DMA_PRIORITY_LOW; // 通道优先级 HAL_DMA_Init(&hdma_usart1_tx); __HAL_LINKDMA(uartHandle,hdmatx,hdma_usart1_tx); //UART与DMA绑定核心代码 在main函数前面添加发送的数据 /* USER CODE BEGIN PV */ uint8_t TxMsg[] = "rn*****USART communication based on DMA*****rn"; /* USER CODE END PV */ 在main()函数的while(1)循环中添加应用程序,通过DMA将数据发送出去。 /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_UART_Transmit_DMA(&huart1,TxMsg,sizeof(TxMsg)); HAL_Delay(1000); } /* USER CODE END 3 */ 编译程序并下载到开发板。用USB线连接开发板到电脑,在电脑上打开串口调试助手。选择对应的串口号,设置波特率为115200。 注意:如果不开启串口中断,则程序只能发送一次数据,程序不能判断DMA传输是否完成,USART一直处于busy状态。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1780 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1621 浏览 1 评论
1081 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
728 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1679 浏览 2 评论
1938浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
731浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
570浏览 3评论
596浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
556浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 17:27 , Processed in 0.840329 second(s), Total 77, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号