时基
TIM1_TimeBaseInit(128, TIM1_COUNTERMODE_UP, 125, 0);//T = (1/16Mhz)*128[分频比]*125 = 1000us
手册里面计数器的时钟频率为:
fCK_CNT=fCK_PSC/(PSCR[15:0]+1)
那岂不是:
TIM1_TimeBaseInit(127, TIM1_COUNTERMODE_UP, 125, 0);
?
但是无论哪种都得不到很准确的1MS延时。以为是2M有问题,换一下网上的16M没问题的
换成TIM1_TimeBaseInit(16, TIM1_COUNTERMODE_UP, 1000, 0);
用数码管显示出来用秒表对比发现上面三种数码管显示的10S计时都不精准。是不是我中断里写错了?
初始化:
CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV1);
中断里:
INTERRUPT_HANDLER(TIM1_UPD_OVF_TRG_BRK_IRQHandler, 11)
{
static uint16_t i,j;
if(++i>=1000)
{
i=0;
GPIO_Write(GPIOD, Display_Yang[j]);
if(++j>=10)j=0;//数码管显示0-9
}
TIM1_ClearFlag(TIM1_FLAG_UPDATE);
}
问题1:TIM1时钟频率怎么算的?
问题2:CLK_CKDIVR位4:3和位2:0.都要初始化还是?TIM1时钟频率基于HSIDIV还是CPUDIV?
问题3:如上所述,本来想用2M做一个1MS延时,发现都不对。怎么做? |