|
配置参考例程,ADC3,只是定时器换成了TIM5. 代码如下,请帮忙看看,谢谢! 刚接触F407
/* 使能 ADC3, DMA2 和 GPIO 时钟 ****************************************/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 | RCC_AHB1Periph_GPIOF |RCC_AHB1Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);
DMA_InitStructure.DMA_Channel = DMA_Channel_2;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC3_DR_Address;
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)ADC3ConvertedValue;
DMA_InitStructure.DMA_DIR =DMA_DIR_PeripheralToMemory;// DMA_DIR_PeripheralSRC; //外设数据读到向内存
DMA_InitStructure.DMA_BufferSize = ADC3CHANNELNUMBER*ADC3AVERAGETIME; //传输5*7个数据
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址不增加,因为ADC数据地址不变。
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址增加
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //半个字
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_Low;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_Init(DMA2_Stream0, &DMA_InitStructure);
/* Enable DMA2 stream0 for ADC1*/
DMA_Cmd(DMA2_Stream0, ENABLE);
//设置AD模拟输入端口为输入 10路AD 规则通道
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_3; //2014-11-7 配置3个ADC输入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10; //2014-11-7 配置3个ADC输入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOF, &GPIO_InitStructure);
/* ADC公共部分初始化**********************************************************/
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_1;
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_15Cycles;
ADC_CommonInit(&ADC_CommonInitStructure);
/* ADC3 初始化 ****************************************************************/
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_ScanConvMode = ENABLE; //模数转换工作在扫描模式(多通道)还是单次(单通道)模式
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //模数转换工作在单次模式,
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T5_CC1;//由TIM5——CC1触发
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//ADC数据右对齐
ADC_InitStructure.ADC_NbrOfConversion = ADC3CHANNELNUMBER; //规定了顺序进行规则转换的ADC通道的数目。这个数目的取值范围是1到16
ADC_Init(ADC3, &ADC_InitStructure);
/* ADC3 regular channels configuration [规则模式通道配置]*/
//ADC3 规则通道配置 ADCCHANNELNUMBER(11)个通道需要转换
//通道采样时间 55+12.5周期=67.5*1/12us=5.62us,全部扫描一遍需要5.62*11+17=78us。
//TIM5的出发周期约为310us
ADC_RegularChannelConfig(ADC3, PHASESHIFTCH, 1, ADC_SampleTime_56Cycles);
ADC_RegularChannelConfig(ADC3, PHASESHIFTCH2, 2, ADC_SampleTime_56Cycles);
ADC_RegularChannelConfig(ADC3, EXTADC3_4CH, 3, ADC_SampleTime_56Cycles);
ADC_RegularChannelConfig(ADC3, EXTADC3_5CH, 4, ADC_SampleTime_56Cycles);
ADC_RegularChannelConfig(ADC3, EXTADC3_6CH, 5, ADC_SampleTime_56Cycles); //
ADC_RegularChannelConfig(ADC3, EXTADC3_7CH, 6, ADC_SampleTime_56Cycles);
ADC_RegularChannelConfig(ADC3, EXTADC3_8CH, 7, ADC_SampleTime_56Cycles);
/* 使能DMA请求,单ADC模式 */
ADC_DMARequestAfterLastTransferCmd(ADC3, ENABLE);
ADC_DMACmd(ADC3, ENABLE);
//使能ADC1
ADC_Cmd(ADC3, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
TIM_OCStructInit(&TIM_OCInitStructure); //add 2016-1-16
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); //设置默认参数
TIM_TimeBaseStructure.TIM_Period =TIM2PERIOD; //向上计数,从0数到71,触发一次中断。正弦波频率31.25k
TIM_TimeBaseStructure.TIM_Prescaler = 10000-1; //预分频器10000,相当于计数,相当于采样频率为1M/10000=100Hz.
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //不解,和数字滤波器相关?
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数。
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = (TIM2PERIOD>>1)+1; // /2
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure);
TIM_OC1Init(TIM5, &TIM_OCInitStructure);
TIM_ARRPreloadConfig(TIM5, ENABLE);
TIM_SelectOutputTrigger(TIM5, TIM_TRGOSource_OC1Ref); //使用CC1事件作为触发输出 F407屏蔽这个。
TIM_Cmd(TIM5,ENABLE); |
|