使用定时器tim12用于延时函数计时。
摘自中文参考手册,各个定时器所在的总线APB1,APB2
使用定时器12作为延时定时器。查看时钟树时钟频率APB2总线,168Mhz,APB1总线84Mhz,以此为依据设置定时器的预分频值。
配置代码如下
#include "delay.h"
TIM_HandleTypeDef htim9;
void delay_init(void)
{
{
/* USER CODE BEGIN TIM12_Init 0 */
/* USER CODE END TIM12_Init 0 */
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_SlaveConfigTypeDef sSlaveConfig = {0};
/* USER CODE BEGIN TIM12_Init 1 */
__HAL_RCC_TIM12_CLK_ENABLE();
/* USER CODE END TIM12_Init 1 */
htim12.Instance = TIM12;
htim12.Init.Prescaler = 84-1; // 设置预分频器,使得计数频率为1MHz
htim12.Init.CounterMode = TIM_COUNTERMODE_UP;
htim12.Init.Period = 30000;
htim12.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim12.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim12) != HAL_OK)
{
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim12, &sClockSourceConfig) != HAL_OK)
{
Error_Handler();
}
sSlaveConfig.SlaveMode = TIM_SLAVEMODE_RESET;
sSlaveConfig.InputTrigger = TIM_TS_ITR0;
if (HAL_TIM_SlaveConfigSynchro(&htim12, &sSlaveConfig) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM12_Init 2 */
/* USER CODE END TIM12_Init 2 */
}
}
void delay_us(uint16_t us)
{
__HAL_TIM_SET_COUNTER(&htim12, 0); // 将TIM12的计数器值设置为0
__HAL_TIM_ENABLE(&htim12);//(&htim12); // 启动定时器
while (__HAL_TIM_GET_COUNTER(&htim12) < us) {
// 等待计数器达到指定的延时时间
}
__HAL_TIM_DISABLE(&htim12);//HAL_TIM_Base_Stop(&htim12); // 停止定时器
}
void delay_ms(uint32_t ms)
{
while (ms > 0) {
delay_us(1000);
ms--;
}
}