把f413的滴答时钟用延时函数,延时不准
现在在用nucleo F413 开发板。用标准库进行配置,这个板子没有焊接外部晶振,所以运行的时候是默认使用内部高速晶振(HSI16MHz)作为系统时钟。我现在想用滴答时钟实现延时功能。代码如下
delay.c 文件
<div>static u8fac_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库,cube工具配置就好啦!!!!;P;P;P MrJiu 发表于 2017-7-22 09:37
直接用HAL库,cube工具配置就好啦!!!!
谢谢回复,我用HAL库可以实现。不过我不明白为什么,用标准库就不行了,感觉思路是对的诶。 还是看不穿 发表于 2017-7-22 22:25
谢谢回复,我用HAL库可以实现。不过我不明白为什么,用标准库就不行了,感觉思路是对的诶。 ...
首先,标准库官方不支持更新了,其次,你这里是寄存器配置的,如果觉得寄存器配置哪里有问题,可以看HAL库的寄存器!!!! MrJiu 发表于 2017-7-23 13:36
首先,标准库官方不支持更新了,其次,你这里是寄存器配置的,如果觉得寄存器配置哪里有问题,可以看HAL ...
嗯嗯 ,我对比一下,谢谢啊;P MrJiu 发表于 2017-7-23 13:36
首先,标准库官方不支持更新了,其次,你这里是寄存器配置的,如果觉得寄存器配置哪里有问题,可以看HAL ...
我今天看了下,确实是时钟配置问题。标准库中是默认的HSE提供时钟,然后在进行系统配置。我用HSI的话,这些配置就不起作用了,要自己再添加。
现在我在main()中添加了配置HSI为系统时钟源的函数,基本可以实现延时了
页:
[1]