你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32定时器问题

[复制链接]
kingg209 提问时间:2014-4-2 13:56 /
利用stm32定时器3产生0.5s的定时,用current detect程序启动定时器,循环检测adc信号,定时器中断程序改变adcflag 值,current detect程序停止定时器。
但现在进入不了定时器3中断程序。怎么回事呢?给指点一下啊!谢谢啊!

void Init_TIMER3(void)//初始化
{
TIM_TimeBaseInitTypeDef  TIM_BaseInitStructure;   //
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);    //!!
TIM_DeInit( TIM3);                                //
TIM_InternalClockConfig(TIM3);        //  
TIM_BaseInitStructure.TIM_Period = 5000;   
  TIM_BaseInitStructure.TIM_Prescaler = 7199;    
TIM_BaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; //时钟分割为0   
TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;           
TIM_TimeBaseInit(TIM3, &TIM_BaseInitStructure);   
TIM_ClearFlag(TIM3, TIM_FLAG_Update);      //     
    TIM_ARRPreloadConfig(TIM3, DISABLE);     //
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);     //
//TIM_Cmd(TIM3, ENABLE);          //
}

void TIM3_IRQHandler(void)//定时器3中断
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)   //
  {
    TIM_ClearITPendingBit(TIM3, TIM_IT_Update);        //
     ADCflag=0; 
   }
}  
/*****************************************************************************
void Current_detect(void)
{
    ADCflag=1;
    TIMadc=0;
   TIM_Cmd(TIM3, ENABLE);
    while(ADCflag)
  {
     ADC_GetConversionValue(ADC1);    
     if(AD_Value[3]>AD_Value[8])  array_Ia[TIMadc]=AD_Value[3]-AD_Value[8];
     else     array_Ia[TIMadc]=AD_Value[8]-AD_Value[3];
     TIMadc++;   
}
 TIM_Cmd(TIM3, DISABLE); 
}
 
收藏 评论16 发布时间:2014-4-2 13:56

举报

16个回答
废鱼 回答时间:2014-4-2 16:00:11

RE:stm32定时器问题

TIM3是就没有进去过中断吗?TIM3的时钟是否开启了?TIM3的NVIC中断也没有配置。
pythonworld 回答时间:2014-4-2 22:03:34

RE:stm32定时器问题

同意楼上看法,另外TIM_DeInit( TIM3)起什么作用
kingg209 回答时间:2014-4-3 07:09:44

回复:stm32定时器问题

回复第 2 楼 于2014-04-02 16:00:11发表:
TIM3是就没有进去过中断吗?TIM3的时钟是否开启了?TIM3的NVIC中断也没有配置。
 
 
这些都配置了,现在是把current detect中的循环去掉就能进入中断,加上循环就进不去。
 
废鱼 回答时间:2014-4-3 10:47:10

RE:stm32定时器问题

void Current_detect(void)
在哪儿调用的?
那片清茶 回答时间:2014-4-3 11:54:54

RE:stm32定时器问题

你可以把整个工程都贴出来,这样我们可以为你更好地找到问题
pythonworld 回答时间:2014-4-3 14:14:35

RE:stm32定时器问题

ADCflag 定义的什么类型, 应该是volatile
dlyt03 回答时间:2014-4-3 14:43:12

RE:stm32定时器问题

你把void Current_detect(void)函数中
ADCflag=1;
放在TIM_Cmd(TIM3, DISABLE); 后试试看
废鱼 回答时间:2014-4-3 15:58:45

RE:stm32定时器问题

我认为楼主这样的写法不合理,应该是在定时器中加个计数器,然后通过这个计数器来做时间差的处理,这样就可以避免这种情况。
kingg209 回答时间:2014-4-3 18:49:53

回复:stm32定时器问题

回复第 5 楼 于2014-04-03 10:47:10发表:
void Current_detect(void)
在哪儿调用的?
在主函数中调用的
main()
{
whilei(1)
current detect();
}
 
我爱下载 回答时间:2014-4-4 14:55:57

RE:stm32定时器问题

你应该配置NVIC啊,在开启定时器
fengye5340 回答时间:2014-4-4 20:24:53

RE:stm32定时器问题

main()
{
    NVIC_config();
    Init_TIMER3();
    ADC_INT();
    ADCflag=0;
    TIM_Cmd(TIM3, ENABLE);
    while(1)
    {
     if(ADCflag)
     {   TIM_Cmd(TIM3,DISABLE);
         ADC_GetConversionValue(ADC1);   
         if(AD_Value[3]>AD_Value[8])  array_Ia[TIMadc]=AD_Value[3]-AD_Value[8];
         else     array_Ia[TIMadc]=AD_Value[8]-AD_Value[3];
         
         TIM_Cmd(TIM3, ENABLE);
      }  
     }

}
void TIM3_IRQHandler(void)//定时器3中断
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)   //
  {
    TIM_ClearITPendingBit(TIM3, TIM_IT_Update);        //
     ADCflag=1;
   }
}   
我帮楼主改了一下架构,你试试,上电启动定时器,0.5S中断后,开启ADC采集,采集完毕重新启动定时器
wkuang 回答时间:2014-4-6 23:44:05

RE:stm32定时器问题

需要修改中断配置;
1、使能中断;
2、把中断函数与向量表映射起来;
3、把需要设置的时钟都使能
kingg209 回答时间:2014-4-10 07:18:00

回复:stm32定时器问题

谢谢啊,可是这样一个循环只检测一次,而不是一个周期的啊。另外,实在0.5s之后执行,而不是0.5s之内执行的啊。
我是想在一个0.5s周期内检测,然后取均方根计算有效值。
回复第 12 楼 于2014-04-04 20:24:53发表:
main()
{
NVIC_config();
Init_TIMER3();
ADC_INT();
ADCflag=0;
TIM_Cmd(TIM3, ENABLE);
while(1)
{
if(ADCflag)
{   TIM_Cmd(TIM3,DISABLE);
ADC_GetConversionValue(ADC1);   
if(AD_Value[3]>AD_Value[8])  array_Ia[TIMadc]=AD_Value[3]-AD_Value[8];
else     array_Ia[TIMadc]=AD_Value[8]-AD_Value[3];

TIM_Cmd(TIM3, ENABLE);
}  
}

}
void TIM3_IRQHandler(void)//定时器3中断
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)   //
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);        //
ADCflag=1;
}
}   
我帮楼主改了一下架构,你试试,上电启动定时器,0.5S中断后,开启ADC采集,采集完毕重新启动定时器
 
kingg209 回答时间:2014-4-10 07:19:27

回复:stm32定时器问题

回复第 8 楼 于2014-04-03 14:43:12发表:
你把void Current_detect(void)函数中
ADCflag=1;
放在TIM_Cmd(TIM3, DISABLE); 后试试看
 
谢谢,还是不行。
 
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版