STM32CubeMX系列06——定时器(定时、PWM、输入捕获)

这篇具有很好参考价值的文章主要介绍了STM32CubeMX系列06——定时器(定时、PWM、输入捕获)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

====>>> 文章汇总(有代码汇总) <<<====

1. 所用硬件

正点原子Mini板,主控 STM32F103RCT6.

定时器简介
这里主要讨论通用定时器(系统嘀嗒定时器、看门狗定时器、RTC定时器不考虑在内)

对于STM32F103RCT6 单片机:

  • 2个基本定时器。分别是TIM6TIM7。只能16位向上计数、没有IO口,没有捕获和比较通道,只有计时功能
  • 4个通用定时器。分别是TIM2TIM3TIM4TIM5。可以16位向上或向下计数。可以定时、输出比较、输入捕获。每个定时器有4个外部IO。
  • 2个高级定时器。分别是TIM1TIM8。可以16位向上或向下计数。可以定时、输出比较、输入捕获、还可以输出三相电机互补信号。每个定时器有8个外部IO。

另外定时器的通道可以用来作为:

  • 输入捕获
  • 输出比较
  • PWM 生成(边缘或中间对齐模式)
  • 单脉冲模式输出

如下事件发生时产生中断/DMA:

  • 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
  • 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
  • 输入捕获
  • 输出比较

2. 生成工程

2.1. 创建工程选择主控

STM32CubeMX系列06——定时器(定时、PWM、输入捕获)

2.2. 系统配置

配置时钟源
STM32CubeMX系列06——定时器(定时、PWM、输入捕获)
配置debug模式(如果需要ST-Link下载及调试可以勾选)
STM32CubeMX系列06——定时器(定时、PWM、输入捕获)
配置时钟树(可以直接在HCLK那里输入72,然后敲回车会自动配置)
STM32CubeMX系列06——定时器(定时、PWM、输入捕获)

2.3. 配置工程目录

STM32CubeMX系列06——定时器(定时、PWM、输入捕获)
STM32CubeMX系列06——定时器(定时、PWM、输入捕获)

3. 定时器配置(三选一)

案例:

  • 定时功能:定时翻转 LED 灯
  • PWM功能:驱动电机 / 呼吸灯
  • 输入捕获:PWM信号频率计算 / 信号高电平或低电平持续时间计算

3.1. 定时功能

第一步:配置外设
LED:用来看效果
STM32CubeMX系列06——定时器(定时、PWM、输入捕获)
TIMER2:用来计时
STM32CubeMX系列06——定时器(定时、PWM、输入捕获)
在时钟树中可以看到,定时器都是挂在APB1和APB2上,时钟频率都一样,都是72MHZ。我们这里设置预分频系数为7200-1,也就是分频完之后的频率为72 000 000 / 7200 = 10 000HZ;计数值为10000 (设置9999,还有0,就是1万)。也就是每1s产生一次溢出中断中断

配置中断
STM32CubeMX系列06——定时器(定时、PWM、输入捕获)
第二步:生成代码
STM32CubeMX系列06——定时器(定时、PWM、输入捕获)
第三步:写代码
打开工程,编译。
stm32f1xx_it.c中可以看到定时器中断处理函数TIM2_IRQHandler.
STM32CubeMX系列06——定时器(定时、PWM、输入捕获)
HAL_TIM_IRQHandler(&htim2);中,根据发生事件不同,调用了不同函数,其中当发生更新事件的时候,调用了函数HAL_TIM_PeriodElapsedCallback(htim);
STM32CubeMX系列06——定时器(定时、PWM、输入捕获)
这个函数定义如下。可以看到这是个弱函数,在注释中也有写。我们重新定义此函数,然后当中断发生时会执行此函数。此函数被称为回调函数。
STM32CubeMX系列06——定时器(定时、PWM、输入捕获)

当需要回调时,不应修改此函数,
HAL_TIM_PeriodElapsedCallback可以在用户文件中实现

