stm32的通用定时器延时问题,本来定时500ms,实际上都有4s了
#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的参数配置看看
找个好用的先参考
使用系统滴答时钟,不失精准,同时函数调用也非常方便。