【GD32F427开发板试用】SysTick定时器的ms中断,us计时

news2025/6/5 17:34:22

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:远小刘

1、系统滴答定时器

参考资料《Cortex M3与M4权威指南.pdf》中的9.5 The SysTick timer小节,里面详细讲解了
1、为什么要用SysTick计时器;
2、SysTick定时器的操作情况;
3、如何使用SysTick定时器;
4、使用SysTick定时器。

2、简介

系统定时器【SysTick】它挂载在AHB时钟线上,是一个24bit的向下递减的计数器,计数器每计数一次的时间为1/SystemCoreClock,当前我们的开发板选用的是25M的外部晶振,倍频至200M,且当前提供的标准库设置为不分频,则系统时钟SystemCoreClock等于200M。当重装载数值寄存器的值递减到0的时候,系统定时器就产生一次中断,以此循环往复。

3、SysTick寄存器

SysTick寄存器:
CTRL:SysTick控制及状态寄存器
LOAD:SysTick重装载数值寄存器
VAL:SysTick当前数值寄存器
CALIB:SysTick校准数值寄存器

SysTick控制及状态寄存器:

COUNTFLAG:如果在上次读取本寄存器后 SysTick已经计到了0,则该位为 1;
CLKSOURCE:时钟源选择位 ,0=AHB/8,1=处理器时钟AHB
TICKINT:1=SysTick倒数计数到 0时产生 SysTick异常请求,0=数到 0 时无动作。也可以通过读取COUNTFLAG标志位来确定计数器是否递减到0
ENABLE:SysTick 定时器的使能位

思路

SysTick->VAL寄存器的值每一个时钟周期就会递减1,当它递减到0时候,SysTick->LOAD的值将会进入SysTick->VAL中,并且SysTick->CTRL的COUNTFLAG位将会置1,如果还使能了中断,将还会进入中断。

延时原理就是通过使能中断,并设定SysTick->LOAD的值以及时钟周期的数值(通常设定为1kHz = 1ms)来实现的。

4、SysTick代码如下:

/** \brief  System Tick Configuration The function initializes the System Timer and its interrupt, and starts the System Tick Timer.
    Counter is in free running mode to generate periodic interrupts.
    
    \param [in]  ticks  Number of ticks between two interrupts.
    
    \return          0  Function succeeded.
    \return          1  Function failed.
    
    \note     When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the
    function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b>
    must contain a vendor-specific implementation of this function.
    */
    __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
    {
      if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk)  return (1);      /* Reload value impossible */
    
      SysTick->LOAD  = ticks - 1;                                  /* set reload register */
      NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Systick Interrupt */
      SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */
      SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                       SysTick_CTRL_TICKINT_Msk   |
                       SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */
      return (0);                                                  /* Function successful */
    }

M4手册解说

如果你只想产生一个周期性的SysTick中断,最简单的方法是使用CMSIS-Core函数“SysTick_Config”:

SysTick_Config(uint32_t ticks);

该函数将SysTick中断间隔设置为“ticks”,启用使用处理器时钟的计数器,并启用异常优先级最低的SysTick异常。

例如,如果你有一个200MHz的时钟频率,你想要触发一个1KHz的SysTick异常,你可以使用:

(SystemCoreClock / 1000);
   变量“SystemCoreClock”应该保持正确的时钟频率值200M。   “SysTick_Handler(void)”将以1khz的速率被触发。

如果SysTick_Config函数的输入参数不能装进24位重新加载值寄存器(大于OxFFFFFF), SysTick_Config函数返回1;否则,它返回0。

个人深入理解

或者可以这么理解AHB为200M,则计数周期为0.02us(1/200M)1ms/0.02us=10^3/0.02=200000,也就是计数1ms要递减200000次,也就是SysTick->VAL递减200000次,所以SysTick->LODA是200000,也可以说ticks参数必须是200000

5、SysTick库函数添加延时函数

先初始化SysTick配置函数:将SysTick函数配置成ms级中断,如果配置成us级中断,中断就会频繁的进入,将会占用cpu的使用资源,

\brief    configure systick
    \param[in]  none
    \param[out] none
    \retval     none
    */
    #define sys_1ms  1000U
    #define sys_1us  1000000U
    void systick_config(void)
    {
        /* setup systick timer for 1000Hz interrupts */
        if(SysTick_Config(SystemCoreClock / sys_1ms)) 
        {
            /* capture error */
            while(1) 
            {
    
            }
        }
        /* configure the systick handler priority */
    NVIC_SetPriority(SysTick_IRQn,0x00U);
    usTicks=SystemCoreClock/sys_1us;
    }

定义一个全局变量,在每次触发SysTick定时器中断让它加1;

volatile uint32_t sysTickUptime;
    /*!
    \brief    this function handles SysTick exception
    \param[in]  none
    \param[out] none
    \retval     none
    */
    void SysTick_Handler(void)
    {
        sysTickUptime++;
    }
    
    /*!
    \brief      获取运行时间
    \param[in]  none
    \param[out] none
    \retval     none
    */
    
    uint32_t get_system_run_time(void)
    {
        return sysTickUptime;                 //ms
    }
    
    
    /*
    \brief    delay a time in milliseconds
    \param[in]  count: count in milliseconds
    \param[out] none
    \retval     none
    */
    void delay_ms(uint32_t millis_)
    {
        uint32_t target;
    
        target = sysTickUptime + millis_;
        while (sysTickUptime < target);
    }

