生活随笔
收集整理的這篇文章主要介紹了
STM32F0 定时器触发ADC,多通道采样、DMA传输数据的配置
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本塊代碼實現了定時器定時觸發ADC,多通道采樣,并通過DMA進行數據傳輸到內存的操作。
#include????"adc.h"??
[cpp]?view plaincopy
#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);?????????????????????}
總結
以上是生活随笔為你收集整理的STM32F0 定时器触发ADC,多通道采样、DMA传输数据的配置的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。