stm32高速adc数据dma 转运采集代码
时间: 2023-11-06 15:05:13 浏览: 191
stm32 dma代码转发
以下是一份基于STM32的高速ADC数据DMA转移采集代码,仅供参考:
```c
#include "stm32f4xx.h"
#include "stm32f4xx_dma.h"
#include "stm32f4xx_adc.h"
#define ADC1_DR_ADDRESS ((uint32_t)0x4001204C)
uint16_t ADCConvertedValues[2]; // 存储ADC转换结果的数组
void DMA_Config(void)
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE); // 使能DMA2时钟
DMA_InitStructure.DMA_Channel = DMA_Channel_0; // DMA通道0
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_ADDRESS; // 外设地址,即ADC数据寄存器地址
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADCConvertedValues; // 存储ADC转换结果的数组地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; // 数据传输方向,从外设到内存
DMA_InitStructure.DMA_BufferSize = 2; // 数据传输量为2个
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // 关闭外设地址自增
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; // 开启存储数组地址自增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; // 外设数据大小为半字(16位)
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; // 存储数组数据大小为半字(16位)
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; // 循环模式
DMA_InitStructure.DMA_Priority = DMA_Priority_High; // DMA传输优先级为高
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; // 关闭FIFO模式
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; // 存储数组burst为单次传输
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; // 外设burst为单次传输
DMA_Init(DMA2_Stream0, &DMA_InitStructure); // 初始化DMA2 Stream0
DMA_Cmd(DMA2_Stream0, ENABLE); // 使能DMA2 Stream0
}
void ADC_Config(void)
{
ADC_CommonInitTypeDef ADC_CommonInitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); // 使能ADC时钟
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent; // 独立模式
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2; // 分频系数为2
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; // 关闭DMA访问模式
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles; // 两个采样阶段之间的延迟为5个时钟周期
ADC_CommonInit(&ADC_CommonInitStructure); // 初始化ADC公共部分
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; // ADC分辨率为12位
ADC_InitStructure.ADC_ScanConvMode = DISABLE; // 禁止扫描模式
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; // 开启连续转换模式
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; // 禁止外部触发
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1; // 外部触发信号为TIM1的CC1
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // 右对齐
ADC_InitStructure.ADC_NbrOfConversion = 1; // 转换通道数量为1
ADC_Init(ADC1, &ADC_InitStructure); // 初始化ADC1
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_3Cycles); // 配置ADC1的转换通道为通道0,采样时间为3个时钟周期
ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE); // DMA传输请求在连续转换模式下结束后开启
ADC_DMACmd(ADC1, ENABLE); // 开启ADC1的DMA转换模式
ADC_Cmd(ADC1, ENABLE); // 使能ADC1
}
int main(void)
{
DMA_Config(); // 配置DMA
ADC_Config(); // 配置ADC
while (1);
}
```
这份代码的主要思路是使用DMA来实现高速ADC数据转移和采集。其中,ADC转换结果存储在一个数组中,由DMA定期地将其从ADC数据寄存器中读取并传输到数组中。这样,我们就可以在不中断CPU的情况下实现高速ADC数据的采集。
阅读全文