硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1161|回复: 4
收起左侧

[STM32H7] 分享一种利用Cortex内核自带的DWT计数器实现us延时的方法

[复制链接]

13

主题

166

回帖

220

积分

高级会员

积分
220
发表于 2024-10-25 11:28:47 | 显示全部楼层 |阅读模式
分享一种利用Cortex内核自带的DWT计数器实现us延时的方法,采用时钟摘取法实现us延时
[C] 纯文本查看 复制代码
void delay_us(volatile uint32_t nus){	
	volatile uint32_t told=DWT->CYCCNT,tnow,tcnt=0;	      //刚进入时的计数器值	
	volatile uint32_t ticks=nus*(SystemCoreClock/1000000);//需要的节拍数 
	do{
		tnow=DWT->CYCCNT;	
		tcnt+=tnow-told;
		told=tnow;  
	}while(tcnt<ticks);								    
}  

该函数在调用前需要开启DWT,代码如下:
[C] 纯文本查看 复制代码
void DWT_Init(void){
	CoreDebug->DEMCR|=CoreDebug_DEMCR_TRCENA_Msk;
	DWT->CYCCNT=0;
	DWT->CTRL|=DWT_CTRL_CYCCNTENA_Msk;
}		

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-10-25 11:51:47 | 显示全部楼层
谢谢楼主分享,这样写更简洁

[C] 纯文本查看 复制代码
/*
*********************************************************************************************************
*	函 数 名: bsp_DelayUS
*	功能说明: 这里的延时采用CPU的内部计数实现,32位计数器
*             	OSSchedLock(&err);
*				bsp_DelayUS(5);
*				OSSchedUnlock(&err); 根据实际情况看看是否需要加调度锁或选择关中断
*	形    参: _ulDelayTime  延迟长度,单位1 us
*	返 回 值: 无
*   说    明: 1. 主频168MHz的情况下,32位计数器计满是2^32/168000000 = 25.565秒
*                建议使用本函数做延迟的话,延迟在1秒以下。  
*             2. 实际通过示波器测试,微妙延迟函数比实际设置实际多运行0.25us左右的时间。
*             下面数据测试条件:
*             (1). MDK5.15,优化等级0, 不同的MDK优化等级对其没有影响。
*             (2). STM32F407IGT6
*             (3). 测试方法:
*				 GPIOI->BSRRL = GPIO_Pin_8;
*				 bsp_DelayUS(10);
*				 GPIOI->BSRRH = GPIO_Pin_8;
*             -------------------------------------------
*                测试                 实际执行
*             bsp_DelayUS(1)          1.2360us
*             bsp_DelayUS(2)          2.256us
*             bsp_DelayUS(3)          3.256us
*             bsp_DelayUS(4)          4.256us
*             bsp_DelayUS(5)          5.276us
*             bsp_DelayUS(6)          6.276us
*             bsp_DelayUS(7)          7.276us
*             bsp_DelayUS(8)          8.276us
*             bsp_DelayUS(9)          9.276us
*             bsp_DelayUS(10)         10.28us
*            3. 两个32位无符号数相减,获取的结果再赋值给32位无符号数依然可以正确的获取差值。
*              假如A,B,C都是32位无符号数。
*              如果A > B  那么A - B = C,这个很好理解,完全没有问题
*              如果A < B  那么A - B = C, C的数值就是0xFFFFFFFF - B + A + 1。这一点要特别注意,正好用于本函数。
*********************************************************************************************************
*/
void bsp_DelayUS(uint32_t _ulDelayTime)
{
    uint32_t tCnt, tDelayCnt;
	uint32_t tStart;
		
	tStart = DWT_CYCCNT;                                     /* 刚进入时的计数器值 */
	tCnt = 0;
	tDelayCnt = _ulDelayTime * (SystemCoreClock / 1000000);	 /* 需要的节拍数 */ 		      

	while(tCnt < tDelayCnt)
	{
		tCnt = DWT_CYCCNT - tStart; /* 求减过程中,如果发生第一次32位计数器重新计数,依然可以正确计算 */	
	}
}
回复

使用道具 举报

13

主题

166

回帖

220

积分

高级会员

积分
220
 楼主| 发表于 2024-10-25 14:26:38 | 显示全部楼层
eric2013 发表于 2024-10-25 11:51
谢谢楼主分享,这样写更简洁

[mw_shl_code=c,true]/*

确实少代码了,可以的
回复

使用道具 举报

3

主题

83

回帖

92

积分

初级会员

积分
92
发表于 2024-10-26 06:49:44 来自手机 | 显示全部楼层
有没有在stm32g0xx上用过?
回复

使用道具 举报

95

主题

529

回帖

829

积分

金牌会员

积分
829
发表于 2024-10-26 08:23:25 | 显示全部楼层
way2888 发表于 2024-10-26 06:49
有没有在stm32g0xx上用过?

我记得STM32的M0内核没有DWT。
共产主义一定胜利!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-4-28 19:31 , Processed in 0.279576 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表