STM32 ADC DMA,UART利用DMA传送ADC数据

本文详细介绍了如何使用STM32的DMA功能来获取ADC数据并将其通过UART传输。通过配置ADC的DMA初始化和ADC设置,实现了ADC的软件触发转换和数据的连续读取。同时,设置了DMA的UART传输模式,使得ADC转换的数据能够循环发送。在主函数中,启动了ADC转换,并进入无限循环等待数据传输。
摘要由CSDN通过智能技术生成
写此文章目的:
1、记录如何用DMA获取ADC数据,及利用DMA进行uart数据传输
2、注意点:ADC使用的是软件触发,由于启用DMA功能,所以ADC只用利用 ADC_SoftwareStartConvCmd(ADC1, ENABLE)”来启动初次转换,后续自动进行,至于原因暂未搞清,待研究。
本想利用定时器触发转换的,后来看到人家的博文只要软件触发一次就好。
3、望他人指教,谢谢
 
void DMA_ADC_Init(void)
{
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
	
	DMA_DeInit(DMA1_Channel1);
	
	ADC_DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_BASE + ADC_DR_OFFSET;	//外设地址 
	ADC_DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC1ConvertedValue;			//AD转换数据存储地址 
	ADC_DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;						//DMA方向,外设到内存 
	ADC_DMA_InitStructure.DMA_BufferSize = ADC_DMA_BufferSize;					//深度 
	ADC
STM32中,可以使用DMA(直接存储器访问)来实现双通道ADC的采集。下面是一个简单的示例代码,演示了如何设置和使用DMA进行ADC采集: ```c // 定义ADC缓冲区 #define ADC_BUFFER_SIZE 1000 uint16_t adc_buffer[ADC_BUFFER_SIZE]; // 初始化ADCDMA void ADC_DMA_Init(void) { // 使能ADC时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); // 配置GPIO引脚作为模拟输入 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; // 假设通道0和通道1是用于ADC的引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置ADC ADC_InitTypeDef ADC_InitStructure; ADC_StructInit(&ADC_InitStructure); ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfConversion = 2; // 两个通道 ADC_Init(ADC1, &ADC_InitStructure); // 配置ADC通道 ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_3Cycles); ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_3Cycles); // 使能DMA时钟 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); // 配置DMA DMA_InitTypeDef DMA_InitStructure; DMA_StructInit(&DMA_InitStructure); DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(ADC1->DR); DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)adc_buffer; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = ADC_BUFFER_SIZE; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_InitStructure); // 配置DMA传输完成中断 DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE); // 使能DMA传输完成中断 NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); // 启动ADC转换 ADC_Cmd(ADC1, ENABLE); // 启动ADCDMA传输 ADC_DMACmd(ADC1, ENABLE); // 启动DMA传输 DMA_Cmd(DMA1_Channel1, ENABLE); } // DMA传输完成中断处理函数 void DMA1_Channel1_IRQHandler(void) { // 清除中断标志位 DMA_ClearITPendingBit(DMA1_IT_TC1); // 在这里处理ADC采集到的数据 // ... } int main(void) { // 初始化系统和外设 // ... // 初始化ADCDMA ADC_DMA_Init(); while (1) { // 主循环 // ... } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值