8821|16

46

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

DMA中断和定时器中断问题 [复制链接]

 
如题,我一个项目里,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)
此帖出自stm32/stm8论坛

最新回复

是要考虑被测信号频率会变化啊,不然还测它干嘛。   详情 回复 发表于 2017-4-26 15:28
点赞 关注
 

回复
举报

4005

帖子

0

TA的资源

版主

推荐
 
两路正弦模拟量测相位吗?还要测幅值吗?多少频率?
此帖出自stm32/stm8论坛

点评

幅度,频率都要测量的,25Hz的  详情 回复 发表于 2017-4-24 17:28
 
 

回复

46

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
顶,求助
此帖出自stm32/stm8论坛
 
 

回复

46

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
求大神主力下
此帖出自stm32/stm8论坛
 
 
 

回复

4005

帖子

0

TA的资源

版主

4
 
本帖最后由 huo_hu 于 2017-4-21 18:08 编辑

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


此帖出自stm32/stm8论坛

点评

试过,不重新init的话,程序就死了  详情 回复 发表于 2017-4-21 18:21
整体其实是用来测相位差的功能。 定时器的作用是进行一个精准时间控制,用来切换通道, while(!change);是用来等待定时器操作,等待通道切换后再清DMA再次采集。 我试过,如果在开定时器前,就是初始化里面把清零  详情 回复 发表于 2017-4-21 18:14
 
 
 

回复

46

帖子

0

TA的资源

一粒金砂(中级)

5
 
huo_hu 发表于 2017-4-21 17:57
还没看程序,有点不理解你的定时器在这里的作用是什么?
中断服务里    while(!change);是个很奇葩的东西
...

整体其实是用来测相位差的功能。
定时器的作用是进行一个精准时间控制,用来切换通道,
while(!change);是用来等待定时器操作,等待通道切换后再清DMA再次采集。
我试过,如果在开定时器前,就是初始化里面把清零标志清零,后面则卡在了while的等待位置了。
对于init我试一下不重复看看
此帖出自stm32/stm8论坛
 
 
 

回复

46

帖子

0

TA的资源

一粒金砂(中级)

6
 
huo_hu 发表于 2017-4-21 17:57
还没看程序,有点不理解你的定时器在这里的作用是什么?
中断服务里    while(!change);是个很奇葩的东西
...

试过,不重新init的话,程序就死了
此帖出自stm32/stm8论坛
 
 
 

回复

4005

帖子

0

TA的资源

版主

7
 
测脉宽不用ADC啊,你这么做DMA毫无意义。
你把设计目标摆出来,看看应该怎么做最合理。
此帖出自stm32/stm8论坛

点评

我是分别测两个通道值,来计算相位差的,没有测脉宽啊,我发现问题似乎是我用的DMA模式错误,应该用单次模式,可是单次模式后我想在定时器中断中再次打开DMA,就是打开不成功了。 void DMA_Enable(DMA_Stream_TypeD  详情 回复 发表于 2017-4-24 15:03
 
 
 

回复

46

帖子

0

TA的资源

一粒金砂(中级)

8
 
huo_hu 发表于 2017-4-22 11:45
测脉宽不用ADC啊,你这么做DMA毫无意义。
你把设计目标摆出来,看看应该怎么做最合理。

我是分别测两个通道值,来计算相位差的,没有测脉宽啊,我发现问题似乎是我用的DMA模式错误,应该用单次模式,可是单次模式后我想在定时器中断中再次打开DMA,就是打开不成功了。
void DMA_Enable(DMA_Stream_TypeDef *DMA_Streamx, u16 num)
{
        DMA_Cmd(DMA_Streamx, DISABLE);                         //1رÕDMA
        while (DMA_GetCmdStatus(DMA_Streamx) !=DISABLE ){}     //è·±£DMA¿éòÔ±»éèÖÃ
        DMA_SetCurrDataCounter(DMA_Streamx, num);
        DMA_Cmd(DMA_Streamx,ENABLE);
}
这是我按着原子的程序写的,可是在定时器中断中调用并没反应,DMA启动一次就不启动了。帮看看
此帖出自stm32/stm8论坛
 
 
 

回复

46

帖子

0

TA的资源

一粒金砂(中级)

10
 
huo_hu 发表于 2017-4-24 15:44
两路正弦模拟量测相位吗?还要测幅值吗?多少频率?

幅度,频率都要测量的,25Hz的
此帖出自stm32/stm8论坛
 
 
 

回复

4005

帖子

0

TA的资源

版主

11
 
那差得远呢,我建议你测频率和相位最好还是用比较器转换成方波。我以前做过类似项目,经验大大的
此帖出自stm32/stm8论坛

点评

板子已经成型了,时间不允许了。。。  详情 回复 发表于 2017-4-26 10:02
 
 
 

回复

46

帖子

0

TA的资源

一粒金砂(中级)

12
 
huo_hu 发表于 2017-4-24 18:36
那差得远呢,我建议你测频率和相位最好还是用比较器转换成方波。我以前做过类似项目,经验大大的

板子已经成型了,时间不允许了。。。
此帖出自stm32/stm8论坛
 
 
 

回复

4005

帖子

0

TA的资源

版主

13
 
那就纯ad数据解算,用不着定时器。
此帖出自stm32/stm8论坛

点评

我是两路信号分时采样的,要严格控制间隔时间为信号周期整数倍,现在我的问题是只能测准0和180度,其它度数测不准,测的结果基本是每次结果逐渐加一度左右连续变化或者减,这是啥原因呢?  详情 回复 发表于 2017-4-26 12:16
我是两路信号分时采样的,要严格控制间隔时间为信号周期整数倍,现在我的问题是只能测准0和180度,其它度数测不准,测的结果基本是每次结果逐渐加一度左右连续变化或者减,这是啥原因呢?  详情 回复 发表于 2017-4-26 12:16
 
 
 

回复

46

帖子

0

TA的资源

一粒金砂(中级)

14
 
huo_hu 发表于 2017-4-26 11:18
那就纯ad数据解算,用不着定时器。

我是两路信号分时采样的,要严格控制间隔时间为信号周期整数倍,现在我的问题是只能测准0和180度,其它度数测不准,测的结果基本是每次结果逐渐加一度左右连续变化或者减,这是啥原因呢?
此帖出自stm32/stm8论坛
 
 
 

回复

46

帖子

0

TA的资源

一粒金砂(中级)

15
 
huo_hu 发表于 2017-4-26 11:18
那就纯ad数据解算,用不着定时器。

我是两路信号分时采样的,要严格控制间隔时间为信号周期整数倍,现在我的问题是只能测准0和180度,其它度数测不准,测的结果基本是每次结果逐渐加一度左右连续变化或者减,这是啥原因呢?
此帖出自stm32/stm8论坛
 
 
 

回复

4005

帖子

0

TA的资源

版主

16
 
是要考虑被测信号频率会变化啊,不然还测它干嘛。
此帖出自stm32/stm8论坛

点评

今天才看,那个我解决了,我测量的信号是标准25Hz信号,所以不用考虑变化  详情 回复 发表于 2017-5-7 12:18
 
 
 

回复

46

帖子

0

TA的资源

一粒金砂(中级)

17
 
huo_hu 发表于 2017-4-26 15:28
是要考虑被测信号频率会变化啊,不然还测它干嘛。

今天才看,那个我解决了,我测量的信号是标准25Hz信号,所以不用考虑变化
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表