现在在用nucleo F413 开发板。用标准库进行配置,这个板子没有焊接外部晶振,所以运行的时候是默认使用内部高速晶振(HSI 16MHz)作为系统时钟。 我现在想用滴答时钟实现延时功能。代码如下 delay.c 文件 <div>static u8 fac_us=0; //us延时倍乘数 static u16 fac_ms=0; //ms延时倍乘数 void delay_init(u8 SYSCLK) { SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); fac_us=SYSCLK/8; //代表每um需要的时钟数 fac_ms=(u16)fac_us*1000; //代表每个ms需要的systick时钟数 } void delay_xms(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 delay_ms(u16 nms) { while(repeat) { delay_xms(540); repeat--; } if(remain)delay_xms(remain); } </div><div> </div>复制代码主函数代码如下: int main(void) { Led_Init(); delay_init(16); for(;;) { LED0=!LED0; LED1=!LED1; LED2=!LED2; delay_ms(1000); } } 复制代码程序不能是实现1秒延时,LED闪烁的很平凡。目前还没找出原因。求助啊
谢谢回复,我用HAL库可以实现。不过我不明白为什么,用标准库就不行了,感觉思路是对的诶。
首先,标准库官方不支持更新了,其次,你这里是寄存器配置的,如果觉得寄存器配置哪里有问题,可以看HAL库的寄存器!!!!
嗯嗯 ,我对比一下,谢谢啊
我今天看了下,确实是时钟配置问题。标准库中是默认的HSE提供时钟,然后在进行系统配置。我用HSI的话,这些配置就不起作用了,要自己再添加。
现在我在main()中添加了配置HSI为系统时钟源的函数,基本可以实现延时了