打印
[STM32F0]

STM32F030C8T6 TIM15 定时问题

[复制链接]
346|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jlyuan|  楼主 | 2021-5-9 23:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用STM32F030C8T6的TIM15 做定时器4秒的中断。  

发现定时严重不对

使用特权

评论回复
沙发
jiajs| | 2021-5-9 23:08 | 只看该作者

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
板凳
jlyuan|  楼主 | 2021-5-9 23:11 | 只看该作者

void INIT_CLOCK(void)
{   
        

    ErrorStatus HSEStartUpStatus;
    RCC_DeInit();
        
    RCC_HSEConfig(RCC_HSE_ON);
    HSEStartUpStatus = RCC_WaitForHSEStartUp();

    if(HSEStartUpStatus == SUCCESS)
    {
        RCC_HCLKConfig(RCC_SYSCLK_Div1);

         RCC_PCLKConfig(RCC_HCLK_Div2);  
                        
        RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_4);
        RCC_PLLCmd(ENABLE); //使能PLL

        //检查指定的RCC标志位设置与否
        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); // Wait till PLL is ready

        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  //设置系统时钟 (SYSCLK)


        while(RCC_GetSYSCLKSource() != 0x08);
                                
                SystemCoreClock=32000000; //32MHZ                                
                                
    }
    else

    {
        //内部晶振配置
        RCC_DeInit();
        RCC_HSEConfig(RCC_HSE_OFF);      
                        
        RCC_HCLKConfig(RCC_SYSCLK_Div1);   

        RCC_PCLKConfig(RCC_HCLK_Div1);  

        RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI );      
                RCC_PLLCmd(DISABLE); //PLL
                SystemCoreClock=8000000; //8MHZ
                        
                        
    }   

}

void TIM15_Basetimer(void)
{
            uint16_t TimerPeriod = 0;
        
           TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM15, ENABLE);            
        
      TIM_DeInit(TIM15);
      TIM_TimeBaseStructure.TIM_Period            = 4000;  // 4000ms  定时4秒中断
        
        #if 1
            //这个是认为 APB2=32MHZ的?
      TIM_TimeBaseStructure.TIM_Prescaler         = 32000-1;  
        
        #else
            //这个是认为 APB2=16MHZ的?
            TIM_TimeBaseStructure.TIM_Prescaler         = 16000-1;  
        
        
        #endif
        
    TIM_TimeBaseStructure.TIM_ClockDivision     = 0x0; // 时钟分割
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//时钟0分割  1次时钟频率 1次计数
                        
      TIM_TimeBaseStructure.TIM_CounterMode       = TIM_CounterMode_Up;   // 计数方式
      TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0000;
      TIM_TimeBaseInit(TIM15, &TIM_TimeBaseStructure);

      /* Clear TIM1 update pending flag[清除TIM1溢出中断标志] */
      TIM_ClearFlag(TIM15, TIM_FLAG_Update);//更新中断标记 由软件清0 ,例如当上溢或下溢时,软件对CNT重新初始化         
      TIM_ITConfig(TIM15,TIM_IT_Update,ENABLE);
      TIM_SetCounter(TIM15, 0);


    TIM_Cmd(TIM15, ENABLE);    //开启计数器   
     //配置中断

   NVIC_DisableIRQ(TIM15_IRQn);
   NVIC_SetPriority(TIM15_IRQn,0);
   NVIC_EnableIRQ(TIM15_IRQn);        
         
}

使用特权

评论回复
地板
jlyuan|  楼主 | 2021-5-9 23:15 | 只看该作者
不好意思。是我范的错误

TIM15的时钟是 内核时钟, 我这个是32MHZ。     软件定时没有问题。是我其他地方的PWM输出把参数改了

使用特权

评论回复
5
jlyuan|  楼主 | 2021-5-9 23:18 | 只看该作者
搞定了,呵呵,犯了低级错误……

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

880

主题

12030

帖子

4

粉丝