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

stm32使能timer3导致程序不正常运行的问题

[复制链接]
hqw 提问时间:2018-4-12 13:21 /
主程序非常简单,就是一个跑马灯:int main(void)
{
  extern uint8_t uart_input_finish;
  extern uint16_t uart_input_count;

Bsp_Init();
               
        while(1)
  {
      GPIO_WriteBit(GPIOB, GPIO_Pin_6, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_6)));
                   Delay_ms(6000);
        }               
}


但如果下面这句TIM3_Count_Init(9999,719);屏蔽它就可以正常跑灯,不屏蔽则没反应,应该是死机?
static void Bsp_Init(void)
{
  RCC_Configuration();
  NVIC_Configuration();

        TIM3_Count_Init(9999,719);//1ms//NG
}

或者:不屏蔽IM3_Count_Init(9999,719);改成屏蔽 TIM_Cmd(TIM3, (FunctionalState)ENABLE); 这句也是可以正常跑灯的。
void TIM3_Count_Init(u16 arr,u16 psc)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  NVIC_InitTypeDef NVIC_InitStructure;

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, (FunctionalState)ENABLE);                          
  TIM_DeInit(TIM3);

  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(TIM3, &TIM_TimeBaseStructure);                              

  TIM_ClearFlag(TIM3, TIM_FLAG_Update);
  TIM_ITConfig(TIM3,TIM_IT_Update, (FunctionalState)ENABLE);                                 

  NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;                              
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;                     
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4;                           
  NVIC_InitStructure.NVIC_IRQChannelCmd = (FunctionalState)ENABLE;                             
  NVIC_Init(&NVIC_InitStructure);                                             

  Timer_Count_Value = 0;
  Timer3_Value = 0;
                                       TIM_Cmd(TIM3, (FunctionalState)ENABLE);                                                      
}



我反复看了它的中断服务涵数,也没看出哪有不妥:
void TIM3_IRQHandler(void)                                  
{
  static uint8_t sec_count = 0;
  static uint8_t min_count = 0;

  if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
  {
    TIM_ClearITPendingBit(TIM3, TIM_IT_Update);

    Timer_Count_Value ++;

    if(Timer_Count_Value % 250 == 0)
    {
      Timer3_Value ++;
      if(Timer3_Value == 12)
      {
        Timer3_Value = 0;
      }

      if(Timer3_Value % 4 == 0)
      {
        sec_count ++;
        if(sec_count >= 15)                                                     
        {
          is_read_time = 1;
          sec_count = 0;
        }

        if(FlashBuffer.power_switch == 1)
        {
          min_count ++;
          if(min_count >= 60)
          {

            min_count = 0;
            FlashBuffer.run_time ++;
            if(FlashBuffer.run_time % 30 == 0)
            {
              //±£´æÔËÐÐʱ¼ä
              Earse_Flash(PARA_ADDR);
              if(Write_Flash(PARA_ADDR,(unsigned char *)&FlashBuffer,sizeof(FlashBuffer)) == ERROR)
              {
              }
            }
          }
        }
        else
        {
          min_count = 0;
        }
      }
    }
  }
}



@toofree

desk(改自空气净化器) - 0331 - FAE.zip

下载

4.5 MB, 下载次数: 3, 下载积分: ST金币 -1

desk(改自空气净化器) - 0331 -A - 副本.rar

下载

4.37 MB, 下载次数: 1, 下载积分: ST金币 -1

收藏 评论11 发布时间:2018-4-12 13:21

举报

11个回答
hqw 回答时间:2018-4-12 16:58:45
我在另一项目模板,project_template_led里
也把 TIM3_Count_Init(9999,719);//1ms//NG用上,并把use_timer.c也都添进去,运行都正常。说明实际或许跟timer3的中断没关,(但在大家找不出原因的那个项目里,把TIM3_Count_Init(9999,719);屏蔽它就可以正常跑灯,不屏蔽则没反应,死机,这也是事实)
   大家可以比较下这两个项目哪里不同?desk这个项目里面哪部分会导致?其实我的主程序都只用了极少的东西,大家要分析的范围应该不大。这两个项目都是用同一个开发板来调试。真希望有人能解这个谜
int main(void)
{       
       
        LED_GPIO_Config();       
       
   Delay_Init(72);

        while (1)
        {
         TIM3_Count_Init(9999,719);//1ms//NG
        while(1)
        {
                   GPIO_WriteBit(GPIOB, GPIO_Pin_6, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_6)));
                   Delay_ms(6000);
        }                               
        }
}

desk(改自空气净化器) - 0331 -A - 副本 -野火(不正常).zip

下载

5.42 MB, 下载次数: 0, 下载积分: ST金币 -1

project_template_led(改自野火)OK -TIMER3(正常).zip

下载

5.73 MB, 下载次数: 56, 下载积分: ST金币 -1

MrJiu 回答时间:2018-4-12 13:48:22
STM32CubeMX走起,啥都解决。。。标准库都没研究了!!!

评分

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

查看全部评分

wenyangzeng 回答时间:2018-4-12 13:53:33
本帖最后由 wenyangzeng 于 2018-4-12 13:58 编辑

跑马灯只要在whuke()循环里延时(你已经是这样做了)翻转GPIO口就可以了。为何要定时器参加这个函数的调用让人看不明白,写GPIO口为何要带那么多调用函数?
GPIO_WriteBit(GPIO, GPIO_Pin_6, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_6)));

改成:
{
GPIOB->BSRR = 0x00000040;
Delay_ms(6000);
GPIOB->BRR  = 0x00000040;
Delay_ms(6000);。



增加其他LED.........
}
就OK了

评分

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

查看全部评分

流水源 回答时间:2018-4-12 14:31:57
DEBUG调试一下,单步运行看看死在哪里

评分

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

查看全部评分

hqw 回答时间:2018-4-12 15:39:00
wenyangzeng 发表于 2018-4-12 13:53
跑马灯只要在whuke()循环里延时(你已经是这样做了)翻转GPIO口就可以了。为何要定时器参加这个函数的调用让 ...

我用STM32不是为了写个跑马灯,是程序写完了,发现运行有问题。为了让自己找问题和大家便于分析,这专门把主程序改成个非常简单的跑马灯。
hqw 回答时间:2018-4-12 15:41:55
流水源 发表于 2018-4-12 14:31
DEBUG调试一下,单步运行看看死在哪里

我用st_link,也没办法知道它运行到哪里了,没跑到设好的断点。st_link的两个灯是在闪。
toofree 回答时间:2018-4-12 15:43:18
中服服务程序中只保留最简单的形式,其它一律不要。
if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
  {
    TIM_ClearITPendingBit(TIM3, TIM_IT_Update);

    Timer_Count_Value ++;
  }

评分

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

查看全部评分

hqw 回答时间:2018-4-12 16:27:42
toofree 发表于 2018-4-12 15:43
中服服务程序中只保留最简单的形式,其它一律不要。
if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
...

按这样改了,没用。
hqw 回答时间:2018-4-12 16:29:34
toofree 发表于 2018-4-12 15:43
中服服务程序中只保留最简单的形式,其它一律不要。
if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
...

按你说的试了,没解决问题
12下一页

所属标签

相似问题

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