四、【STM32 HAL库开发】TIM定时器:实现微秒延时

实验目的:使用TIM定时器来实现微妙级延时。

实验现象:输出的方波波形如图,可以看到周期是204us,频率是4.9khz,不是想要的5khz。这可能是因为计算有延时(也可能是我哪里配置的不太对),不过对于延时精度不高的场合,这个误差还可以接受。

一、CubeMX配置

1、配置时钟

        把系统时钟配置成72Mhz,配置过程参考第1节

2、配置TIM

        当系统时钟频率是72Mhz时,把预分频系数设置成71,那么计数器计数一次,所需时间就是:

T = \frac{1}{f}=\frac{1}{72Mhz/72} = \frac{1}{1Mhz}=1us

3、开启一个GPIO口来观察输出

        随便开一个GPIO引脚,我这里开启PA4。

二、写代码

1、编写延时函数

/* USER CODE BEGIN 0 */
#define TIM_HANDLE &htim1 //定义这个是为了方便移植

void delay_us(uint16_t nus)
{
	__HAL_TIM_SET_COUNTER(TIM_HANDLE, 0); //把计数器的值设置为0
	__HAL_TIM_ENABLE(TIM_HANDLE); //开启计数
	while (__HAL_TIM_GET_COUNTER(TIM_HANDLE) < nus); //每计数一次,就是1us,直到计数器值等于我们需要的时间
	__HAL_TIM_DISABLE(TIM_HANDLE); //关闭计数
}
/* USER CODE END 0 */

2、输出一个方波

        在main函数的while循环里写:

/* USER CODE BEGIN WHILE */
while (1)
{
    HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_4); //翻转PA4的电平
    delay_us(100); //延时100us
    //这样输出的方波周期应该是200us,频率应该是5khz
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */

要在STM32上使用HAL定时器实现微秒级别的延时,通常采用以下步骤: 1. **配置定时器**[^1]: - 选择合适的定时器(如TIMx),并配置它为自由运行模式以产生周期性中断。 - 设置定时器的预分频器和计数器寄存器,以获得所需的精度,通常是通过STM32CubeMX工具配置。 ```c TIM_HandleTypeDef htim; // 初始化定时器 TIM_TimeBaseInitTypeDef.TIM_Period = (microseconds * US_PER_TIM_TICK); TIM_TimeBaseInit(&htim, &TIM_InitStruct); // microseconds是你想要的延时期间 TIM_Cmd(&htim, ENABLE); ``` 2. **设置中断**: - 注册定时器溢出中断处理函数,并开启中断。 ```c EXTI_InitTypeDef EXTI_InitStructure; HAL_NVIC_EnableIRQ(TIMx_IRQn); // 替换TIMx为你选择的定时器 HAL_NVIC_SetPriority(TIMx_IRQn, 0, 0); __HAL_TIM_EXTI_ENABLE_IT(&htim, TIM_FLAG_UPDATE); // 对于更新事件(溢出) void TIMx_IRQHandler(void) { HAL_TIM_IRQHandler(&htim); } ``` 3. **等待中断**: - 在中断服务函数中,清除标志并重新启动定时器,直到达到期望的延迟时间。 ```c static uint32_t timeout_counter = microseconds; // 延迟总时间 void HAL_TIM_OVR榆告期Callback(TIM_HandleTypeDef *htim) { if(timeout_counter > 0) { timeout_counter--; HAL_TIM_Base_Stop(&htim); HAL_TIM_Base_Start(&htim); } else { // 延时结束,执行后续操作 } } ``` 这样,每当定时器溢出时,就会减小`timeout_counter`,当其为零时,就完成了预定的微秒延时
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值