STM32定时器的几种用法

发布时间:2024-03-07  

一、常用的定时功能

(1)基本、通用、高级定时器都有最基本的定时功能,定时功能用到的函数如下:

HAL_TIM_Base_Init 初始化定时,包括分频、 预装值等。

HAL_TIM_ConfigClockSource 选择定时器的时钟源

HAL_TIM_Base_Start_IT 开始定时器

HAL_TIM_PeriodElapsedCallback 超时后的回调函数

(2)Cubemx的配置,不管什么定时器,都是这个配置,注意开启中断,计算好最终的定时器时钟

(3)代码片段


1 void MX_TIM12_Init(void)

 2 {

 3   TIM_ClockConfigTypeDef sClockSourceConfig = {0};

 4 

 5   htim12.Instance = TIM12;

 6   htim12.Init.Prescaler = 199;

 7   htim12.Init.CounterMode = TIM_COUNTERMODE_UP;

 8   htim12.Init.Period = 999;

 9   htim12.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

10   htim12.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;

11   if (HAL_TIM_Base_Init(&htim12) != HAL_OK)

12   {

13     Error_Handler();

14   }

15   sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;

16   if (HAL_TIM_ConfigClockSource(&htim12, &sClockSourceConfig) != HAL_OK)

17   {

18     Error_Handler();

19   }

20

21 }

22 

23 int main(void)

24 {

33   HAL_Init();

34 

35   /* USER CODE BEGIN Init */

36 

37   /* USER CODE END Init */

38 

39   /* Configure the system clock */

40   SystemClock_Config();

47   MX_GPIO_Init();

48   MX_TIM12_Init();

49   /* USER CODE BEGIN 2 */

50     HAL_TIM_Base_Start_IT(&htim12);

51   /* USER CODE END 2 */

52 

53   /* Infinite loop */

54   /* USER CODE BEGIN WHILE */

55   while (1)

56   {

57     /* USER CODE END WHILE */

58         HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_13);

59         HAL_Delay(1000);

60     /* USER CODE BEGIN 3 */

61   }

62   /* USER CODE END 3 */

63 }

64 

65 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

66 {

67         if(htim->Instance == TIM12)

68         {

69                 static uint16_t cnt = 0;    

70                 if(++cnt >= 1000)

71                 {

72                         cnt = 0;

73                         HAL_GPIO_TogglePin(GPIOH,GPIO_PIN_9);

74                 }

75         }

76         

77 }

二、使用通用定时器或者高级定时器来生产PWM波形


(1)使用通用定时器生成1路PWM


a.使用到的定时器API


HAL_TIM_PWM_Init


HAL_TIM_PWM_ConfigChannel


HAL_TIM_PWM_Start


__HAL_TIM_SET_COMPARE


b.Cubemx的配置

选择内部始终,Channel 1 为PWM生成。

根据配置信息,可知:

定义定时器预分频,定时器实际时钟频率为:200MHz/(GENERAL_TIMx_PRESCALER+1)

实际时钟频率为:20MHz

定义定时器周期,当定时器开始计数到GENERAL_TIMx_PERIOD值是更新定时器并生成对应事件和中断

定时器产生中断频率为:20MHz/(999+1)=20KHz,即50us定时周期

GENERAL_TIM_CH1_PULSE/GENERAL_TIM_PERIOD*100%

所以,以上配置生成的PWM的频率为20KHz,占空比为50%。


c. 代码实现


int main(void)

{

  HAL_Init();


  SystemClock_Config();


  MX_GPIO_Init();

  MX_TIM2_Init();


    HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);


  while (1)

  {

  }

}


void MX_TIM2_Init(void)

{

  TIM_ClockConfigTypeDef sClockSourceConfig = {0};

  TIM_MasterConfigTypeDef sMasterConfig = {0};

  TIM_OC_InitTypeDef sConfigOC = {0};


  htim2.Instance = TIM2;

  htim2.Init.Prescaler = 9;

  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;

  htim2.Init.Period = 999;

  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;

  if (HAL_TIM_Base_Init(&htim2) != HAL_OK)

  {

    Error_Handler();

  }

  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;

  if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)

  {

    Error_Handler();

  }

  if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)

  {

    Error_Handler();

  }

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;

  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;

  if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)

  {

    Error_Handler();

  }

  sConfigOC.OCMode = TIM_OCMODE_PWM1;

  sConfigOC.Pulse = 500;

  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;

  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;

  if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)

  {

    Error_Handler();

  }

  HAL_TIM_MspPostInit(&htim2);


}


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    定时器实验(2024-01-18)
    常数的设置和有关控制寄存器的设置。本实验使用定时器功能产生1秒钟定时,程序运用定时中断方式,实现每一秒钟输出状态发生一次反转,即发光二极管每隔一秒钟点亮一次。 与定时器有关的寄存器有TMOD(工作方式寄存器)和控......
    STM32的通用定时器;STM32F1 的定时器非常多,由 2 个基本定时器(TIM6、TIM7)、4 个通用定时器(TIM2-TIM5)和 2 个高级定时器(TIM1、TIM8)组成。 1、定时器有哪......
    器,例如STC15系列就有四个定时/计数器,但是在使用上操作上是大同小异的。 定时器内部框图和结构介绍 定时器/计数器有定时器0(简称T0),定时器1(简称T1),定时器方式寄存器TMOD和定时器......
    无过多联络。 那对于STM32定时器而言,有哪些触发信号呢?这些信号来自何处?或流向哪里呢? 触发信号分两大类:触发输入信号【TRGI】,简单地讲就是从外部引入到本定时器的信号;另一类就是触发输出信号,即TRGO......
    根口线还具有第二种功能 ,P3口的各位如不设定为第二功能则自动处于第一功能。P3的第二功能涉及到串行口 、外部中断、定时器,与特殊功能寄存器有关。 四、89C51单片机有几个中断源?它们......
    的启动条件,加上了INT0/1引脚为高电平这一条件。:定时/计数模式选择位。C/T =0为定时模式;C/T=1为计数模式。 M1M0:工作方式设置位。定时/计数器有四种工作方式,由M1M0进行......
    色笔表示出),分别是:①时钟产生器部分,②时基单元部分,③输入捕获部分、④输出比较部分。 b.时钟产生器部分 在第一部分时钟选择上,STM32定时器有四种时钟源选择(图中蓝色笔标识),分别是: ①内部......
    语音芯片的音频输出方式有哪几种?;语音IC一般分为4种音频输出模式。但是我们常见的一般只有两种。是哪四种呢?分别是:电流型DAC音频输出模式、双路PWM直推型音频输出模式、电压型DAC音频......
    重装载寄存器 TIMx_CCR 捕捉寄存器 TIMx_RCR 重复计数寄存器[高级定时器有】 其中,ARR、CCR寄存器带预装载使能控制位,即它们的预装功能可以软件开启或关闭。 TIMx_ARR 带预......
    件中其他时槽的协议设计。定时器有一个可配置的定时器周期和一个8 位溢出计数器,可以用于保持跟踪已经经过的周期数。一个16 位捕获寄存器也用于记录收到/发送一个帧开始界定符的精确时间,或传输结束的精确时间,还有一个16......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>