STM32 定时器触发ADC且用DMA来搬运数据。

2019-07-20 01:11发布

我想设置一个1Khz的采样率来采集数据。要采集1000个点。请问程序怎么写啊。。ADC的采样率貌似的用定时器来完成。然后1000个点我用DMA来拟定。只要1000个点我就近DMA中断取数且分析。程序谁有代码给我看看。。另复上我百度的。不知道能用否。
void stm32ADCDMA(void)
{
        ADC_InitTypeDef ADC_InitStructure;
        NVIC_InitTypeDef    NVIC_InitStructure;
        DMA_InitTypeDef DMA_InitStructure;  //定义DMA初始化结构体

        adc_GPIO_Init();     //
模拟口初始化

        ADC_DeInit(ADC1);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);

        /* ADC1 configuration ------------------------------------------------------*/
        ADC_InitStructure.ADC_Mode  = ADC_Mode_Independent;        //
独立模式
        ADC_InitStructure.ADC_ScanConvMode = ENABLE;                //
扫描模式
        ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;        //
单次转换
        ADC_InitStructure.ADC_ExternalTrigConv =ADC_ExternalTrigConv_T2_CC2;   //
TIM2CC2触发
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;  //
数据右对齐
        ADC_InitStructure.ADC_NbrOfChannel =7;                                //
采样一个通道
        ADC_Init(ADC1, &ADC_InitStructure);


        ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1,ADC_SampleTime_13Cycles5);
        ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2,ADC_SampleTime_13Cycles5);
        ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3,ADC_SampleTime_13Cycles5);
        ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4,ADC_SampleTime_13Cycles5);
        ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 5,ADC_SampleTime_13Cycles5);
        ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 6,ADC_SampleTime_13Cycles5);
        ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 7,ADC_SampleTime_13Cycles5);



        ADC_DMACmd(ADC1, ENABLE);
        ADC_Cmd(ADC1, ENABLE);            //
启动ADC1
        ADC_ResetCalibration(ADC1);         //
重置ADC1的校准寄存器
        while (ADC_GetResetCalibrationStatus(ADC1));         //
获取ADC重置校准寄存器的状态
        ADC_StartCalibration(ADC1);                                                //
开始ADC1的校准程序
        while (ADC_GetCalibrationStatus(ADC1));                         //
等待ADC1校准结束
       
 
        ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE); //使能ADC中断
        ADC_ExternalTrigConvCmd(ADC1, ENABLE);//
使能ADC经外部触发启动转换功能


        NVIC_InitStructure.NVIC_IRQChannel  = ADC1_2_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//
先占优先级0
        NVIC_InitStructure.NVIC_IRQChannelSubPriority   = 0;   //
从优先级
        NVIC_InitStructure.NVIC_IRQChannelCmd   = ENABLE;
        NVIC_Init(&NVIC_InitStructure);

           /*DMA
相关设置*/
           RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//
初始化DMA时钟


        DMA_DeInit(DMA1_Channel1);
        DMA_InitStructure.DMA_PeripheralBaseAddr=ADC1_DR_Address;//
外设地址
        DMA_InitStructure.DMA_MemoryBaseAddr=(u32)AdcResult;//
内存地址
        DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;//DMA
传输方向单向
        DMA_InitStructure.DMA_BufferSize=7;//
设置DMA在传输时缓冲区的长度  word
        DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//
设置DMA的外设递增模式,一个外设
        DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;//
设置DMA的内存递增模式
        DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;//
外设数据字长 16bit
        DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;//
内存数据字长 16bit
        DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;//
设置DMA的传输模式:连续不断的循环模式
        DMA_InitStructure.DMA_Priority=DMA_Priority_VeryHigh;//DMA
优先级别最高  4 High/Medium/Low
        DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;//
设置DMA2memory中的变量互相访问禁止
        DMA_Init(DMA1_Channel1,&DMA_InitStructure);//
按照DMA_InitStructure变量初始化DMA1的通道1
        DMA_Cmd(DMA1_Channel1,ENABLE);//
允许DMA通道1传输
       
 
        DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE);//使能DMA通道1中断
        DMA_ClearFlag(DMA1_FLAG_TC1);//
清除Channel1中断
       
 
        /*配置DMA的中断通道*/
        NVIC_InitStructure.NVIC_IRQChannel=DMA1_Channel1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);
}


然后定时器的配方没找到。。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
18条回答
jiutianshenjian
2019-07-20 14:37
回复【6楼】敌害:
---------------------------------
你的1KHz应该是指每个采样点之间是1ms吧?
那就不是前面我说的一个周期1ms

你配置的定时器是1ms溢出采样一次的话,远大于21微秒。
写最大的239.5吧。
你只要两个采样点间隔时间大于准备好的时间,239.5+12.5再乘以1/12就行了。

我也是自己总结的,不一定说的准确。

一周热门 更多>