起因
由于使用了CUBE,原子哥的延时就用不了,所以尝试其他延时函数:CUBE的HAL_Delay()和使用STM32的DWT(Data watchpoint trigger)
前言
为什么要学习这种延时的方法?
- HAL_Delay实用程序函数:它建立在SysTick计时器上,当我们跑操作系统,就一般会占用一个硬件定时器——SysTick(也可以把其他定时器当成时钟),这样一来又难免产生冲突。
- 以便为在阻塞和非阻塞模式下工作的驱动程序提供两个版本。阻塞函数将使用我们今天将要开发的延迟实用程序(DWT)。非阻塞功能将由 SysTick 计时器处理
1.系统图
2.DWT_Initialization() 函数
要实现延时的功能,总共涉及到三个寄存器:DEMCR
、DWT_CTRL
、DWT_CYCCNT
,分别用于开启DWT功能、开启CYCCNT及获得系统时钟计数值。
uint32_t DWT_Delay_Init(void)
{
/* 禁用 TRC */
CoreDebug->DEMCR &= ~CoreDebug_DEMCR_TRCENA_Msk; // ~0x01000000;
/* 启动 TRC */
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; // 0x01000000;
/* Disable clock cycle counter */
DWT->CTRL &= ~DWT_CTRL_CYCCNTENA_Msk; //~0x00000001;
/* 启动 时钟周期计数器 */
DWT->CTRL |= DWT_