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

把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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版