我们把这个函数的重定义写在 tim.c 中。添加到末尾。

/* USER CODE BEGIN 1 */

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	// 这个回调函数 是共用的,因此需要先判断,是不是定时器2
    if(htim->Instance == htim2.Instance)
	{
		HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
	}
}

/* USER CODE END 1 */

然后在main.c中,只需要在while(1)之前 使能定时器中断即可。

  // 使能定时器中断
  HAL_TIM_Base_Start_IT(&htim2);

第四步:编译、下载、验证

PA8 连接的 LED 每隔一秒翻转一次,

3.2. PWM 输出

第一步:配置定时器,用于输出PWM信号
STM32CubeMX系列06——定时器(定时、PWM、输入捕获)
在时钟树中可以看到,定时器都是挂在APB1和APB2上,时钟频率都一样,都是72MHZ。我们这里设置预分频系数为72-1,也就是分频完之后的频率为72 000 000 / 72 = 1 000 000HZ;计数值为1000 (设置999,还有0,就是1 000)。也就是每1ms产生一次溢出中断中断

PWM 生成通道 mode 参数:
STM32CubeMX系列06——定时器(定时、PWM、输入捕获)

TIMx_CNT,表示定时器 TIMx 的计数器寄存器值;
TIMx_CCRn,表示捕获比较寄存器的值,其中 n 表示某个通道,取值为1、2、3、4;

PWM 生成通道 pulse 参数:决定PWM的占空比。
占空比Pulse = pulse / period

这个是可以在程序中改的
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, campNum);

第二步:生成代码
STM32CubeMX系列06——定时器(定时、PWM、输入捕获)
第三步:main.c

  /* USER CODE BEGIN WHILE */
  
	// 开启 PWM 输出
  	HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
	HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);
	
	uint16_t pwm_i = 0;			//  PWM output
	uint16_t pwm_mode = 0;		//  PWM chance mode
  while (1)
  {
		if(pwm_mode)
		{
			__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, pwm_i--);
			__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, pwm_i--);
			if(pwm_i==0)
				pwm_mode=0;
		}
		else
		{
			__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, pwm_i++);
			__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, pwm_i++);
			if(pwm_i==1000)
				pwm_mode=1;
		}
		HAL_Delay(1);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

第四步:效果验证
编译、烧录
在PA1和GND 或者 PA2和GND之间接个 LED,可以看到LED有呼吸灯的效果。

3.3. 输入捕获

第一步:定时器配置
这里使用定时器3捕获输入
STM32CubeMX系列06——定时器(定时、PWM、输入捕获)
在时钟树中可以看到,定时器都是挂在APB1和APB2上,时钟频率都一样,都是72MHZ。我们这里设置预分频系数为72-1,也就是分频完之后的频率为72 000 000 / 72 = 1 000 000HZ;计数值为65536(设置65535,还有0,就是65536)。因为这里其实还是需要计时,能长就长,减少更新中断。同时设置上升沿触发,也就是上升沿到来产生捕获中断。

设置捕获上升沿还是下降沿 也是可以配置的
__HAL_TIM_SET_CAPTUREPOLARITY();

使能中断
STM32CubeMX系列06——定时器(定时、PWM、输入捕获)
使用定时器2 产生固定占空比的PWM波(配置方法和上一小节一样)
STM32CubeMX系列06——定时器(定时、PWM、输入捕获)
为了方便看效果,也配置一下串口重定向,看往期文章。–>串口重定向配置<–

第二步:生成代码
STM32CubeMX系列06——定时器(定时、PWM、输入捕获)
第三步:写代码
tim.c末尾加上下面函数。前者为输入捕获中断回调函数。
后者用来计算 输入信号的占空比和频率。

/* USER CODE BEGIN 1 */
#include "usart.h"

