OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7686|回复: 6

stm32用定时器触发adc采集,dma搬运的问题?

[复制链接]

7

主题

41

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2013-7-19
在线时间
60 小时
发表于 2014-4-25 09:26:06 | 显示全部楼层 |阅读模式
哪位大哥帮我分析下,这段程序,我这程序是定时器触发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);///* 清中断源
}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2013-5-24
在线时间
9 小时
发表于 2014-4-25 15:02:36 | 显示全部楼层
最好还是上传整个源码,这个没法看到你是怎么操作搬运多个数据的。
回复 支持 反对

使用道具 举报

7

主题

41

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2013-7-19
在线时间
60 小时
 楼主| 发表于 2014-4-25 19:15:04 | 显示全部楼层
问题已经解决了,多谢各位了
回复 支持 反对

使用道具 举报

19

主题

43

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
204
金钱
204
注册时间
2013-8-29
在线时间
30 小时
发表于 2014-4-27 20:31:33 | 显示全部楼层
怎么解决的,说一声啊......
回复 支持 反对

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2014-10-15 14:53:29 | 显示全部楼层
回复【3楼】aming882046:
---------------------------------
什么情况呢?
小小蜗牛
回复 支持 反对

使用道具 举报

27

主题

259

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
387
金钱
387
注册时间
2014-8-19
在线时间
0 小时
发表于 2014-10-24 16:14:20 | 显示全部楼层
回复【3楼】aming882046:
---------------------------------
?????什么情况呢?
回复 支持 反对

使用道具 举报

18

主题

67

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2015-4-19
在线时间
2 小时
发表于 2015-12-14 20:52:15 | 显示全部楼层
回复【5楼】jiutianshenjian:
---------------------------------
没有清除中断标志吧
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 07:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表