1. stm32 HAL库 确定定时器时钟
确定定时器为哪个时钟?
- 找到初始化函数 MX_TIM1_Init();
- 进入函数,找到 HAL_TIM_Base_Init(&htim1)
- 进入函数,找到 HAL_TIM_Base_MspInit(htim);
- 进入函数,依次找到定时器时钟开启函数;
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{
if(tim_baseHandle->Instance==TIM1)
{
/* USER CODE BEGIN TIM1_MspInit 0 */
/* USER CODE END TIM1_MspInit 0 */
/* TIM1 clock enable */
//就是这里,进入就能看见是哪个时钟
__HAL_RCC_TIM1_CLK_ENABLE();
/* USER CODE BEGIN TIM1_MspInit 1 */
/* USER CODE END TIM1_MspInit 1 */
}
else if(tim_baseHandle->Instance==TIM3)
{
/* USER CODE BEGIN TIM3_MspInit 0 */
/* USER CODE END TIM3_MspInit 0 */
/* TIM3 clock enable */
__HAL_RCC_TIM3_CLK_ENABLE();
/* TIM3 interrupt Init */
HAL_NVIC_SetPriority(TIM3_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(TIM3_IRQn);
/* USER CODE BEGIN TIM3_MspInit 1 */
/* USER CODE END TIM3_MspInit 1 */
}
else if(tim_baseHandle->Instance==TIM8)
{
/* USER CODE BEGIN TIM8_MspInit 0 */
/* USER CODE END TIM8_MspInit 0 */
/* TIM8 clock enable */
__HAL_RCC_TIM8_CLK_ENABLE();
/* USER CODE BEGIN TIM8_MspInit 1 */
/* USER CODE END TIM8_MspInit 1 */
}
}
- 假如我们要看TIM1在哪个时钟下,进入TIM1时钟开启函数即可
2. 配置定时器1为 ms 毫秒延时定时器
- 根据文章开头的方法,定时器1使用APB2时钟,主频80MHz
- 设置TIM1参数,分频系数10,000,计数频率为8KHz
- 生成工程,添加延时函数代码
void tx_delay_ms(uint16_t nms) //量程0-8191ms
{
__HAL_TIM_SetCounter(&htim1, 0);//htim1
__HAL_TIM_ENABLE(&htim1);
while(__HAL_TIM_GetCounter(&htim1) < (8 * nms));//计数频率8KHz,8次即为1ms
/* Disable the Peripheral */
__HAL_TIM_DISABLE(&htim1);
}
- 然后再在头文件添加声明即可
3. 配置定时器8为 us 微秒延时定时器
- 根据文章开头的方法,定时器8使用APB2时钟,主频80MHz
- 设置TIM8参数,分频系数10,计数频率为8MHz
- 生成工程,添加延时函数代码
void tx_delay_us(uint16_t nus) //量程0-8191us
{
__HAL_TIM_SetCounter(&htim8, 0);//htim8
__HAL_TIM_ENABLE(&htim8);
while(__HAL_TIM_GetCounter(&htim8) < (8 * nus));//计数频率8MHz,8次即为1us
/* Disable the Peripheral */
__HAL_TIM_DISABLE(&htim8);
}
- 然后再在头文件添加声明即可
4. 中断方式延时函数
- 我们使用定时器3来产生中断,定时器3在APB1下,80MHz
- 设置定时器3参数
- 编写延时函数
- 首先声明中断累加变量
static volatile uint16_t tim3_counter;
- 编写延时函数延时时长(0-65535ms)
void tim3_delay_ms(uint16_t nms)
{
tim3_counter = 0;
while(tim3_counter!=nms);
}
- 设置定时器中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == htim3.Instance) //定时器3中断 1ms/次
{
tim3_counter++;
}
}
- 开始使用!