ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

STM32学习笔记(CubeMX配HAL)(第四天:定时器)

2021-10-15 22:31:32  阅读:259  来源: 互联网

标签:TIM2 分频器 定时器 HAL STM32 TIM CubeMX GPIO


今天主要学习的是STM32的一个定时器开发的东西。

因为51的定时器很少,但是STM32的定时器资源非常多,所以说这玩意儿解释起来是特别复杂的。一般来说,常用的定时器大概有以下几种类型:

第一种是:SYSTICK:系统滴答定时器:集成在M3上的定时器,是给RTOS提供时钟节拍的,不属于外设的那种。主要用于移植芯片啥的。或者简单的延时啥的简单功能都用这个。因为有些芯片可能因为版本或者各种各样的原因是用不了HAL库里的DELAY的,所以可以自己写一个DELAY来操作,这时候就需要用到这个定时器。

第二种是:WatchDog:看门狗定时器

第三种是:RTC:实时时钟

第四五种是:基本定时器TIM6/7

第六七八九种是:通用定时器TIM2/3/4/5:在基本定时器上加入了输出比较,输入捕获,PWM,单脉冲生成的功能,所以说是运用最广泛的!!!!!!!!

第十十一种是:高级定时器TM1/2

一般来说,这些定时器现在都不用全部搞懂,因为说实话,你不用的话,很快就搞忘了,就没啥必要。

主要了解下重要的几个定时器就行了,比较常用。如果不是特殊项目要求,很多的功能可能根本用不上。

那么接下来,我们主要了解下通用定时器。对于通用定时器而言,它是通过啥可编程预分频器来驱动的一个16位的自动重装的计数器构成。可以对内外部时钟或者触发源进行计数。

它的基本工作原理:输入一个时钟信号(过程复杂),先送入16位预分频器(0~65535),等预分频器溢出后,再向16位的主计数器来发送一个脉冲信号。

其中,预分频器的系数,就是加法计数器的溢出值。

所以说,它的中断时间就可以计算了:

定时时间:=(可编程预分频器设置的值+1)*(主计数器设置的值+1)*(1/定时器的时钟频率)

 

比如说选择了一个32MHZ的时钟芯片,那么如果想定时500MS,这时候你就要看一下怎么设置更完美;比如32000*500/32000000=0.5s,大概就是这样一个逻辑。

第二步就是再次设置回调函数!!!

接下来就是例子的部分,一般来说,我们只需要修改一个外设参数,比如每隔0.5s或者1.5s啥的来翻转LED,就达到了我们定时的一个区别。

其余的LED配置是相同的,除了再TIMER里我们需要配置TIM2和TIM3

 

这里我配置的是8Mhz的时钟频率,所以计算方法是8000*1000/8000000=1s

0.5s之类的也是同类型的一个配置方法

紧接着和前面一样,对整个程序进行生成。生成后我们可以在main.c里的上层,看见多出来的TIM2和TIM3的初始化代码。

可以简单看一下TIM的一个配置。我们主要认知的就是PRESCALER预分频器和Period主计数器这两个玩意儿。时间的话,就可以直接在里面进行修改。

 

接下来由于需要用这个定时器,我们就需要干啥呢,需要去修改回调函数。就是去stm32f1xx_it.c里面找。这里可以看见这俩。

 

 

我们进入里面终端服务函数,找到里面关于时间间隔的一个定义。

HAL_TIM_IRQHandler,就是这个函数

然后通过经典操作CTRL+F找到它所定义的虚函数。

然后调用里面的虚函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

{

  if(htim->Instance == TIM2)//后面配置TIM3一样的

  {

HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_2);

  }

}

上述的意思就是如果说,我发现我时钟的发生是在TIM2的话,那么久翻转我的LED。

之后我们回调了之后,就需要启动一下这个定时器。在stm32f1xx_hal_tim.c里面我们可以找到HAL_TIM_Base_Start();这样一个函数(这玩意儿有些实在stm32f1xx_hal.c里面找到的,我不是。。。)

这个函数大概又三个,不过后面的尾缀是不一样的,有STOP,还有IT的。如果说你要使用中断,一般就会用到IT。

这里我们用的就是

HAL_TIM_Base_Start_IT();括号里就是HTIM2/3的地址,所以需要加&指针。

那么代码如下

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if(htim->Instance == TIM2)
  {
	HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_2);
  }
  if(htim->Instance == TIM3)
  {
	HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_3);
  }
}

int main(void)
{

  MX_GPIO_Init();
  MX_TIM2_Init();
  MX_TIM3_Init();

  /* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start_IT(&htim2);
  HAL_TIM_Base_Start_IT(&htim3);
  /* USER CODE END 2 */

  while (1)
  {
   

   
  }

}

我只摘要了必要的回调函数和MAIN函数里的东西。总的来说这个还是很简单的朋友们。那么我们明天见。新的其实已经学了,但是还没写。

标签:TIM2,分频器,定时器,HAL,STM32,TIM,CubeMX,GPIO
来源: https://blog.csdn.net/m0_57628341/article/details/120791735

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有