ARM基于DWT实现硬件延时(GD32)

软件延时的缺点

软件延时的精度差,受系统主频影响,调教困难

硬件延时

DWT数据跟踪监视点单元硬件延时

硬件延时实现代码

delay.c

#include <stdint.h>
#include "gd32f30x.h"

/**
***********************************************************
* @brief DWT初始化配置
* @param
* @return 
***********************************************************
*/
void DelayInit(void) 
{
	/* 关闭 TRC */
	CoreDebug->DEMCR &= ~CoreDebug_DEMCR_TRCENA_Msk;
	/* 打开 TRC */
	CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;

	/* 关闭计数功能 */
	DWT->CTRL &= ~DWT_CTRL_CYCCNTENA_Msk;
	/* 打开计数功能 */
	DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;

	/* 计数清零 */
	DWT->CYCCNT = 0;
}

/**
***********************************************************
* @brief 微秒级延时函数
* @param nUs,最大延时时间( 2^32 / 内核主频 ) * 10^6 us 
* @return 
***********************************************************
*/
void DelayNus(uint32_t nUs)
{
	uint32_t tickStart = DWT->CYCCNT;

	/* 转换为nUs对应的时钟跳动次数*/
	nUs *= (rcu_clock_freq_get(CK_AHB) / 1000000);

	/* 延时等待 */
	while ((DWT->CYCCNT - tickStart) < nUs);
}

/**
***********************************************************
* @brief 毫秒级延时函数
* @param nMs,延时时间n毫秒
* @return 
***********************************************************
*/
void DelayNms(uint32_t nMs)
{
	for (uint32_t i = 0; i < nMs; i++)
	{
		DelayNus(1000);
	}
}

delay.h

#ifndef _DELAY_H_
#define _DELAY_H_
void DelayInit(void);
void DelayNus(uint32_t nUs);
void DelayNms(uint32_t nMs);
#endif

main.c

#include <stdint.h>
#include "gd32f30x.h"
#include "Delay.h"


int main(void)
{    
	// 初始化延时函数
	DelayInit();
	// 使能RCU时钟
	rcu_periph_clock_enable(RCU_GPIOA);
	// 配置引脚输出频率
	gpio_init( GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ, GPIO_PIN_8);

	while(1){
	   		gpio_bit_set(GPIOA, GPIO_PIN_8); 
			DelayNms(1000);
		    gpio_bit_reset(GPIOA, GPIO_PIN_8);
			DelayNms(1000);
	} 
	
}

 

相关推荐

  1. 基于Redis实现任务

    2024-05-12 11:58:01       18 阅读
  2. STM32系统滴答定时器SysTick实现精确ms和us

    2024-05-12 11:58:01       36 阅读
  3. STM32 HAL库 SysTick->VAL和SysTick->LOAD 实现us

    2024-05-12 11:58:01       32 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-12 11:58:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-12 11:58:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-12 11:58:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-12 11:58:01       18 阅读

热门阅读

  1. 顺序表和链表

    2024-05-12 11:58:01       11 阅读
  2. 巩固学习5

    2024-05-12 11:58:01       10 阅读
  3. 写SQL的心得

    2024-05-12 11:58:01       7 阅读
  4. 相机3:曝光三要素之光圈与快门

    2024-05-12 11:58:01       7 阅读
  5. 一次基类类型对象无法被传递问题的分析

    2024-05-12 11:58:01       8 阅读
  6. 函数指针和指针函数的区别

    2024-05-12 11:58:01       12 阅读
  7. 机器学习中的数据集的收集方法和工具

    2024-05-12 11:58:01       10 阅读
  8. 【C语言】预处理器

    2024-05-12 11:58:01       12 阅读
  9. conda 常用的命令

    2024-05-12 11:58:01       9 阅读
  10. 为什么PHP 是一门弱类型语言?

    2024-05-12 11:58:01       8 阅读
  11. WPF之页的使用

    2024-05-12 11:58:01       9 阅读
  12. svg 元素 getBoundingClientRect() 数值为 0

    2024-05-12 11:58:01       12 阅读
  13. go自定义error

    2024-05-12 11:58:01       12 阅读