STM32CubeMX HAL库自定义延时函数 ms和us

1. stm32 HAL库 确定定时器时钟

确定定时器为哪个时钟?

  1. 找到初始化函数 MX_TIM1_Init();
  2. 进入函数,找到 HAL_TIM_Base_Init(&htim1)
  3. 进入函数,找到 HAL_TIM_Base_MspInit(htim);
  4. 进入函数,依次找到定时器时钟开启函数;
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参数
    在这里插入图片描述
  • 编写延时函数
  1. 首先声明中断累加变量
static volatile uint16_t tim3_counter;
  1. 编写延时函数延时时长(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++;
	}
}
  • 开始使用!

5. 完成!

猜你喜欢

转载自blog.csdn.net/u014779536/article/details/104370220