新手上路
- 积分
- 31
- 金钱
- 31
- 注册时间
- 2017-3-21
- 在线时间
- 8 小时
|
1金钱
void DMA_config( u16 Size){
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 , ENABLE);
DMA_InitTypeDef DMA_InitStructure;
DMA_InitStructure.DMA_BufferSize= 25000; //要传输的数据量
DMA_InitStructure.DMA_Channel=DMA_Channel_0 ;//配置传输的通道0
DMA_InitStructure.DMA_FIFOMode=DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_FIFOThreshold=DMA_FIFOThreshold_HalfFull;
DMA_InitStructure.DMA_MemoryBurst=DMA_MemoryBurst_Single;//存储器突发传输配置 可选择增量
DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;//用来设置内存的数据长度(半字)
DMA_InitStructure.DMA_MemoryInc= DMA_MemoryInc_Enable;//存储器增量模式
DMA_InitStructure.DMA_Mode= DMA_Mode_Normal;//采集模式设置(单次采集)
DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralToMemory;//传输的方向,从外设到存储器
DMA_InitStructure.DMA_PeripheralBaseAddr=(uint32_t)ADC1_DR_ADDRESS;//DMA外设地址
DMA_InitStructure.DMA_Memory0BaseAddr=(uint32_t)&ADC1_ConvertedValue;//存储器地址
DMA_InitStructure.DMA_PeripheralBurst= DMA_PeripheralBurst_Single;//外设突发单次传输
DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;//外设数据长度 和 内存数据长度相同
DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//DMA_PeripheralInc 设置传输数据的时候外设地址是不变还是递增
DMA_InitStructure.DMA_Priority=DMA_Priority_High;//中等优先高
DMA_Init(DMA2_Stream0, &DMA_InitStructure);
//DMA_Cmd(DMA2_Stream0, ENABLE);
DMA_Cmd( DMA2_Stream0 , DISABLE );
DMA_ClearITPendingBit( DMA2_Stream0 ,DMA_IT_TCIF0 );
//DMA_ClearITPendingBit( DMA2_Stream0 ,DMA_IT_TCIF0|DMA_IT_DMEIF0|DMA_IT_TEIF0|DMA_IT_HTIF0|DMA_IT_TCIF0 );
DMA_ITConfig( DMA2_Stream0 , DMA_IT_TC , ENABLE );
}
DMA配置如上 。 从外设到内存传输,,,外设基地址是 adc的寄存器地址(不变),内存的基地址 是一个数组的首地址(增量模式)。然后我想问的是,是不是一次采样就采回来一个数据,然后 依次保存到我的数组(假设A[0],A[1],A[2]....这样 )。。
然后还有个问题就是 关于时钟周期的,,,
u32 MaxData;
u16 div=1;
while( (SystemCoreClock/2/Fre/div)>65535 )//168M/2/200000/div和 65535 比较
{
div++;
}
MaxData = SystemCoreClock/2/Fre/div - 1;
RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM2 , ENABLE ); //开启时钟
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = MaxData ;//设置溢出的数的大小
TIM_TimeBaseStructure.TIM_Prescaler = div-1;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit( TIM2 , &TIM_TimeBaseStructure );
/* PWM1 Mode configuration: Channel2 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = MaxData/2;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC2Init( TIM2 , &TIM_OCInitStructure);
TIM_OC2PreloadConfig( TIM2 , TIM_OCPreload_Enable );
TIM_ARRPreloadConfig( TIM2 , DISABLE );
TIM_Cmd( TIM2 , DISABLE ); /* TIM2 enable counter */
TIM_CtrlPWMOutputs( TIM2, ENABLE );
}
上面那段代码 ,我怎么觉得div 只能是1,然后分频系数就是0,,,
/* ADC Common Init **********************************************************/
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
ADC_CommonInit( &ADC_CommonInitStructure );
/* ADC1 Init ****************************************************************/
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T3_TRGO;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfConversion = 1;
ADC_Init( ADC1, &ADC_InitStructure );
/* ADC3 regular channel7 configuration **************************************/
ADC_RegularChannelConfig( ADC1 , ADC_Channel_2 , 1, ADC_SampleTime_3Cycles); //PA2
ADC_DMARequestAfterLastTransferCmd( ADC1 , ENABLE );
ADC_DMACmd(ADC1, ENABLE);
ADC_Cmd(ADC1, ENABLE);
ADC_SoftwareStartConv( ADC1 );
ADC配置是上面这样的,分频系数是2 分频 (168M/2 频率就是 84M),然后采样时间是 12.5+ (ADC_SampleTime_3Cycles)) 3 个周期,
他说 采样周期 是5us 采样频率是 200k 这个是怎么计算,还是在哪设置了.... 我始终 计算不出来
|
最佳答案
查看完整内容[请看2#楼]
首先ADC的采样周期是可以设置的,有1.5 7.5 13.5 28.5 41.5 55.5 71.5 139.5几个。
还有一个公式:ADC采样频率=ADC CLOCK / (12.5+ADC配置的采样周期)
|