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

程序卡在定时中断里跳不出来

[复制链接]
jstiger 提问时间:2019-5-6 15:01 /
我用之前的定时器TIM2程序移植到新板子(新板子就增加几个IO外接),想先驱动LED看看,可发现LED就是不能亮灭,在原先板子上正常。程序如下:

int main(void)
{
  RCC_GetClocksFreq(&RCC_Clocks);                    //获取系统时钟频率,外部晶振8.00M,倍频后系统时钟8.000*8/2=32.00M
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);    //中断优先级分组配置
  LED_Init();                                                //LED指示灯引脚初始化
  TIMER2_delayinit(65535,31);                        //TIM2延时初始化,1us  
  TIM3_Counter_init();                               //TIM3脉冲计时初始化

  while(1)
  {
       LED_ON();      //打开LED
      for(int i=0;i<1000;i++)               //延时1s
      TIMER2_usdelay(1000);      
      LED_OFF();     //关闭LED
   }
}

在IAR上debug发现程序一直在 for(int i=0;i<1000;i++)  里跳不出去,以为1000过大不容易发现,改成i<10并单步执行,还是跳不出去。不知怎么回事?

//使用timer2 进行准确延时1us
void TIMER2_delayinit(u32 arr,u16 psc)
{
  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;  
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
   TIM_TimeBaseStructure.TIM_Period = arr;             /*该数值为计数器计数次数*/
  TIM_TimeBaseStructure.TIM_Prescaler = psc;
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  TIM_ClearFlag(TIM2, TIM_FLAG_Update);             //清除更新标志
  TIM_SetCounter(TIM2, 0);
    TIM_Cmd(TIM2, DISABLE);                           /* TIM counter disable*/
}


//TIM2延时
void TIMER2_usdelay(uint32_t usdelay)
{
  uint32_t tmp;
  tmp= 65535 - usdelay;      
  TIM_SetCounter(TIM2, tmp);
  TIM_Cmd(TIM2, ENABLE);
  while(TIM_GetFlagStatus(TIM2, TIM_FLAG_Update) == RESET);
  TIM_Cmd(TIM2, DISABLE);
  TIM_ClearFlag(TIM2, TIM_FLAG_Update);
}


收藏 评论5 发布时间:2019-5-6 15:01

举报

5个回答
wenyangzeng 回答时间:2019-5-6 15:34:03
在for()里跳不出去基本上是C++优化等级太高了。
另外貌似系统时钟未初始化。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

jstiger 回答时间:2019-5-6 15:42:07
wenyangzeng 发表于 2019-5-6 15:34
在for()里跳不出去基本上是C++优化等级太高了。
另外貌似系统时钟未初始化。 ...

时钟已经初始化了,貌似我贴得不全。

C++优化等级太高是啥意思?怎么解决啊?
MrJiu 回答时间:2019-5-6 15:49:33
看一下i的值有木有变化不就得了!!!

评分

参与人数 1蝴蝶豆 +1 收起 理由
STMCU + 1

查看全部评分

子曰好人 回答时间:2019-5-6 17:19:13
不建议用这种方式来做延时,这种属于阻塞方式,在等待延时的时候CPU都不能做其他事情;建议使用标志位,让Timer开进入中断里对标志进行置位,再在while里面进行轮询标志位。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

wenyangzeng 回答时间:2019-5-6 21:08:19
jstiger 发表于 2019-5-6 15:42
时钟已经初始化了,貌似我贴得不全。

C++优化等级太高是啥意思?怎么解决啊? ...
这里检查一下

无标题.png

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版