us计数器原理:由于SysTick->VAL 的计数范围20 0000~0就是1ms,递减计数器,因此可以根据它的递减计数器,推出us延时。

//微妙计数器
    uint32_t systick_get_micros(void)
    {
    //register请求编译器尽可能的将变量存在CPU内部寄存器,而不是通过内存寻址访问。
        register uint32_t ms, cycle_cnt;
        do
        {
            ms = sysTickUptime;
            cycle_cnt = SysTick->VAL;//SysTick->VAL 的计数范围20 0000~0就是1ms,递减计数器
        }while (ms != sysTickUptime);
    return (ms*1000)+ (usTicks * 1000 - cycle_cnt)/usTicks; 
    
    }
    
    /********************************************************************************************************
    **函数信息 :void delay_us(u16 nus)
    **功能描述 :延时微秒
    **输入参数 :nms微秒数
    **输出参数 :无
    ********************************************************************************************************/
    void delay_us(uint32_t micros_)
    {
        uint32_t tcnt=systick_get_micros();
        while(systick_get_micros() - tcnt < micros_);
    }

6、函数测试

《灯语测试》
默认离线模式:led1 100ms亮,100ms灭 共两次,周期为1s;
KEY1按下:在线模式,led1 200ms亮,200ms灭 共两次,周期为2s;

7、代码下载

https://gitee.com/ShinesY/gd32-f427.git

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/334672.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一分钟教会使用ChatGPT,保姆级ChatGPT教程

最近ChatGPT大火&#xff01;微软退出首款ChatGPT搜索引擎&#xff0c;阿里等国内巨头也纷纷爆出自家产品&#xff0c;一夜之间&#xff0c;全球最大的科技公司仿佛都回到了自己年轻时的样子&#xff01; 然而&#xff0c;ChatGPT这么火&#xff0c;这么好玩的东西&#xff0c…

Knowledgeowl VS Baklib:你需要知道的一切!

KnowledgeOwl 和 Baklib都是知识库软件的示例。您可以使用每个平台为用户创建自己的知识库和托管文档。每个平台都允许您从同一帐户创建多个知识库&#xff0c;并且可以为用户提供内部和外部知识库。什么是知识库&#xff1f;知识库是一个集中的信息存储库&#xff0c;旨在为无…

Koa2-项目中的基本应用

文章目录安装配置koa2配置nodemon,热更新我们的项目中间件什么是中间件&#x1f47b;洋葱模型路由中间件连接数据库 - mysql后端允许跨域处理请求getpostputdelete后续会继续更新安装配置koa2 &#x1f47b;安装 koa2 npm i koa2 -s&#x1f47b;在package.json 配置,当然是在…

用LCR测试仪测试无线充电系统中的线圈

宽阻抗范围用来表征电感和质量因数– 高精度 DCR 测量– 制造环节快速测量– 大量夹具可供选择智能终端上不断增加新功能&#xff0c;电池寿命成为用户最头痛的问题之一。相比便携式电源和电缆供电而言&#xff0c;无线充电技术因其方便性和多功能性获得了很大的关注&#xff0…

MySQL —— 表的增删查改(一)

目录 表的增删查改&#xff08;一&#xff09; 一、create 1. 单行数据全列插入 2. 多行数据指定列插入 3. 插入否则更新 4. 替换 二、Retrieve 1. select列 1. 全列查询 2. 指定列查询 3. 查询字段为表达式 4. 为查询结果指定别名 5. 结果去重 2. where条件 1…

辞旧岁立新年 | 展望前端工程师的2023

「InfoQ 年度技术盘点与展望」是由InfoQ主办的年度技术盘点与展望项目&#xff0c;是 InfoQ 全年最重要的内容选题之一。 近日&#xff0c;字节跳动云原生 PaaS 资深前端工程师黄健受邀参与&#xff0c;分享主题为 《展望前端研发工程师的 2023》 。本文整理自黄健于直播中分享…

中国区注册OpenAI账号,试用ChatGPT指南

OpenAI最近推出ChatGPT&#xff0c;但国内&#xff08;包括香港&#xff09;并不支持OpenAI账号注册&#xff0c;多数会提示&#xff1a; OpenAI’s services are not available in your country. 前期准备 科学上网&#xff0c;最好是美国IP&#xff08;可以购买v屁n&…

(三)循环神经网络RNN之LSTM和GRU

LSTM介绍 LSTM(Long Short Term Memory)是 Hochreater 和 Schmidhuber 在 1997 年提出的一种网络结构&#xff0c;尽管该模型在序列建模上的特性非常突出&#xff0c;但由于当时正是神经网络的下坡期&#xff0c;没有能够引起学术界足够的重视。随着深度学习逐渐发展&#xff…

