当前位置:   article > 正文

STM32CubeIDE(Timer)_cubeide 定时器

cubeide 定时器

目录

一、基本定时器

1、TIM6和TIM7简介

2、TIM6和TIM7主要特性

3、CubeMX配置

 4、代码编写

二、通用定时器

1、简介

2、主要功能

3、生成PWM波

3.1 固定占空比

3.2 可变占空比

4、输出比较

5、输入PWM

5.1 CubeMX配置 

 5.2 代码编写

一、基本定时器

1、TIM6和TIM7简介

16位递增计数器,有DMA请求生成,捕获比较通道数0,所在总线:APB1,只具有定时功能,有连续定时模式和单次定时模式

基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动。
它们可以作为通用定时器提供时间基准,特别地可以为数模转换器(DAC)提供时钟。实际上,它
们在芯片内部直接连接到DAC并通过触发输出直接驱动DAC。两定时器相互独立,不共享任何资源

2、TIM6和TIM7主要特性

● 16位自动重装载累加计数器
● 16位可编程(可实时修改)预分频器,用于对输入的时钟按系数为1~65536之间的任意数值
分频
● 触发DAC的同步电路
● 在更新事件(计数器溢出)时产生中断/DMA请求

3、CubeMX配置

TIM6配置为连续定时模式,1ms中断一次

 TIM7配置为单次定时模式,2s进入中断

配置中断优先级 

配置LED引脚

 

 4、代码编写

启动TIM6中断

  1. /* USER CODE BEGIN 2 */
  2. HAL_TIM_Base_Start_IT(&htim6);
  3. /* USER CODE END 2 */
  1. /* USER CODE BEGIN WHILE */
  2. while (1)
  3. {
  4. if(ledFlag==1)
  5. {
  6. ledFlag=0;
  7. HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
  8. HAL_TIM_Base_Start_IT(&htim7);
  9. }
  10. /* USER CODE END WHILE */
  11. /* USER CODE BEGIN 3 */
  12. }
  13. /* USER CODE END 3 */
  1. /* USER CODE BEGIN 1 */
  2. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  3. {
  4. if(htim->Instance==TIM6)
  5. {
  6. timerCount++;
  7. if(timerCount==1500)
  8. {
  9. timerCount=0;
  10. ledFlag=1;
  11. }
  12. }
  13. else if(htim->Instance==TIM7)
  14. {
  15. HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
  16. }
  17. }
  18. /* USER CODE END 1 */

二、通用定时器

1、简介

通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成。它适用于多种场合,包括测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)。使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。每个定时器都是完全独立的,没有互相共享任何资源。它们可以一起同步操作

2、主要功能

通用TIMx (TIM2、 TIM3、 TIM4和TIM5)定时器功能包括:
● 16位向上、向下、向上/向下自动装载计数器
● 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536之间的任意
数值
● 4个独立通道:
─ 输入捕获
─ 输出比较
─ PWM生成(边缘或中间对齐模式)
─ 单脉冲模式输出
● 使用外部信号控制定时器和定时器互连的同步电路
● 如下事件发生时产生中断/DMA:
─ 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
─ 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
─ 输入捕获
─ 输出比较
● 支持针对定位的增量(正交)编码器和霍尔传感器电路
● 触发输入作为外部时钟或者按周期的电流管理

3、生成PWM波

3.1 固定占空比

①CubeMX配置

TIM3基础配置

 TIM3中断开启

 

 ②编写代码

  1. HAL_TIM_Base_Start_IT(&htim3);//启动定时器3
  2. HAL_TIM_PWM_Start_IT(&htim3, TIM_CHANNEL_1);//启动定时器3CH1通道输出PWM波

3.2 可变占空比

  1. //读取TIM3 CH1 Compare
  2. int CH1_Value=__HAL_TIM_GetCompare(&htim3,TIM_CHANNEL_1);

动态修改TIM3 CH1 占空比,可以实现呼吸灯效果

  1. //脉宽调制
  2. int pulsWidth=100,dirInc=0;
  3. void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
  4. {
  5. if(htim->Instance==TIM3)
  6. {
  7. if(dirInc==0)
  8. {
  9. pulsWidth++;
  10. if(pulsWidth>=195)
  11. {
  12. pulsWidth=195;
  13. dirInc=1;
  14. }
  15. }
  16. else
  17. {
  18. pulsWidth--;
  19. if(pulsWidth<=5)
  20. {
  21. pulsWidth=5;
  22. dirInc=0;
  23. }
  24. }
  25. }
  26. __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,pulsWidth);//设置TIM3 CH1占空比
  27. }

4、输出比较

输出总是50%占空比的方波,脉宽总是与ARR的值相等,如果CCR和计数器的值匹配,那么就会使CH1的输出翻转

①CubeMX配置

②代码编写

  1. HAL_TIM_Base_Start(&htim4);
  2. HAL_TIM_OC_Start(&htim4, TIM_CHANNEL_1);

5、输入PWM

5.1 CubeMX配置 

中断配置

 5.2 代码编写

  1. HAL_TIM_Base_Start(&htim2);
  2. HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);
  3. HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);
  1. //输入PWM
  2. void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
  3. {
  4. int IC1_Width=__HAL_TIM_GET_COMPARE(&htim2,TIM_CHANNEL_1);
  5. int IC2_Pulse=__HAL_TIM_GET_COMPARE(&htim2,TIM_CHANNEL_2);
  6. char buff[20]="";
  7. sprintf(buff,"IC1_Width:%d \r\n",IC1_Width);
  8. HAL_UART_Transmit(&huart2, (uint8_t *)buff, strlen(buff),HAL_MAX_DELAY);
  9. sprintf(buff,"IC2_Pulse:%d \r\n",IC2_Pulse);
  10. HAL_UART_Transmit(&huart2, (uint8_t *)buff, strlen(buff),HAL_MAX_DELAY);
  11. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/739163
推荐阅读
相关标签
  

闽ICP备14008679号