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

2019-07-14 20:09发布

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

}



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
17条回答
zhaowwll133
1楼-- · 2019-07-16 10:46
lee_st 发表于 2016-11-18 00:47
不要只撞一棵树上

        改成 TIM3->ARR=arr; 就好了
这个地方为什么不能用  TIM3->ARR|=arr;  呢?
复位值不是0X0000么?
idianze
2楼-- · 2019-07-16 12:43
你这个写程序的风格我不赞成,如果程序写大了,你这样直接写寄存器的风格会害死人的。
估计是系统时钟没设置好,倍频没有设置。建议:网上现成的例程很多,找个自己看得懂的,库函数写的,试试吧,总有一款适合你的
lee_st
3楼-- · 2019-07-16 13:27
 精彩回答 2  元偷偷看……
donatello1996
4楼-- · 2019-07-16 18:22
找个好用的先参考
流动的水
5楼-- · 2019-07-16 22:29
使用系统滴答时钟,不失精准,同时函数调用也非常方便。

一周热门 更多>