蓝桥杯嵌入式学习笔记---基于STM32G431RB-基本定时器应用

一,定时器原理

1,官方板子上的定时器资源 

 

2,可以到 比赛资料数据手册的这一章找相关定时器的复用管角。

3,两个关键参数

1)预分频器里面的分频系数----想20分频就写19

2)重装载寄存器arr,想要记1000就写999,

举例,系统时钟80MHz,利用定时器六想定时一秒,分频给7999,因为是基本定时器只能向上计数,又因为是最大16位即65535。那arr就给9999,

每记到一次10000,就出发中断,然后再重新计时进行循环。

二,CuneMX的相关配置

1,定时器的配置

2,中断配置

三,移植

timer.c

#include "basic_timer6/bsp_basic_timer6.h"



TIM_HandleTypeDef htim6;
void BASIC_TIM6_Init(void)
{
  TIM_MasterConfigTypeDef sMasterConfig = {0};

  htim6.Instance = TIM6;
  htim6.Init.Prescaler = 7999;
  htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim6.Init.Period = 9999;
  htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim6) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }

}

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{

  if(tim_baseHandle->Instance==TIM6)
  {
    __HAL_RCC_TIM6_CLK_ENABLE();
    HAL_NVIC_SetPriority(TIM6_DAC_IRQn, 2, 0);
    HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn);
  }
}

 timer.h

#include "main.h"
extern TIM_HandleTypeDef htim6;
void BASIC_TIM6_Init(void);

 main.h

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
		  i++;
	sprintf((char*)Lcd_Disp_String,"timer: %03d",(unsigned int )i);
	LCD_DisplayStringLine(Line5,Lcd_Disp_String);
	
		HAL_TIM_Base_Start_IT(&htim6);
}

 //别忘了在初始化之后加上

	HAL_TIM_Base_Start_IT(&htim6);

it.c

void TIM6_DAC_IRQHandler(void)
{
  /* USER CODE BEGIN TIM6_DAC_IRQn 0 */

  /* USER CODE END TIM6_DAC_IRQn 0 */
  HAL_TIM_IRQHandler(&htim6);
  /* USER CODE BEGIN TIM6_DAC_IRQn 1 */

  /* USER CODE END TIM6_DAC_IRQn 1 */
}

猜你喜欢

转载自blog.csdn.net/qq_59320783/article/details/128546769