你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

把f413的滴答时钟用延时函数,延时不准

[复制链接]
还是看不穿 提问时间:2017-7-21 18:21 /
现在在用nucleo F413 开发板。用标准库进行配置,这个板子没有焊接外部晶振,所以运行的时候是默认使用内部高速晶振(HSI  16MHz)作为系统时钟。

我现在想用滴答时钟实现延时功能。代码如下

delay.c 文件
  1. <div>static u8  fac_us=0;                                                        //us延时倍乘数                          
  2. static u16 fac_ms=0;                                                        //ms延时倍乘数
  3. void delay_init(u8 SYSCLK)
  4. {
  5.             SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
  6.              fac_us=SYSCLK/8;                                                //代表每um需要的时钟数
  7.     fac_ms=(u16)fac_us*1000;                                //代表每个ms需要的systick时钟数   
  8. }

  9. void delay_xms(u16 nms)
  10. {                                     
  11.             u32 temp;                  
  12.             SysTick->LOAD=(u32)nms*fac_ms;                        //时间加载(SysTick->LOAD为24bit)
  13.     SysTick->VAL =0x00;                                   //清空计数器
  14.             SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;          //开始倒数
  15.             do
  16.            {
  17.                       temp=SysTick->CTRL;
  18.    }while((temp&0x01)&&!(temp&(1<<16)));        //等待时间到达   
  19.             SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       //关闭计数器
  20.             SysTick->VAL =0X00;                                       //清空计数器                      
  21. }
  22. void delay_ms(u16 nms)
  23. {   
  24.             while(repeat)
  25.            {
  26.                         delay_xms(540);
  27.                         repeat--;
  28.             }
  29.            if(remain)delay_xms(remain);
  30. } </div><div>
  31. </div>
复制代码
主函数代码如下:
  1. int main(void)
  2. {
  3.             Led_Init();
  4.             delay_init(16);
  5.            for(;;)
  6.            {
  7.                        LED0=!LED0;
  8.                          LED1=!LED1;
  9.                        LED2=!LED2;
  10.                       delay_ms(1000);
  11.           }
  12. }
复制代码
程序不能是实现1秒延时,LED闪烁的很平凡。目前还没找出原因。求助啊




收藏 评论5 发布时间:2017-7-21 18:21

举报

5个回答
MrJiu 回答时间:2017-7-22 09:37:39
直接用HAL库,cube工具配置就好啦!!!!
还是看不穿 回答时间: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 ...

嗯嗯 ,我对比一下,谢谢啊
还是看不穿 回答时间:2017-7-24 13:19:16
MrJiu 发表于 2017-7-23 13:36
首先,标准库官方不支持更新了,其次,你这里是寄存器配置的,如果觉得寄存器配置哪里有问题,可以看HAL ...

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

现在我在main()中添加了配置HSI为系统时钟源的函数,基本可以实现延时了

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版