欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 文化 > stm32使用DMA将内存数据发送到串口

stm32使用DMA将内存数据发送到串口

2025/11/7 16:30:43 来源:https://blog.csdn.net/m0_46145044/article/details/140303957  浏览:    关键词:stm32使用DMA将内存数据发送到串口

Driver_DMA.c

#include "Driver_DMA.h"/*** @description: 初始化DMA1_Channel4*/
void Driver_DMA1_Init(void)
{/* 1. 开启 DAM 时钟 */RCC->AHBENR |= RCC_AHBENR_DMA1EN;/* 2. DMA相关的配置 *//* 2.1 DMA方向: 从存储器(RAM)到串口(外设) . 通道4*/DMA1_Channel4->CCR |= DMA_CCR4_DIR; // 0: 从外设读 1:从存储器读/* 2.2 设置存储器和外设的数据宽度:  8位(一个字节) 16位(半字) 32位(字) */DMA1_Channel4->CCR &= ~DMA_CCR4_PSIZE; /* 00:8位 01:16位 10:32位 11:保留 */DMA1_Channel4->CCR &= ~DMA_CCR4_MSIZE;/* 2.3 设置外设和存储器的地址是否自增 */DMA1_Channel4->CCR &= ~DMA_CCR4_PINC; /* 串口外设地址不能自增 */DMA1_Channel4->CCR |= DMA_CCR4_MINC; /* 存储器地址自增 *//* 2.4 开启传输完成的中断 */DMA1_Channel4->CCR |= DMA_CCR4_TCIE;/* 2.5 使能串口的DMA传输 */USART1->CR3 |= USART_CR3_DMAT;/* 2.6 开启循环模式 */DMA1_Channel4->CCR |= DMA_CCR4_CIRC;/* 2.5 NVIC的设置 */NVIC_SetPriorityGrouping(3);NVIC_SetPriority(DMA1_Channel4_IRQn, 3);NVIC_EnableIRQ(DMA1_Channel4_IRQn);
}
/*** @description: 启动DMA传输数据* @param {uint32_t} srcAddr 源地址* @param {uint32_t} desAddr 目的地址* @param {uint16_t} dataLen 要传输的数据长度*/
void Driver_DMA1_TransimitData(uint32_t srcAddr,uint32_t desAddr,uint16_t dataLen)
{/* 1. 设置外设地址 */DMA1_Channel4->CPAR = desAddr;/* 2. 设置存储器地址 */DMA1_Channel4->CMAR = srcAddr;/* 3. 设置要传输的数据量 */;DMA1_Channel4->CNDTR = dataLen;/* 4. 开启通道,开始传输 */DMA1_Channel4->CCR |= DMA_CCR4_EN;
}uint8_t isTransmitFinished = 0;
void DMA1_Channel4_IRQHandler(void)
{if (DMA1->ISR & DMA_ISR_TCIF4){/* 清除传输完成中断完成标志位 */DMA1->IFCR |= DMA_IFCR_CGIF4;/* 通道不需要了,可以关闭 *///DMA1_Channel4->CCR &= ~DMA_CCR4_EN;isTransmitFinished = 1;}
}

Driver_DMA.h

#ifndef __DRIVER_DMA_H
#define __DRIVER_DMA_H
#include "stm32f10x.h"
#include "stdio.h"extern uint8_t isTransmitFinished;
void Driver_DMA1_Init(void);void Driver_DMA1_TransimitData(uint32_t srcAddr, uint32_t desAddr, uint16_t dataLen);#endif

main.c

#include "Driver_USART.h"#include "Driver_TIM1.h"
#include "Driver_DMA.h"
#include "Delay.h"uint8_t src[] = {'a', 'b', 'c', 'd'};int main()
{Driver_USART1_Init();printf("RAM->USART...\r\n");Driver_DMA1_Init();Delay_ms(1000);Driver_DMA1_TransimitData((uint32_t)&src[0], (uint32_t)(&(USART1->DR)), 4);while (1){}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词