【数据结构-JAVA】排序

排序在现实生活中的应用可谓相当广泛&#xff0c;比如电商平台中&#xff0c;选购商品时&#xff0c;使用价格排序或是综合排序、高考填报志愿的时候&#xff0c;会参考全国大学排名的情况。下面介绍一些计算机中与排序相关的概念&#xff1a;排序&#xff1a;所谓排序&#xf…

超详细的JAVA高级进阶基础知识03

目录 3. 面向对象高级 - 常用的API 3.1 Object 类 3.1.1 Object 类介绍 3.1.2 Object类的常用方法&#xff1a; 3.1.3 Objects 概述 3.2 Math 类 3.3 System 类 3.3.1 System 类概述 3.3.2 常用方法 3.4 BigDecimal 类 3.4.1 BigDecimal 类概述 3.4.2 BigDecimal 类…

windows 编译 open3d 下

1.安装cmake 快速通道&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1gZYAlGRRj4UVGgaTBaZXjg?pwd1klo 提取码&#xff1a;1klo --来自百度网盘超级会员V4的分享警告不用管编译中成功就是61开始配置 cmake 那时候选的路径glew.libglfw3.libjsoncpp.libOpen3D.libpng.l…

jdk和Android sdk 和 ndk 和 apache-ant环境变量配置

ANDROID_HOMEG:\android-sdk-windowsCLASSPATH.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\jre\lib\rt.jar;%JAVA_HOME%\lib\dt.jar;%ANT_HOME%\libJAVA_HOMEC:\Program Files (x86)\Java\jdk1.8.0_361NDK_HOMEG:\android-ndk-r25cant下载https://www.likecs.com…

win环境安装部署Jenkins

win环境安装部署Jenkins&#xff0c;2022年11月&#xff1a;从2022年 6 月 28 日发布的 Jenkins 2.357 和2022年9 月发布的 LTS 版本开始&#xff0c;Jenkins 需要 Java 11 才能使用&#xff0c;放弃 Java 8&#xff0c;如果用JDK1.8&#xff0c;那么Jenkins版本需要是2.357版本…

ChatGPT逐鹿:谷歌“翻车”,微软抢跑,国内概念股狂飙

2023年开年才一个月&#xff0c;微软、谷歌两大巨头在AI战场就上演了“神仙打架”。 1月里两家公司围绕OpenAI和ChatGPT发布的密集消息余温尚在&#xff0c;2月7日&#xff0c;谷歌就官宣了自家的ChatGPT竞品Bard&#xff0c;并发布演示Demo。2月8日&#xff0c;微软直接上线了…

室内三维地图怎么做的?室内地图怎么做好看?

室内导航、定位中须采用基于建筑平面图生产的室内地图&#xff0c;现有的生产室内地图的方法都是依靠人工去根据建筑平面图使用矢量绘图工具去绘制矢量化的室内地图示意图&#xff0c;然后再去标明具体的区域名称功能或者标注位置点。因此制作室内地图往往都比较耗时&#xff0…

blender基础操作

shiftc&#xff1a;游标回到世界中心 shifta: 添加物体 gx或y或z&#xff1a;沿x轴或y轴或z轴移动 gx加数字&#xff1a;往x轴方向移动几格 rx加度数&#xff1a;绕x轴旋转多少度 分割界面&#xff1a;右键单击间隙&#xff0c;选择verticle tab: 来回切换编辑界面和物体界面&…

下班前几分钟,逮到一个腾讯10年老测试开发,聊过之后大彻大悟...

优秀的人真的是比比皆是&#xff0c;不比不知道&#xff0c;一比吓一跳 老话说的好&#xff0c;这人呐&#xff0c;一单在某个领域鲜有敌手了&#xff0c;就会闲得蛋疼。就在昨天下班的前几分钟认识了一个在阿里工作了 10 年的测试开发&#xff0c;因为本人天赋比较高&#xff…

Nacos 配置管理最佳实践

作者&#xff1a;翼严 Nacos 简介 Nacos 是一个更易于构建云原生应用的微服务基础平台&#xff0c;核心包含动态服务发现&#xff0c;配置管理&#xff0c;服务管理平台。 配置管理是 Nacos 的核心功能&#xff0c;它提供了运行期不重启应用的情况下动态修改配置值的功能。 …

修改Vue项目运行的IP和端口

前言 我们在使用VsCode启动Vue项目的时候&#xff0c;我发现&#xff1a;默认的端口号好像和tomcat一样&#xff0c;默认都是8080&#xff0c;如果8080被占用了&#xff0c;就会使用8081,8082这样的方式以此类推。 那么&#xff0c;我们是否可以像后端一样&#xff0c;通过修改…

MySQL数据库04——索引

索引基础 使用索引的主要原因之一就是提供唯一的字段值。唯一索引强制表中任意两条记录的索引值互不相同。创建唯一索引需要使用UNIQUE关键字。下面通过例题说明创建和使用惟一索引的方法。 创建和使用唯一索引 首先&#xff0c;在MySQL 中创建例题中将要使用的testuni表&…