uint16_t CCR1, CCR2, CCR3;
uint8_t measure_flag = 0;
// 定时器3 捕获中断回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
	static uint8_t measure_cnt = 1;
	// 初始设置的是捕获上升沿
	if (htim == &htim3)
	{
		// 1. 第一次发生中断肯定是上升沿
		if (measure_cnt == 1)
		{
			// 2. 获取此时定时器计时数据
			CCR1 = HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_1);
			// 3. 将定时器设置为捕获下降沿
			__HAL_TIM_SET_CAPTUREPOLARITY(&htim3, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING);
			measure_cnt = 2;
		}
		// 4. 捕获到下降延
		else if (measure_cnt == 2)
		{
			// 5. 获取此时定时器计时数据
			CCR2 = HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_1);
			// 6. 将定时器重新设置为捕获上升沿
			__HAL_TIM_SET_CAPTUREPOLARITY(&htim3, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);
			measure_cnt = 3;
		}
		// 7. 再次捕获到上升沿,说明一个周期结束了。
		else if (measure_cnt == 3)
		{
			// 8. 获取此时定时器计时的数据
			CCR3 = HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_1);
			// 9. 关闭定时器中断。
			HAL_TIM_IC_Stop_IT(&htim3, TIM_CHANNEL_1);
			measure_cnt = 1;
			measure_flag = 1;
		}
	}
}

// 捕获函数
void capture(void)
{
	// diff1:高电平持续时间
	// diff2:一个周期的时间
	uint16_t diff1 = 0, diff2 = 0;
	
	uint32_t freq;	// 频率
	uint8_t duty;	// 占空比
	if (measure_flag)
	{
		measure_flag = 0;

		if (CCR1 < CCR2)
			diff1 = CCR2 - CCR1;
		else
			diff1 = 0xffff + 1 + CCR2 - CCR1;	// 设置的最多能数65535,也就是0xffff + 1

		if (CCR1 < CCR3)
			diff2 = CCR3 - CCR1;
		else
			diff2 = 0xffff + 1 + CCR3 - CCR1;
		// 每秒能数 1000000.一个周期是 diff2。
		freq = (72000000 / 72) / diff2;
		// 高电平持续时间/低电平持续时间 不让出现小数,所以*100
		duty = diff1 * 100 / diff2;
	}
	printf("freq: %d HZ,  duty: %d %% \r\n", freq, duty);
}
/* USER CODE END 1 */

main.c中调用函数

	// 开启 PWM 输出
  	HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
	HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);
	// 开启定时器输入捕获中断
	HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_1);
  while (1)
  {
		capture();
		// 延时1s
		// 在中断回调函数中关掉了,再次开启定时器3捕获中断 重新计算。
		HAL_Delay(1000);
		HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_1);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

第四步:效果验证
编译、烧录
用串口查看:
用线把 PA6和PA0 或者 PA6和PA1 连接起来,就可以查看定时器2的两个通道产生的PWM频率和占空比了(下面有几个数不对,因为手动插上的时候有抖动)。
STM32CubeMX系列06——定时器(定时、PWM、输入捕获)文章来源地址https://www.toymoban.com/news/detail-429335.html

