STM32关于systick计时器时间不对的一点问题
我是新手刚接触STM32,我设定的时间总是实际时间的一半,检查许久也不知道是哪里出了问题
下面是延时函数和计时器的配置
void SysTick_Init(u8 SYSCLK)
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
fac_us=SYSCLK/8;
fac_ms=(u16)fac_us*1000;
}
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD=nus*fac_us; //时间加载
SysTick->VAL=0x00; //清空计数器
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //等待时间到达
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD=(u32)nms*fac_ms; //时间加载(SysTick->LOAD为24bit)
SysTick->VAL =0x00; //清空计数器
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //等待时间到达
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
下面是系统时钟的设置
void RCC_HSE_Config(u32 div,u32 pllm)//自定义系统时钟
{
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);//设置为外部高速晶振
if(RCC_WaitForHSEStartUp()==SUCCESS)
{
RCC_HCLKConfig(RCC_SYSCLK_Div1);//设置AHB时钟
RCC_PCLK1Config(RCC_SYSCLK_Div2);//设置低速AHB时钟(PCLK1 最大36M)
RCC_PCLK2Config(RCC_SYSCLK_Div1);//设置高速AHB时钟(PCLK1 最大72M)
RCC_PLLConfig(div,pllm);//设置时钟源及倍频系数
RCC_PLLCmd(ENABLE);//使能PLL
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);//检查指定的RCC标志位设定
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//设置系统时钟
while(RCC_GetSYSCLKSource()!=0x08);//返回用作系统时钟的时钟源,0x08,PLL用作时钟源
}
}
下面是主函数
int main()
{
RCC_HSE_Config(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
LED_Init();
SysTick_Init(72);
while(1)
{
delay_ms(1500);
delay_ms(1500);
LED_OFF();
delay_ms(1500);
delay_ms(1500);
LED_ON();
}
}
按照我的想法应该是3s亮灯,3s灭灯
但是实际上我粗略测量大概这个间隔是6s
到底是为什么
我的板子是C8T6,外部晶振是8M
来源:CSDN
作者:LoveInCasablanca
链接:https://blog.csdn.net/LoveInCasablanca/article/details/103923910