实验目的:使用TIM定时器来实现微妙级延时。
实验现象:输出的方波波形如图,可以看到周期是204us,频率是4.9khz,不是想要的5khz。这可能是因为计算有延时(也可能是我哪里配置的不太对),不过对于延时精度不高的场合,这个误差还可以接受。
一、CubeMX配置
1、配置时钟
把系统时钟配置成72Mhz,配置过程参考第1节
2、配置TIM
当系统时钟频率是72Mhz时,把预分频系数设置成71,那么计数器计数一次,所需时间就是:
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 */