iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >如何解决SysTick定时器错误问题
  • 661
分享到

如何解决SysTick定时器错误问题

2024-04-02 19:04:59 661人浏览 八月长安
摘要

这篇文章主要介绍“如何解决SysTick定时器错误问题”,在日常操作中,相信很多人在如何解决SysTick定时器错误问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何解决

这篇文章主要介绍“如何解决SysTick定时器错误问题”,在日常操作中,相信很多人在如何解决SysTick定时器错误问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何解决SysTick定时器错误问题”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

01坑的由来

使用的就是systick定时器,具体代码如下

void delay_us(uint32_t nus) {   uint32_t temp;   SysTick->LOAD = RCC_Clocks.HCLK_Frequency/1000000/8*nus;   SysTick->VAL=0X00;//清空计数器   SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源   do   {     temp=SysTick->CTRL;//读取当前倒计数值   }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达   SysTick->CTRL=0x00; //关闭计数器   SysTick->VAL =0X00; //清空计数器 } void delay_ms(uint16_t nms) {   uint32_t temp;   SysTick->LOAD = RCC_Clocks.HCLK_Frequency/1000/8*nms;   SysTick->VAL=0X00;//清空计数器   SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源   do   {     temp=SysTick->CTRL;//读取当前倒计数值   }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达   SysTick->CTRL=0x00; //关闭计数器   SysTick->VAL =0X00; //清空计数器 }

对于《STM32延时的四种方法》文中所说的内容如下

如何解决SysTick定时器错误问题

也就是下面代码中/8的原因。

SysTick->LOAD = RCC_Clocks.HCLK_Frequency/1000/8*nms;

我对此深信不疑,并在STM32F207参考手册(RM0033)上找到“证据”。

如何解决SysTick定时器错误问题

上图①处直接是8分频,而不像②出的1/2/4/8分频。所以我确信是SYSTICK的时钟固定为HCLK时钟的1/8。

我在学习RTThread的时候,看到配置SysTick定制器代码如下

如何解决SysTick定时器错误问题

我心里一堆问号,STM32官方手册,明明写了SYSTICK的时钟固定为HCLK时钟的1/8。我使用示波器测量,RTThread的配置是没有问题,可以正常延时的。

02填坑

如何解决SysTick定时器错误问题

位2置1,表示时钟频率为AHB,也就是默认的120000000Hz。

位2清0,表示时钟频率为AHB/8,也就是120000000/8Hz。

RTThread配置为内部时钟

如何解决SysTick定时器错误问题

之前的文章配置为外部时钟源

如何解决SysTick定时器错误问题


这个细节我没有留意,导致我看RTThread代码时有点懵逼。

如何解决SysTick定时器错误问题

准确的描述是:

SYSTICK的时钟可以为HCLK时钟的1分频或8分频,在这里我们选用外部时钟源120M,所以SYSTICK的时钟为(120/8)M。

特此更正。

关于这点,STM32的标准外设库提供的SysTick_Config函数,也是使用内部时钟的

 static __INLINE uint32_t SysTick_Config(uint32_t ticks) {   if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);                SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;         NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);     SysTick->VAL   = 0;                                             SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |                    SysTick_CTRL_TICKINT_Msk   |                    SysTick_CTRL_ENABLE_Msk;                       return (0);                                                   }

调用方法,产生1ms中断调用方法

SysTick_Config(SystemCoreClock / 1000);

关于时钟源的选择,除了操作寄存器外,还有库函数可以选择。

 void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource) {      assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource));   if (SysTick_CLKSource == SysTick_CLKSource_HCLK)   {     SysTick->CTRL |= SysTick_CLKSource_HCLK;   }   else   {     SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;   } }

除上外,我找到了其他证据来说明,SYSTICK的时钟可以为HCLK时钟的1分频或8分频。

如何解决SysTick定时器错误问题

在STM32CubeMx配置软件中,可以选择1分频或8分频。

03修改代码验证

把涉及的代码修改成1分频的。

