HAL库实践记录之定时器

LED定时闪烁实验

先简单说明一下用法。

stm32cube配置TIM3,时钟源选择内部时钟。在下方参数配置中输入预分频值和计数值,使能自动装载。

在主函数中添加代码

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_SPI1_Init();
  MX_USART1_UART_Init();
  MX_TIM3_Init();

  /* Initialize interrupts */
  MX_NVIC_Init();
	
  /* USER CODE BEGIN 2 */
	HAL_TIM_Base_Start_IT(&htim3);  //这是添加的代码 
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
				if(LED_FLAG)
					LED_On();
				else				
					LED_Off();
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

在stm32f1xx_hal_tim.c文件中找到如下定义:

__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(htim);

  /* NOTE : This function should not be modified, when the callback is needed,
            the HAL_TIM_PeriodElapsedCallback could be implemented in the user file
   */
}

去掉__weak后把它复制到自己的代码中,如下。(自动生成的代码中,中断回调函数都有一个__weak 关键字表示弱定义,加上了__weak 修饰符的函数,去掉__weak,我们在自己的文件中定义一个相同的函数,编译时会忽略弱定义的函数,会编译我们定义的函数。如果我们没有重新定义则会编译弱定义的代码)

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(htim);
	if (htim == (&htim3))
		LED_FLAG = !LED_FLAG;

  /* NOTE : This function should not be modified, when the callback is needed,
            the HAL_TIM_PeriodElapsedCallback could be implemented in the user file
   */
}

至此定时器就可以正常使用了。

 

下面分析一下定时器相关带代码工作流程。

main中添加的HAL_TIM_Base_Start_IT(&htim3);函数是启动基本定时器的中断。如果配制了其他的定时器相关的功能则有其他的对应的启动函数例如HAL_TIM_PWM_Start_IT() ;HAL_TIM_OnePulse_Start_IT() ;等

首先看一下汇编引导文件

中断向量表中定义是 EXPORT  TIM3_IRQHandler            [WEAK],所以中断发生时最先执行的是下面这个函数,他引用了HAL_TIM_IRQHandler(&htim3);

void TIM3_IRQHandler(void)  //删除了注释太占地方
{

  HAL_TIM_IRQHandler(&htim3);

}

我们再开启TIM4作为对比,结构相同

void TIM4_IRQHandler(void) //删除了注释太占地方
{
  HAL_TIM_IRQHandler(&htim4);

}

在HAL_TIM_IRQHandler(&htim3);中找到如下代码。执行了我们的中断回调函数

  if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_UPDATE) != RESET)
  {
    if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_UPDATE) != RESET)
    {
      __HAL_TIM_CLEAR_IT(htim, TIM_IT_UPDATE);
#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)     //此定义值为0,执行else分支
      htim->PeriodElapsedCallback(htim);
#else
      HAL_TIM_PeriodElapsedCallback(htim);   
#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
    }
  }

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用HAL库开启定时器,你需要进行以下步骤: 1. 首先,你需要在CubeMX或者手动编写代码中初始化定时器的相关参数,例如预分频器、计数模式、周期等。 2. 在初始化定时器的同时,你还需要初始化定时器的GPIO引脚。 3. 接下来,在代码中使用 `HAL_TIM_Base_Init()` 函数初始化定时器,并使用 `HAL_TIM_Base_Start()` 函数启动定时器。 以下是一个基于HAL库的例子,展示了如何初始化和启动一个定时器: ```c #include "stm32f1xx_hal.h" TIM_HandleTypeDef htim2; void MX_TIM2_Init(void) { // 初始化 TIM2 htim2.Instance = TIM2; htim2.Init.Prescaler = 7200 - 1; // 设置预分频器,将定时器时钟频率分频为1MHz htim2.Init.CounterMode = TIM_COUNTERMODE_UP; // 设置计数模式为向上计数 htim2.Init.Period = 10000 - 1; // 设置周期为10000个计数单位,即10ms htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; // 设置时钟分频系数 HAL_TIM_Base_Init(&htim2); // 启动定时器 HAL_TIM_Base_Start(&htim2); } int main(void) { // HAL库初始化代码 // 初始化定时器 MX_TIM2_Init(); while (1) { // 主循环代码 } } ``` 在上面的例子中,我们初始化了定时器TIM2,并将时钟频率设置为1MHz。然后,启动了定时器。 请注意,以上代码仅提供了定时器的初始化和启动步骤,你需要根据具体需求配置定时器的其他参数,例如中断使能、通道配置等。具体的配置取决于你的应用场景和需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值