DMA中断和定时器中断问题

2019-03-23 17:41发布

如题,我一个项目里,ADC通过DMA进行采样,DMA采满后进入DMA中断函数,进入函数后,打开定时器开始计时,同时处理DMA中断里面的程序,定时到后操作定时器中断,然后退出DMA中断再次采样。可是为什么每次进DMA中断后,定时器没有计时就直接操作定时器中断操作了。设置有问题吗
  1. void TIM3_Int_Init()
  2. {
  3.         TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
  4.         NVIC_InitTypeDef NVIC_InitStructure;   
  5.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
  6.   TIM_TimeBaseInitStructure.TIM_Period =3200-1 ;
  7.         TIM_TimeBaseInitStructure.TIM_Prescaler=8400-1 ;   //160ms
  8.         TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
  9.         TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;      
  10.         TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
  11.         TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
  12.         NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;
  13.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
  14.         NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
  15.         NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
  16.         NVIC_Init(&NVIC_InitStructure);
  17.   TIM_Cmd(TIM3,DISABLE);       

  18. }



  19. void TIM3_IRQHandler(void)
  20. {
  21.         if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
  22.         {

  23.                 TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  
  24.                 if(!N_3)
  25.                 {
  26.                         GPIO_SetBits(GPIOA,GPIO_Pin_7);         
  27.                 }
  28.                 else
  29.                 {
  30.                         GPIO_ResetBits(GPIOA,GPIO_Pin_7);  
  31.                 }
  32.                 N_3=!N_3;       
  33.                 change=1;
  34.         }               
  35. }


  36. void DMA2_Stream1_IRQHandler(void)
  37. {
  38.         int i=0;
  39.         TIM_Cmd(TIM3,ENABLE);
  40. /*************************/
  41. (数据处理,忽略)/*************************/
  42.         while(!change);
  43.         DMA_ClearFlag(DMA2_Stream1,DMA_FLAG_TCIF1);       
  44.         TIM_Cmd(TIM3,DISABLE);
  45.         TIM3_Int_Init();
  46.         change=0;
  47.                
  48. }
复制代码

请大神帮看看设置是否有问题。(AD采样时间为640ms)
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
16条回答
Li_Lei
1楼-- · 2019-03-23 23:13
/ 两路正弦模拟量测相位吗?还要测幅值吗?多少频率?
倒影年华
2楼-- · 2019-03-23 23:58
 精彩回答 2  元偷偷看……
倒影年华
3楼-- · 2019-03-24 00:12
求大神主力下
Li_Lei
4楼-- · 2019-03-24 03:28
本帖最后由 huo_hu 于 2017-4-21 18:08 编辑

还没看程序,有点不理解你的定时器在这里的作用是什么?
中断服务里    while(!change);是个很奇葩的东西
你调试截一下就能看出缘由,开启定时前没清标志的可能性大。
还有要enable定时器不用重新init


倒影年华
5楼-- · 2019-03-24 06:06
 精彩回答 2  元偷偷看……
倒影年华
6楼-- · 2019-03-24 10:26
huo_hu 发表于 2017-4-21 17:57
还没看程序,有点不理解你的定时器在这里的作用是什么?
中断服务里    while(!change);是个很奇葩的东西
...

试过,不重新init的话,程序就死了

一周热门 更多>