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

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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版