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

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, 下载次数: 4, 下载积分: ST金币 -1

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

下载

4.37 MB, 下载次数: 2, 下载积分: 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

查看全部评分

STMWoodData 回答时间:2018-4-12 14:31:57
提示: 作者被禁止或删除 内容自动屏蔽
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的两个灯是在闪。
七哥 回答时间: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)
...

按你说的试了,没解决问题
feixiang20 回答时间:2018-4-13 01:15:30
代码运行异常的话可以开个中断逐句检查,看看问题出在什么地方,最好找官方实例进行对比

评分

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

查看全部评分

hqw 回答时间:2018-4-13 16:32:06
问题解决了,

//#define         ENABLE_BOOT                             //使能BOOT(固件升级功能)把这句屏蔽就好了
static void NVIC_Configuration(void)
{
#ifdef ENABLE_BOOT
  NVIC_SetVectorTable(NVIC_VectTab_FLASH,OFFSET_FIRMWARE_L);
#else
  NVIC_SetVectorTable(NVIC_VectTab_FLASH,0);
#endif
  
  //Configure the NVIC Preemption Priority Bits
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
}

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2 结帖奖励

查看全部评分

所属标签

相似问题

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