还是看不穿 发表于 2017-7-21 18:21:36

把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闪烁的很平凡。目前还没找出原因。求助啊




MrJiu 发表于 2017-7-22 09:37:39

直接用HAL库,cube工具配置就好啦!!!!;P;P;P

还是看不穿 发表于 2017-7-22 22:25:59

MrJiu 发表于 2017-7-22 09:37
直接用HAL库,cube工具配置就好啦!!!!

谢谢回复,我用HAL库可以实现。不过我不明白为什么,用标准库就不行了,感觉思路是对的诶。

MrJiu 发表于 2017-7-23 13:36:05

还是看不穿 发表于 2017-7-22 22:25
谢谢回复,我用HAL库可以实现。不过我不明白为什么,用标准库就不行了,感觉思路是对的诶。 ...

首先,标准库官方不支持更新了,其次,你这里是寄存器配置的,如果觉得寄存器配置哪里有问题,可以看HAL库的寄存器!!!!

还是看不穿 发表于 2017-7-24 07:51:32

MrJiu 发表于 2017-7-23 13:36
首先,标准库官方不支持更新了,其次,你这里是寄存器配置的,如果觉得寄存器配置哪里有问题,可以看HAL ...

嗯嗯 ,我对比一下,谢谢啊;P

还是看不穿 发表于 2017-7-24 13:19:16

MrJiu 发表于 2017-7-23 13:36
首先,标准库官方不支持更新了,其次,你这里是寄存器配置的,如果觉得寄存器配置哪里有问题,可以看HAL ...

我今天看了下,确实是时钟配置问题。标准库中是默认的HSE提供时钟,然后在进行系统配置。我用HSI的话,这些配置就不起作用了,要自己再添加。

现在我在main()中添加了配置HSI为系统时钟源的函数,基本可以实现延时了
页: [1]
查看完整版本: 把f413的滴答时钟用延时函数,延时不准