到了这里,关于STM32CubeMX系列06——定时器(定时、PWM、输入捕获)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32使用CubeMx配置定时器输出PWM

            项目中经常使用到STM32来输出PWM,每次配置过后过不了多久就会忘记,稍微需要对配置做出修改时都要翻很久的手册,所以决定结合实例把PWM配置的详细步骤记录下来,这样在下次配置时可以很快的捡起来。         本文档的行文结构如下,首先,说明实际需

    2024年02月03日
    浏览(70)
  • STM32 CubeMX 定时器(普通模式和PWM模式)

    定时器打开与关闭 开启PWM通道 设置PWM,占空比 方式1 方式2 值越大灯越亮

    2024年02月15日
    浏览(38)
  • STM32高级定时器输出指定数量PWM(STM32CubeMx配置)

    高级定时器中有一个重复计数器,本实验输出指定个数PWM就是利用了重复计数器的特性,先来看看重复计数器的特性是什么: 计数器每次上溢或下溢都能使重复计数器减1,减到0时,再发生一次溢出就会产生更新事件 这是什么意思呢,这里举个例子比如说我设定重复计数器的

    2024年02月02日
    浏览(88)
  • 定时器(PWM输出)触发ADC采样(DMA)——STM32CubeMX

    我用的单片机是STM32F103CBTX 定时器:使用PWM输出的模式 ADC:使用DMA的模式 (在不使用DMA的情况下,定时器控制ADC进行数据采集只能是单通道!如果开启了多通道,读取到的ADC采集值只会是最后一个通道的值!所以,要想使用定时器控制ADC采集 多通道 , 必须使用DMA !)  看

    2024年04月10日
    浏览(54)
  • STM32CubeMX教程6 TIM 通用定时器 - 生成PWM波

    开发板(STM32F407G-DISC1) STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) ST-LINK/V2驱动 逻辑分析仪nanoDLA 使用STM32CubeMX软件配置STM32F407 通用定时器生成可变占空比PWM波形,并将其输出到LED灯引脚实现呼吸灯效果 STM32F407有10个通用定时器,其中TIM2、TIM3、TIM4和TIM5有4个捕获

    2024年02月03日
    浏览(45)
  • STM32 HAL库 STM32CubeMX -- TIM(定时器输入捕获)

    输入捕获可以对 输入的信号的上升沿、下降沿或者双边沿进行捕获 ,常用的有 测量输入信号的脉宽 和 测量PWM 输入信号的频率 和 占空比 这两种。 输入捕获的原理 就是,当捕获到信号的跳变沿的时候,把计数器CNT 的值锁存到捕获寄存器CCR 中,把前后两次捕获到的CCR 寄存

    2023年04月14日
    浏览(104)
  • STM32笔记——定时器输入捕获功能(测量PWM的频率和占空比)

    目录 一、概述 二、输入捕获功能 2.1 输入捕获简介 2.2 输入捕获通道  三、输入捕获功能测量PWM波的频率和占空比 3.1 测量频率的方法 3.2 测量过程         主要介绍通用定时器的输入捕获功能,输入信号由GPIO口进入输入捕获通道,之后输入部分对相应的TIx输入信号采样,并

    2024年02月06日
    浏览(85)
  • 野火STM32电机系列(五)Cubemx配置高级定时器TIM1

    鸽了一段时间,放心不会断的哈,目前仅仅是显示屏坏了,不影响后面项目 前文已经配置了GPIO、编码器 本节讲解CubeMX高级定时器TIM1配置带死区的6路互补的PWM 同时配置信号触发后续ADC采集 板子引角的原理图如下 对应的: Motor1--U+--PA8--TIM1_CH1 Motor1--U---PB13--TIM1_CH1N Motor1--V+--

    2024年02月15日
    浏览(71)
  • STM32学习笔记(六)丨TIM定时器及其应用(输入捕获丨测量PWM波形的频率和占空比)

    ​  本次课程采用单片机型号为STM32F103C8T6。 ​  课程链接:江科大自化协 STM32入门教程   往期笔记链接:   STM32学习笔记(一)丨建立工程丨GPIO 通用输入输出   STM32学习笔记(二)丨STM32程序调试丨OLED的使用   STM32学习笔记(三)丨中断系统丨EXTI外部中断

    2023年04月19日
    浏览(56)
  • 基于HAL库的STM32单定时器多路输入捕获测量PWM的频率和占空比实现(状态机方式实现)

    目录  写在前面 先回顾下定时器的单路捕获PWM 多路捕获PWM的频率和占空比(状态机实现) 我的思路: 状态图 配置 给出示例代码 测试效果         先有了这篇文章实现了单定时器的多通道测量频率,以外部时钟的方式可测量任意频率的方波),奈何不能多路测试PWM波的频率,

    2024年02月12日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包