STM32F0 定时器触发ADC,多通道采样、DMA传输数据的配置
其他
2018-05-31 22:08:57
阅读次数: 0
- 本块代码实现了定时器定时触发ADC,多通道采样,并通过DMA进行数据传输到内存的操作。
- #include "adc.h"
- #define DMA_BUFFER_SIZE 6
- uint8 sample_finish = 0;
- int16 adc_dma_tab[6] = { 0 };
- uint8 sample_index = 0;
-
-
- int16 sample_1[128] = { 0 };
- int16 sample_2[128] = { 0 };
- int16 sample_3[128] = { 0 };
- int16 sample_4[128] = { 0 };
- int16 sample_5[128] = { 0 };
- int16 sample_6[128] = { 0 };
-
- void user_adc_init()
- {
- adc_gpio_init();
- adc_config();
- adc_dma_init();
- adc_timer_init();
-
- }
-
- void adc_config()
- {
- ADC_InitTypeDef adc_init_structure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
-
- ADC_DeInit(ADC1);
- ADC_StructInit(&adc_init_structure);
-
- adc_init_structure.ADC_ContinuousConvMode = DISABLE;
- adc_init_structure.ADC_DataAlign = ADC_DataAlign_Right;
- adc_init_structure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_TRGO;
- adc_init_structure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising;
- adc_init_structure.ADC_Resolution = ADC_Resolution_12b;
- adc_init_structure.ADC_ScanDirection = ADC_ScanDirection_Upward;
- ADC_Init(ADC1, &adc_init_structure);
-
- ADC_OverrunModeCmd(ADC1, ENABLE);
- ADC_ChannelConfig(ADC1, ADC_Channel_0 | ADC_Channel_1 | ADC_Channel_2
- | ADC_Channel_8 | ADC_Channel_14 | ADC_Channel_15,
- ADC_SampleTime_13_5Cycles);
- ADC_GetCalibrationFactor(ADC1);
- ADC_Cmd(ADC1, ENABLE);
- while(ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN) == RESET);
-
- ADC_DMACmd(ADC1, ENABLE);
- ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
- ADC_StartOfConversion(ADC1);
- }
-
- void adc_gpio_init()
- {
- GPIO_InitTypeDef gpio_init_structure;
-
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB | RCC_AHBPeriph_GPIOC, ENABLE);
-
- GPIO_StructInit(&gpio_init_structure);
-
- gpio_init_structure.GPIO_Pin = (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);
- gpio_init_structure.GPIO_Mode = GPIO_Mode_AN;
- gpio_init_structure.GPIO_OType = GPIO_OType_PP;
- gpio_init_structure.GPIO_Speed = GPIO_Speed_50MHz;
- gpio_init_structure.GPIO_PuPd= GPIO_PuPd_UP;
- GPIO_Init(GPIOA, &gpio_init_structure);
-
- gpio_init_structure.GPIO_Pin = GPIO_Pin_0;
- GPIO_Init(GPIOB, &gpio_init_structure);
-
- gpio_init_structure.GPIO_Pin = (GPIO_Pin_4 | GPIO_Pin_5);
- GPIO_Init(GPIOC, &gpio_init_structure);
- }
-
- void adc_dma_init()
- {
- DMA_InitTypeDef dma_init_structure;
- NVIC_InitTypeDef nvic_init_structure;
-
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
-
- nvic_init_structure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
- nvic_init_structure.NVIC_IRQChannelCmd = ENABLE;
- nvic_init_structure.NVIC_IRQChannelPriority = 0;
- NVIC_Init(&nvic_init_structure);
-
- DMA_DeInit(DMA1_Channel1);
- DMA_StructInit(&dma_init_structure);
-
- dma_init_structure.DMA_BufferSize = DMA_BUFFER_SIZE;
- dma_init_structure.DMA_DIR = DMA_DIR_PeripheralSRC;
- dma_init_structure.DMA_M2M = DISABLE;
- dma_init_structure.DMA_MemoryBaseAddr = (uint32)&adc_dma_tab[0];
- dma_init_structure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
- dma_init_structure.DMA_MemoryInc = DMA_MemoryInc_Enable;
- dma_init_structure.DMA_Mode = DMA_Mode_Circular;
- dma_init_structure.DMA_PeripheralBaseAddr = (uint32) &(ADC1->DR);
- dma_init_structure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
- dma_init_structure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
- dma_init_structure.DMA_Priority = DMA_Priority_High;
- DMA_Init(DMA1_Channel1, &dma_init_structure);
-
- DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE);
- DMA_ClearITPendingBit(DMA_IT_TC);
- DMA_Cmd(DMA1_Channel1, ENABLE);
- }
-
- void adc_timer_init()
- {
- TIM_TimeBaseInitTypeDef timer_init_structure;
- NVIC_InitTypeDef nvic_init_structure;
-
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
-
- nvic_init_structure.NVIC_IRQChannel = TIM2_IRQn;
- nvic_init_structure.NVIC_IRQChannelCmd = ENABLE;
- nvic_init_structure.NVIC_IRQChannelPriority = 0;
- NVIC_Init(&nvic_init_structure);
-
- TIM_DeInit(TIM2);
- TIM_TimeBaseStructInit(&timer_init_structure);
-
- timer_init_structure.TIM_ClockDivision = TIM_CKD_DIV1;
- timer_init_structure.TIM_CounterMode = TIM_CounterMode_Up;
- timer_init_structure.TIM_Period = 312;
- timer_init_structure.TIM_Prescaler = 48-1;
- timer_init_structure.TIM_RepetitionCounter = 0x00;
- TIM_TimeBaseInit(TIM2, &timer_init_structure);
-
- TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
- TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);
-
- TIM_Cmd(TIM2, ENABLE);
- }
-
-
-
- void TIM2_IRQHandler()
- {
- if(TIM_GetITStatus(TIM2, TIM_IT_Update))
- {
- TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
- }
- }
-
- void DMA1_Channel1_IRQHandler()
- {
- if(DMA_GetITStatus(DMA_IT_TC))
- {
- if(sample_finish == 0)
- {
- sample_1[sample_index] = adc_dma_tab[0];
- sample_2[sample_index] = adc_dma_tab[1];
- sample_3[sample_index] = adc_dma_tab[2];
- sample_4[sample_index] = adc_dma_tab[3];
- sample_5[sample_index] = adc_dma_tab[5];
- sample_6[sample_index] = adc_dma_tab[4];
- sample_index++;
- }
- if(sample_index >= 128)
- {
- sample_index = 0;
- TIM_Cmd(TIM2, DISABLE);
- DMA_Cmd(DMA1_Channel1, DISABLE);
- sample_finish = 1;
- }
- }
- DMA_ClearITPendingBit(DMA_IT_TC);
- }
转载自blog.csdn.net/weibo1230123/article/details/80480610