一、延时机制(流程)
记录CNT的最初值–> (开始计数) --> 比较(CNT当前值 - CNT最初值) --> (到达延时的值) --> 停止计数
二、__HAL_TIM_GET_COUNTER
相关代码如下,大致的意思就是可以在运行之中获取定时器计数寄存器(TIM Counter Register)的值,这个寄存器记录了定时器的运行次数。
/**
* @brief Get the TIM Counter Register value on runtime.
* @param __HANDLE__ TIM handle.
* @retval 16-bit or 32-bit value of the timer counter register (TIMx_CNT)
*/
#define __HAL_TIM_GET_COUNTER(__HANDLE__) ((__HANDLE__)->Instance->CNT)
三、具体写法
1,STM32cube的配置
(1)时钟
(2)定时器配置
(3)定时器6初始化的具体代码(感兴趣的可以了解下)
void MX_TIM6_Init(void)
{
TIM_MasterConfigTypeDef sMasterConfig = {0};
htim6.Instance = TIM6;
htim6.Init.Prescaler = 72-1;
htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
htim6.Init.Period = 65535;
htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim6) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
}
2,软件延时函数
void HAL_Delay_us(uint16_t Delay)
{
uint16_t tickstart = __HAL_TIM_GetCounter (&htim6 );//计数器初始值
uint16_t wait = Delay;//需要延时的值
HAL_TIM_Base_Start (&htim6); //打开定时器
while ((__HAL_TIM_GetCounter (&htim6 ) - tickstart) < wait);//等待
HAL_TIM_Base_Stop(&htim6); //关闭定时器
__HAL_TIM_SetCounter (&htim6,0 );//定时器计数器清零,往往可以省略,会自动清零
}
3,调用示例
HAL_Delay_us(100); //延时100us