首页 > 其他分享 >GD32单片机设置us级延时

GD32单片机设置us级延时

时间:2023-04-05 16:36:11浏览次数:43  
标签:ms VAL CTRL us 单片机 GD32 SysTick uint32

us延时会在很多外设驱动的时候用到,但是GD32提供的资料里面没有看到,只有一个ms延时的函数,不过GD32用的和stm32是一样的内核,因此也可以套用stm32嘀嗒定时器的版本,就是直接用stm32的思路来实现,这里直接贴代码:

说明一下实验平台:

  • GD32F470ZG
  • 立创梁山派开发板

代码如下:

#include "delay.h"

// #define USE_BLOCK
#ifdef USE_BLOCK


/* 和正点原子一样的延时方式,cpu死等,适用于时间比较短的方式 */
void delay_ms(uint32_t ms)
{
    SysTick->LOAD = SystemCoreClock / 1000 - 1; // 设置SysTick定时器为1毫秒
    SysTick->VAL = 0; // 设置初值为0
    SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; // 使能计数器

    for (uint16_t i = 0; i < ms; i++) {
        while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)) {
            // 循环等待计数到达目标值
        }
    }

    SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; // 关闭计数器
    SysTick->VAL = 0; // 时间到了溢出后要记得清空
}

void delay_us(uint32_t us)
{
    SysTick->LOAD = SystemCoreClock / 1000000 - 1; // 设置SysTick定时器为1毫秒
    SysTick->VAL = 0; // 设置初值为0
    SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; // 使能计数器

    for (uint16_t i = 0; i < us; i++) {
        while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)) {
            // 循环等待计数到达目标值
        }
    }

    SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; // 关闭计数器
    SysTick->VAL = 0; // 时间到了溢出后要记得清空
}

#else

/* 下面的方式是systick中断实现的,从逻辑分析仪看到的数据,效果更好一点 */
void delay_us(uint32_t us)
{
    uint32_t start_tick = SysTick->VAL;
    uint32_t us_tick = us * (SystemCoreClock / 1000000);
    while ((start_tick - SysTick->VAL) < us_tick) {
        // 等待
    }
}

void delay_ms(uint32_t ms)
{
    for (uint32_t i = 0; i < ms; i++) {
        delay_us(1000);
    }
}

#endif // DEBUG

上面提供了两种方式来实现,区别是第一种是忙等的方式,第二种是中断的方式,可以根据自己的需求适当选择。

标签:ms,VAL,CTRL,us,单片机,GD32,SysTick,uint32
From: https://www.cnblogs.com/lx2035/p/17289651.html

相关文章

  • Docker 下 RedisCluster 分片集群搭建
    1.Cluster分片集群1.1Cluster集群的结构和作用redis哨兵模式虽然提供了redis⾼可⽤、高并发读的解决方案,但是在海量数据应用场景下,仍然存在海量数据存储问题和高并发写的问题。当只有⼀个Master对外提供服务时,如果数据量特别⼤,内存占⽤问题严重,数据的高并发写、数......
  • Zbrush插件zwrap
    推荐:将 NSDT场景编辑器 加入你的3D开发工具链。首先要准备到的软件有maya(或者MAX,或者任意建模软件),zb,mari,八侯(任意烘培软件),以及zb的一款插件Zwrap。当我们自己的模型UV与贴图素材不匹配时,伟大的Zwrap就可以帮助我们解决这个问题。第一步:在Maya建一个与素材长款等比面片(如下图),......
  • Nexus仓库属性和分类
    Nexus作为一款Maven仓库管理器,仓库(Repository)自然是Nexus最核心的概念。Nexus中提供了许多仓库概念,如代理仓库、宿主仓库以及仓库组等。Nexus为每一种仓库都提供了丰富的配置参数,方便我们根据自身需要进行定制。Nexus仓库属性点击左边导航栏中的Repositories,可以看到N......
  • Navicat操作mysql遇问题1142-create command denied to user×××的解决
    原因:root@%表示root用户通过任意其他端访问操作被拒绝!授权即可:给用户添加CREATE,DROP权限。可以查看用户授权信息:showgrants;mysql>showgrants;+---------------------------------------------------------------------------------------------------------------......
  • ElementPlus文档本地启动
    1.下载ElementPlus项目本身ElementPlus官方项目本身是包含了最新的ElementPlus的开发文档的。这里放上ElementPlus的GitHub地址链接:ElementPlus(GitHub)有时候国内访问GitHub比较慢,所以这里也放下Gitee的地址:ElementPlus(Gitee)2.启动项目下载好项目之后,用命令行在项......
  • 使用 diffusers 训练你自己的 ControlNet
    简介ControlNet这个神经网络模型使得用户可以通过施加额外条件,细粒度地控制扩散模型的生成过程。这一技术最初由AddingConditionalControltoText-to-ImageDiffusionModels这篇论文提出,并很快地风靡了扩散模型的开源社区。作者开源了8个不同的模型,使得用户可以用8种......
  • rust 建立窗口并关闭。
    [dependencies]web-view="0.7.3"usestd::thread;useweb_view::*;fnmain(){lethandle=thread::spawn(||{letwebview=web_view::builder().title("").content(Content::Html("<html>......
  • [rust学习] 二、 rust中的智能指针
     rust中智能指针大致分类以下内容提炼自rust官方文档: https://doc.rust-lang.org/book/ch15-01-box.html 一、Box<T>1.使用例子:  1fnmain(){2letb=Box::new(5);3println!("b={}",b);4}2.特性:a.由B......
  • 1、Clickhouse 单节点与集群部署
    一、单节点部署1.1、修改文件描述符 vim/etc/security/limits.conf*softnofile65536*hardnofile65536*softnproc131072*hardnproc131072 vim/etc/security/limits.d/20-nproc.conf*softnofile65536*hardnofile65536*softnproc131072*hard......
  • Python MySQL UsingGuide
    1.MySQLInstall2.MySQLBasicalTestDemonstrationimportpymysql.cursorsimporttime#ConnecttothedatabaseT1=time.time()connection=pymysql.connect(host='localhost',user='root',......