void delay_ms(uint16_t nms) {   uint32_t temp;   SysTick->LOAD = RCC_Clocks.HCLK_Frequency/1000*nms-1;   SysTick->VAL=0X00;//清空计数器   SysTick->CTRL=0X01;   SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);   do   {     temp=SysTick->CTRL;//读取当前倒计数值   }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达   SysTick->CTRL=0x00; //关闭计数器   SysTick->VAL =0X00; //清空计数器 }

然后调用

GPIO_SetBits(GPIOE,GPIO_Pin_4);  //熄灭LED灯                      delay_ms(500);//延时500ms GPIO_ResetBits(GPIOE,GPIO_Pin_4);//点亮LED灯                      delay_ms(500);//延时500ms

就踩到另一个坑,延时不准。

原因是:此时SYSTICK时钟频率是120MHz的24位的倒计数定时器,也就是说一个周期,最多定时139.810125ms。不能延时500ms。

这里再更正之前的一个错误,如下图

如何解决SysTick定时器错误问题

这个计数器的值,我们减去了1,这样才更准确。

到此,关于“如何解决SysTick定时器错误问题”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: 如何解决SysTick定时器错误问题

本文链接: https://www.lsjlt.com/news/83200.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何解决SysTick定时器错误问题
    这篇文章主要介绍“如何解决SysTick定时器错误问题”,在日常操作中,相信很多人在如何解决SysTick定时器错误问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何解决...
    99+
    2024-04-02
  • 如何解决MySQL启动时1067错误问题
    小编给大家分享一下如何解决MySQL启动时1067错误问题,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧! 解决MySQL启动时万恶的1067错误(转)[@mo...
    99+
    2024-04-02
  • 如何解决PHPCMS调用时间错误的问题?
    PHPCMS是一款广泛应用于网站建设的内容管理系统,许多网站都是基于PHPCMS开发的。然而,在使用过程中,有时会遇到调用时间错误的问题,这会影响网站的正常运行。本文将探讨如何解决PH...
    99+
    2024-03-14
    php 时间 cms 格式化输出
  • 如何解决RMAN-06019错误问题
    小编给大家分享一下如何解决RMAN-06019错误问题,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧! RMAN-06019: could not t...
    99+
    2024-04-02
  • 如何解决mysql 1053错误问题
    这篇文章将为大家详细讲解有关如何解决mysql 1053错误问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 mysql 1053错误的解决...
    99+
    2024-04-02
  • 如何解决mysql 1146错误问题
    本篇内容主要讲解“如何解决mysql 1146错误问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何解决mysql 1146错误问题”吧!mysql 114...
    99+
    2024-04-02
  • 如何解决mysql 2003错误问题
    这篇文章给大家介绍如何解决mysql 2003错误问题,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。mysql 2003错误的解决办法:1、在“计算机”->“管理”->“服...
    99+
    2024-04-02
  • 如何解决yum错误的问题
    本篇内容主要讲解“如何解决yum错误的问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何解决yum错误的问题”吧!利用网络监视软件cacti检测某服务器的流量用到SNMP服务!我像往常一样运...
    99+
    2023-06-10
  • 如何解决安装pytorch时报sslerror错误的问题
    这篇文章给大家分享的是有关如何解决安装pytorch时报sslerror错误的问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。首先说一下 ,我是用的anaconda3装的pytorch为了方便建议你也安装一个。...
    99+
    2023-06-15
  • Mysql时区错误问题怎么解决
    本文小编为大家详细介绍“Mysql时区错误问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“Mysql时区错误问题怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。...
    99+
    2024-04-02
  • 如何解决docker: unexpected EOF.错误问题
    这篇文章主要讲解了“如何解决docker: unexpected EOF.错误问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何解决docker: unex...
    99+
    2023-07-05
  • docker容器时区错误问题该怎么解决
    docker容器时区错误问题该怎么解决,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。背景利用node-schedule定时任务库写了一个自动定时发邮件的脚本,每天上午7点发送邮...
    99+
    2023-06-25
  • Java的编译时错误和运行时错误问题怎么解决
    本篇内容介绍了“Java的编译时错误和运行时错误问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java编译时错误和运行时错误1....
    99+
    2023-07-05
  • 如何解决mysql出现10055错误问题
    这篇文章主要介绍如何解决mysql出现10055错误问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!mysql出现10055错误的解决办法:首先查一下netstat有多少连接和等待...
    99+
    2024-04-02
  • 如何解决MySQL启动时万恶的的1067错误问题
    这篇文章主要介绍如何解决MySQL启动时万恶的的1067错误问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!我的机器不知为何,安装MySQL的时候,一到配置那一步就无休止的等待,只...
    99+
    2024-04-02
  • 如何解决安装node错误2503问题
    本教程操作环境:Windows10系统、node v16.18.0版、Dell G3电脑。如何解决安装node错误2503问题?node安装或卸载报错2502,2503问题解决一、需求大概需求是node版本过低需要升级版本,操作是将高版本n...
    99+
    2023-05-14
    2503 node
  • 重定向网页时,如何避免 PHP 的错误问题?
    重定向是网站开发中非常常见的操作,它可以将用户从当前页面直接跳转到另一个页面,从而实现某些功能。在 PHP 中,我们通常使用 header 函数来进行重定向操作。但是,如果不注意一些细节,就有可能出现一些错误问题。下面,我们就来探讨一下,在...
    99+
    2023-09-29
    npm leetcode 重定向
  • 如何解决navicat出现1075错误的问题
    这篇文章主要介绍如何解决navicat出现1075错误的问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!MYSQL中AUTO_INCREMENT会在新记录插入表中时生成一个唯一的数...
    99+
    2024-04-02
  • 如何解决navicat出现1366错误的问题
    这篇文章给大家分享的是有关如何解决navicat出现1366错误的问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。  navicat在创建表的时候有时会报错。 warning(...
    99+
    2024-04-02
  • 如何解决phpmyadmin出现405错误的问题
    小编给大家分享一下如何解决phpmyadmin出现405错误的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!phpmyadm...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作