STM32的定时器中断与实例

这篇具有很好参考价值的文章主要介绍了STM32的定时器中断与实例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、关于定时器

定时器是存在于STM32单片机中的一个外设。STM32总共有8个定时器,分别是2个高级定时器(TIM1、TIM8),4个通用定时器(TIM2、TIM3、TIM4、TIM5)和2个基本定时器(TIM5、TIM6)。具体分类如下STM32的定时器中断与实例

定时器相当于给CPU上了一个闹钟,CPU平时处理其它任务,当定时时间到了以后,处理定时相关的任务。
下面我们根据一张图来介绍定时器的基本原理

STM32的定时器中断与实例
在stm32中存在频率精确的内部时钟(即晶振),频率为72MHZ。由于频率较大,我们可以通过函数设置分频系数n,则输出频率变为72/nMHZ。经分频后的时钟经过计算器,规定每经过一个周期,计算器的读数(CK_CNT)加一,读数的范围由上表可知为1~65535,当然了,通过改变初始化函数,我们可以改变这个数的初始值和所能达到的最大值(不一定是65535)。当计数达到自动重装载寄存器的时候产生中断,这就是定时器中断。
通过上述介绍,我们不难发现,我们可以通过设置分频量,CK_CNT的最大值和最小值就可以设定定时时间了。定时器的定时时间等于计数器的中断周期乘以中断的次数。计数器在 CK_CNT 的驱动下,计一个数的时间则是 CK_CLK 的倒数,为1/TIMxCLK/(PSC+1)),产生一次中断的时间则等于:1/(CK_CLK * ARR)。如果在中断服务程序里面设置一个变量 time,用来 记 录 中断 的 次 数,那 么 就 可以 计 算 出我们 需 要 的定 时 时 间等于 :
1/CK_CLK * (ARR+1)*time
如果想要了解更多的关于定时器的理论,可以去看看《零死角玩转STM32—F103指南者 》
零死角玩转STM32—F103指南者

二、点亮LED和串口输出

2.1定时器点亮LED

我们使用CubeMx完成定时器的相关配置和引脚输出配置。

2.1.1生成过程

1.我们打开的是定时器2,为通用寄存器,具体配置如下:选择内部时钟,分频系数为71,实际运行的时候为72。分频后的频率为1MHZ,即周期为1us。CK_CNT的周期为5000,即5ms发生一次中断。
STM32的定时器中断与实例
2.打开定时器中断
STM32的定时器中断与实例
3.生成中断优先级配置代码
STM32的定时器中断与实例
4.输出工程
STM32的定时器中断与实例

2.1.2代码更改

打开工程文件后,我们还要进行一些代码配置
1.打开定时器

HAL_TIM_Base_Start_IT(&htim2);

2.修改中断函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	static uint32_t time_cnt =0;

	if(htim->Instance == TIM2)
	{
		if(++time_cnt >= 200)
		{
			time_cnt =0;
			HAL_GPIO_TogglePin(D1_GPIO_Port,D1_Pin);
		}
	}
}

该函数为定时器的中断回调函数,当产生定时中断的时候,会自动调用这个函数。在函数内部定义了一个静态变量:time_cnt。当它大于等于100的时候,才会执行if里面的代码。也就是说需要发生100次中断,才会让LED的状态翻转。前面已经算过了,一次定时中断的时间是0.005秒,所以200次中断的时间是0.005*200=0.5秒。也就是说每隔1秒,LED的状态翻转一次。

2.1.3结果展示

定时器led

2.2定时中断与串口输出

我们也可在led灯的思路上做一些更改,打开串口,做一个定时器控制的串口输出,具体思路和LED灯的相差不大

2.2.1创建工程

具体操作通过上一例相同,唯一需要加的步骤为打开串口
STM32的定时器中断与实例

2.2.2代码更改

代码的更改如下
1.打开串口

MX_USART1_UART_Init();

2.定义输出数组

char message[]="hello Windows\r\n";//输出信息

3.更改中断函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	static uint32_t time_cnt =0;

	if(htim->Instance == TIM2)
	{
		if(++time_cnt >= 1000)
		{
			time_cnt =0;
			
				HAL_UART_Transmit(&huart1, (uint8_t *)&message, strlen(message),0xFFFF); 
		}
	}
}

不难看出,输出的周期为5s,内容为hello Windows

2.2.3结果展示

定时器串口_1

三、呼吸灯

3.1PWM调制

使用脉冲占空比拟合不同波形的方式称为 PWM(脉冲宽度调制)控制技术——通过 对一系列脉冲的宽度进行调制,来等效地获得所需要波形(含形状和幅值)。PWM 控制 的基本原理为:冲量相等而开头不同的窄脉冲加在具有惯性的环节上时,其效果基本 相同。其中冲量指窄脉冲的面积;效果相同指环节输出响应波形基本相同。在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF),如图所示。
STM32的定时器中断与实例
我们可以通过控制周期内脉冲的占空比来调整所控制的模拟信号。占空比变大,周期内的冲量也会变大,模拟信号周期内的积分也会变大,下图可以很好的体现这一点。
STM32的定时器中断与实例

3.2工程实现

3.2.1建立工程

