hqw 发表于 2018-4-12 13:21:08

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

主程序非常简单,就是一个跑马灯: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_TimeBaseInitTypeDefTIM_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 2576224822

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);
        }                               
        }
}

MrJiu 发表于 2018-4-12 13:48:22

STM32CubeMX走起,啥都解决。。。标准库都没研究了!!!

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了

流水源 发表于 2018-4-12 14:31:57

DEBUG调试一下,单步运行看看死在哪里

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 ++;
}

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)
...

按你说的试了,没解决问题
页: [1] 2
查看完整版本: stm32使能timer3导致程序不正常运行的问题