中级会员
 
- 积分
- 235
- 金钱
- 235
- 注册时间
- 2013-7-19
- 在线时间
- 60 小时
|
哪位大哥帮我分析下,这段程序,我这程序是定时器触发adc采集,dma搬运的,我在定时器的一个周期里一次搬运一个数据是可以的,但是在一个周期里一次搬运多个数据就不成功啊谢谢了
void TIM_Configuration(void) ///2us ((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+35999)/72M)*(1+2000)=1秒 */
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_DeInit( TIM2);//澶嶄綅TIM2瀹氭椂
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);
TIM_TimeBaseStructure.TIM_Period=3000; /* 自动重装载寄存器周期的值(计数值) */
/* 累计 TIM_Period个频率后产生一个更新或者中断 */
TIM_TimeBaseStructure.TIM_Prescaler=71; /* 时钟预分频数 72M/72 */
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; /* 采样分频 */
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; /* 向上计数模式 */
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
/* TIM1 channel1 configuration in PWM mode */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse =1800;//0x4E;
TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_Low;
TIM_OC2Init(TIM2, &TIM_OCInitStructure);
TIM_InternalClockConfig(TIM2);
TIM_ARRPreloadConfig(TIM2, ENABLE);
TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);
//TIM_UpdateDisableConfig(TIM2, DISABLE);
TIM_CtrlPWMOutputs(TIM2, ENABLE);
TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
//TIM_ClearFlag(TIM2, TIM_FLAG_Update); /*娓呴櫎鏇存柊鏍囧織浣?/
//TIM_ClearITPendingBit(TIM2, TIM_FLAG_Update); //娓呴櫎TIM2绛夊緟涓?柇鏇存柊涓?柇鏍囧織浣?
// TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //浣胯兘TIM2鐨勬洿
}
DMA_InitTypeDef DMA_InitStructure;
DMA_DeInit(DMA1_Channel1);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
/* DMA channel1 configuration */
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_ConvertedValue;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 200;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;;
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_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE);
void ADC_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
ADC_DeInit(ADC1);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE);
/* Configure PC.01 as analog input */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOC, &GPIO_InitStructure); // PC1,输入时不用设置速率
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE ;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_CC2;
//ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_1Cycles5);
ADC_DMACmd(ADC1,ENABLE);
ADC_Cmd(ADC1,ENABLE);
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
ADC_ExternalTrigConvCmd(ADC1,ENABLE);
}
main函数里面:
TIM_Cmd(TIM2, ENABLE);
DMA_Cmd(DMA1_Channel1, ENABLE);
中断里面:
void DMA1_Channel1_IRQHandler(void)
{
if(DMA_GetITStatus(DMA1_IT_TC1)) //转换完成
{
TIM_Cmd(TIM2, DISABLE);
DMA_Cmd(DMA1_Channel1, DISABLE);
for(i=0;i<200;i++)
{
lp=ADC_ConvertedValue+lp;
}
rp=lp/200;
sprintf(pstr6, "%7.5f",rp*3.3/4096);
GUI_Text((uint8_t *)pstr6,50,50,7,RED,WHITE);
GUI_Text("V1",110,50,2,RED,WHITE);
DMA_ClearITPendingBit(DMA1_IT_GL1);///* 清中断源
} |
|