微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > stm32的通用定时器延时问题,本来定时500ms,实际上都有4s了

stm32的通用定时器延时问题,本来定时500ms,实际上都有4s了

时间:10-02 整理:3721RD 点击:
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "timer.h"
int main()
{
         Stm32_Clock_Init(9);
         delay_init(72);
         tim3_init(4999,7199);  //频率10K,计数5k,500ms
         led_init();
while(1)
{
       
PC1=!PC1;   //LED1翻转
        delay_ms(500);
}
}

#include "timer.h"
#include "sys.h"
#include "led.h"
void tim3_init(u16 arr,u16 psc)
{
  RCC->APB1ENR|=1<<1;  //使能时钟
       
        TIM3->PSC|=psc;  //分频  频率10K
        TIM3->ARR|=arr;   //计数器自动转载值     计数5k次
        TIM3->DIER|=1<<0;   //允许跟新中断
        MY_NVIC_Init(2,0,TIM3_IRQn,2);//中断分组配置
        TIM3->CR1|=1<<0;  //使能定时器
       
}

void TIM3_IRQHandler(void)
{

if(TIM3->SR&0X0001)//溢出中断
{
        PC0=!PC0;//LED0翻转
}
TIM3->SR&=~(1<<0);
}

有意思,哈哈哈哈

你用滴答定時试试!

是不是系统时钟的事?

目测是系统时钟不对

滴答定时器没问题,用滴答延时准确

我也觉得是这个,可是找不到问题。底下是倍频函数,用的是原子的
void Stm32_Clock_Init(u8 PLL)
{
        unsigned char temp=0;   
        MYRCC_DeInit();                  //复位并配置向量表
        RCC->CR|=0x00010000;  //外部高速时钟使能HSEON
        while(!(RCC->CR>>17));//等待外部时钟就绪
        RCC->CFGR=0X00000400; //APB1=div2;APB2=div1;AHB=div1;
        PLL-=2;                                  //抵消2个单位(因为是从2开始的,设置0就是2)
        RCC->CFGR|=PLL<<18;   //设置PLL值 2~16
        RCC->CFGR|=1<<16;          //PLLSRC ON
        FLASH->ACR|=0x32;          //FLASH 2个延时周期
        RCC->CR|=0x01000000;  //PLLON
        while(!(RCC->CR>>25));//等待PLL锁定
        RCC->CFGR|=0x00000002;//PLL作为系统时钟         
        while(temp!=0x02)     //等待PLL作为系统时钟设置成功
        {   
                temp=RCC->CFGR>>2;
                temp&=0x03;
        }   
}                    

我也遇到过用原子的,在自己的板子上,串口波特率是设定的一半,是系统主频的事

仔细查查系统时钟设置

                 

系统时钟就这个倍频配置,另外滴答定时正常

PLL的参数配置看看

或者,自己从新建个工程

不要只撞一棵树上

        改成 TIM3->ARR=arr; 就好了
这个地方为什么不能用  TIM3->ARR|=arr;  呢?
复位值不是0X0000么?

你这个写程序的风格我不赞成,如果程序写大了,你这样直接写寄存器的风格会害死人的。
估计是系统时钟没设置好,倍频没有设置。建议:网上现成的例程很多,找个自己看得懂的,库函数写的,试试吧,总有一款适合你的。

PLL的参数配置看看

找个好用的先参考

使用系统滴答时钟,不失精准,同时函数调用也非常方便。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top