1.配置定时器,选择定时器3和定时器4
STM32的定时器中断与实例
STM32的定时器中断与实例

不同时钟的4个通道引脚图如下,可知T3C2接PA7, T4C2接PB8

STM32的定时器中断与实例
3.配置时钟
STM32的定时器中断与实例

4.输出工程
STM32的定时器中断与实例

3.2.3更改代码

1.设置占空比初始值

uint16_t duty_num = 10;

更改while函数

while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		HAL_Delay(50);
		duty_num = duty_num + 10;
		if(duty_num > 500)
		{
			duty_num = 0;
		}
		__HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_2,duty_num);
			__HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_2,duty_num);

  }

这个实验没有用的中断,使用不需要配置中断函数(也没有打开中断~~~)

3.2.3结果展示

呼吸灯

四、总结

有了前面学习中断的基础,本次对定时器的学习还是比较轻松的。PWM的原理很好的揭示了在电路中,数字信号是如何控制模拟信号的,这个很重要,也很实用。

五、参考

1.搞懂什么是PWM控制
2.PWM技术——百度百科
3.你足够了解pwm吗?搞清楚pwm控制技术
4.STM32-定时器详解文章来源地址https://www.toymoban.com/news/detail-410964.html

到了这里,关于STM32的定时器中断与实例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • stm32 定时器部分(定时中断)

    一.定时中断(概念部分) 定时中断主要包含两种中断一种是更新中断还有一种是输入捕获中断 更新中断 :更新中断通常用于定时器的基本定时功能。当定时器计数器溢出并重新从零开始计数时,会触发更新中断。你可以配置定时器的计数周期和预分频器来控制定时器的计时

    2024年03月15日
    浏览(57)
  • 定时器详解 -- 定时器中断、PWM输出 --stm32

    STM32F103系列芯片拥有多种定时器,包括基本定时器、通用定时器和高级定时器,每种定时器都具有一些特定的功能。 向上计数:计数器从0计数到自动重装载值(ARR),然后重新从0开始计数并且产生一个计数器溢出事件。 向下计数:计数器从自动重装载值(ARR)开始向下计数

    2024年02月11日
    浏览(59)
  • 【STM32笔记】STM32的定时器开发基础(二)(基于STM32CubeMX实现定时器中断)

      传统STM32外部中断 的设计步骤:  (1)将GPIO初始化为输入端口。  (2)配置相关I/O引脚与中断线的映射关系。  (3)设置该I/O引脚对印的中断触发条件。  (4)配置NVIC,并使能中断。  (5)编写中断服务函数。   基于STM32CubeMX的外部中断 设计步骤  (1)在STM3

    2024年02月20日
    浏览(58)
  • STM32基本定时器中断

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 提示:这里可以添加本文要记录的大概内容: 定时器有什么用?精准延时,PWM,做一个时钟:年月日,时分秒。时钟最基本的就是1s怎么来? 提示:以下是本篇文章正文内容,下面案例可供参考 1.1如何实

    2024年02月06日
    浏览(46)
  • 定时器中断实验(stm32)

    计算公式: Tout= ((arr+1)*(psc+1))/Tclk 其中: Tclk:TIM3 的输入时钟频率(单位为 Mhz)。 Tout:TIM3 溢出时间(单位为 us) Tout= ((4999+1)*( 7199+1))/72=500000us=500ms

    2024年02月13日
    浏览(48)
  • STM32学习--定时器中断

    目录  概述 一、STM32 通用定时器简介 1.1 STM32定时器定时原理  1.2 STM32 通用定时器相关寄存器简介 1.3 定时器功能描述 1.4计数器模式 二、定时器中断库函数 2.1 步骤总结 2.2 库函数讲解 总结:         这一章,我们将向大家介绍如何使用 STM32F1 系列 的通用定时器。 TIM

    2024年02月02日
    浏览(43)
  • STM32单片机(六)TIM定时器 -> 第二节:TIM定时中断练习(定时器定时中断和定时器外部时钟)

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月09日
    浏览(39)
  • STM32之基本定时器中断

    一、TIM(Timer)定时器 基本定时器中断可以对输入的时钟进行计数,并在计数值达到设定值(自动重装值)时触发中断; 16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时; 不仅具备基本的定时中断功能,而且还包含内外时钟源

    2024年02月08日
    浏览(41)
  • 【江科大】STM32:定时器中断

    功能:定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断 HZ 和ms的单位转换:1ms = 1KHZ 1MZ = 1000KHZ 1ms = 1000us 16位计数器、预分频器、自动重装寄存器(记录多少个时钟申请中断)的时基单元,在72MHz计数时钟下可以实现最大59.65s(72/65536/65536 ,再取倒数)的

    2024年01月23日
    浏览(43)
  • STM32 hal库编程定时器清除中断标志位,开启定时器中断会立即进入中断的问题

    1、如果不清除中断标志位,开启定时器中断的话,不能完成相应的计时,会立即进入中断。 2、如果在开启定时器中断前清除了中断标志位,就会等待计时完成再出发中断。 3、主要是针对单次计时使用,尤其是对第一次计时有要求的程序。

    2024年02月01日
    浏览(55)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包