#include "mmm.h"
#define SEND_BUF_SIZE 3 //·¢ËÍÊý¾Ý³¤¶È,×îºÃµÈÓÚsizeof(TEXT_TO_SEND)+2µÄÕûÊý±¶.
u8 SendBuff[SEND_BUF_SIZE];
u8 SndBuff[SEND_BUF_SIZE];
void ADC_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA ,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_0|GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL ;//BUÉÏÏÂÀ
//GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
//u32 par,u32 mar,u16 ndtr
void ADC_DMA_Init(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel=DMA2_Stream0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//ÇÀÕ¼
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//ÏàÓ¦
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
DMA_InitTypeDef DMA_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);
DMA_DeInit(DMA2_Stream0);//½«dma2µÄ0¼Ä´æÆ÷ÉèΪȱʡֵ»Ø¸´Ä¬ÈÏ״̬
//ADC_CDR_ADDR
DMA_InitStructure.DMA_Channel = DMA_Channel_0; //ͨµÀÑ¡Ôñ
DMA_InitStructure.DMA_PeripheralBaseAddr =(uint32_t)(0x40012300+0x08);//DMAÍâÉèµØÖ·
DMA_InitStructure.DMA_Memory0BaseAddr =(uint32_t)SendBuff; //DMA ´æ´¢Æ÷0µØÖ·
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;//ÍâÉèµ¹´æ´¢Æ÷
DMA_InitStructure.DMA_BufferSize =SEND_BUF_SIZE;//Êý¾Ý´«ÊäÁ¿3
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//ÍâÉè·ÇÔöÁ¿Ä£Ê½
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//´æ´¢Æ÷ÔöÁ¿Ä£Ê½
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//ÍâÉèÊý¾Ý³¤¶È:8λ
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//´æ´¢Æ÷Êý¾Ý³¤¶È:8λ
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;// ʹÓÃÑ»·Ä£Ê½
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//¸ßÓÅÏȼ¶
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//´æ´¢Æ÷Í»·¢µ¥´Î´«Êä
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//ÍâÉèÍ»·¢µ¥´Î´«Êä
DMA_Init(DMA2_Stream0, &DMA_InitStructure);//³õʼ»¯DMA Stream
//DMA_DoubleBufferModeConfig(DMA2_Stream0,(uint32_t)SndBuff,DMA_Memory_0);//DMA_Memory_0?????
//DMA_DoubleBufferModeCmd(DMA2_Stream0,ENABLE);
DMA_Cmd(DMA2_Stream0,ENABLE);//ʹÄÜdma2
//ÉèÖÃdmaÖжÏ
DMA_ClearITPendingBit(DMA2_Stream0, DMA_IT_TC);//Çå³ýÖжϱêÖ¾
DMA_ITConfig(DMA2_Stream0, DMA_IT_TC, ENABLE); //ÅäÖÃÖжÏʹÄÜ
}
void Adc_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3,ENABLE);
//ADC1£¬2£¬3¸´Î»ºÍ½áÊøADC_DeInit(ADC1)
//ADC_DeInit(ADC);
//ADC_DeInit(RCC_APB2Periph_ADC2);
//ADC_DeInit(RCC_APB2Periph_ADC3);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE); //ADC1¸´Î»
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE); //¸´Î»½áÊø
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC2,ENABLE); //ADC1¸´Î»
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC2,DISABLE); //¸´Î»½áÊø
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC3,ENABLE); //ADC1¸´Î»
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC3,DISABLE); //¸´Î»½áÊø
//ADCcommon½á¹¹Ìå³õʼ»¯
ADC_CommonInitStructure.ADC_DMAAccessMode= ADC_DMAAccessMode_1 ;//DMAģʽ²ÉÓÃÒ»¸ö½ÓÒ»¸ö
ADC_CommonInitStructure.ADC_Mode=ADC_TripleMode_RegSimult;//3ÖØÄ£Ê½
ADC_CommonInitStructure.ADC_Prescaler=ADC_Prescaler_Div4;//4·ÖƵ84/4=21M²»¸ßÓÚ36
ADC_CommonInitStructure.ADC_TwoSamplingDelay=ADC_TwoSamplingDelay_5Cycles;//½»ÌæÄ£Ê½ÓÐÓÃÁ½¸öadc²ÉÑù¼ä¸ôʱ¼ä£¬adc½»Ìæ²É¼¯ÓÐЧ
ADC_CommonInit(&ADC_CommonInitStructure);
ADC_StructInit(&ADC_InitStructure);//³õʼ»¯Ò»±éadc
ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;//Á¬Ðø
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//ÓÒ¶ÔÆë
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_T3_TRGO ;//²»¶®
ADC_InitStructure.ADC_ExternalTrigConvEdge=ADC_ExternalTrigConvEdge_Rising;//ÉÏÉýÑØ´¥·¢
ADC_InitStructure.ADC_NbrOfConversion=1;//ת»»Í¨µÀ1¸÷
ADC_InitStructure.ADC_Resolution=ADC_Resolution_12b;
ADC_InitStructure.ADC_ScanConvMode=DISABLE;//ÒòΪÿ¸öadc1¸÷ͨµÀ
ADC_Init(ADC1,&ADC_InitStructure);
ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_15Cycles);//ÅäÖÃADC1ͨµÀ1£¬Í¨µÀת»»Ë³ÐòΪ1£¬3¸÷²ÉÑùʱ¼ä
ADC_Init(ADC2,&ADC_InitStructure);
ADC_RegularChannelConfig(ADC2,ADC_Channel_1,1,ADC_SampleTime_15Cycles);
ADC_Init(ADC3,&ADC_InitStructure);
ADC_RegularChannelConfig(ADC3,ADC_Channel_2,1,ADC_SampleTime_15Cycles);
ADC_Cmd(ADC3,ENABLE);
ADC_Cmd(ADC1,ENABLE);
ADC_Cmd(ADC2,ENABLE);
//ADC_ExternalTrigConvCmdÕâ¸öÍⲿ´¥·¢Ê¹ÄÜûµÃADC_ExternalTrigConvCmd
ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);//Á¬ÐøÊ¹ÄÜDMA
ADC_DMACmd(ADC1, ENABLE);//ʹÄÜ
}
void TIM3_ADC_Init(u16 arr,u16 psc)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//ÇÀÕ¼
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//ÏàÓ¦
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;//ʱÖÓ·ÖÆµÒò×Ó
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;//ÏòÉϼÆÊý
TIM_TimeBaseInitStruct.TIM_Period=arr;//×Ô¶¯ÖØ×°ÔØÖµ
TIM_TimeBaseInitStruct.TIM_Prescaler=psc;//¶¨Ê±Æ÷·ÖƵ
TIM_TimeBaseInitStruct.TIM_RepetitionCounter =0;//ÖØ¸´¼ÆÊýÆ÷
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct); //³õʼ»¯TIM3
//ʹÄܶ¨Ê±Æ÷ÖжÏ
TIM_ARRPreloadConfig(TIM3, ENABLE);//ÔÊÐí¶¨Ê±Æ÷ÖØÔØ
TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_Update);//Ñ¡ÔñTM3µÄUpDATAʼþΪ¸üÐÂÔ´
TIM_ITConfig(TIM3,TIM_IT_Update|TIM_IT_Trigger,ENABLE); //ÔÊÐí¶¨Ê±Æ÷3¸üÐÂÖжÏ
TIM_Cmd(TIM3, ENABLE);
}
void DMA2_Stream0_IRQHandler()
{
if(DMA_GetITStatus(DMA2_Stream0,DMA_IT_TCIF0))//ÅжÏdma´«ÊäÍê³É
//printf("%.2f ",SendBuff[0]*3.3/4096);
//printf("%.2f ",SendBuff[1]*3.3/4096);
//printf("%.2f ",SendBuff[2]*3.3/4096);DMA1_IT_TC1 DMA1_FLAG_TC1
//ADC_ClearITPendingBit(ADC1,ADC_IT_OVR);
DMA_ClearITPendingBit(DMA2_Stream0, DMA_IT_TC);
}
void TIM3_IRQHandler (void)
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
// ADC_SoftwareStartConv
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
//TIM_ClearITPendingBit(TIM3,TIM_IT_Trigger);DMA_IT_TC
}
不知道你这个问题是否已经解决, 如果还没有解决的话:
如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 以帮助更多的人 ^-^