STM32学习--定时器中断

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

目录

 概述

一、STM32 通用定时器简介

1.1 STM32定时器定时原理 

1.2 STM32 通用定时器相关寄存器简介

1.3 定时器功能描述

1.4计数器模式

二、定时器中断库函数

2.1 步骤总结

2.2 库函数讲解

总结:


 概述

        这一章,我们将向大家介绍如何使用 STM32F1系列 的通用定时器。TIME1和TIME8为高级定时器;TIME2~5为通用定时器;TIME6和TIME7为基本定时器。本章将选择难度适中的通用定时器讲解,在本章中,我们将学会如何配置使用 TIM3 的定时器中断。

一、STM32 通用定时器简介

        STM32F1 的通用定时器是一个16位自动装载计数器构成的(可计数0~65535)。每个通用定时器有4个独立通道(ch1~4),每个独立通道可实现:1)输入捕获  2)输出比较  3)PWM模式  4)单脉冲模式输出。(输出比较与PWM模式都能输出PWM波形,但有差别,常使用PWM模式输出PWM波形)。

        自动重装载计数器可以向上计数、向下计数或者向上向下双向计数。此计数器时钟频率由 72M经过预分频器分频得到。

1.1 STM32定时器定时原理 

        定时器本质上是一个16位计数器(就是自动重装载计数器),计数器是一种寄存器,学过数电应该清楚,寄存器必须输入时钟才能工作,该计数器输入时钟频率为72M/(psc+1),psc就是预分频值。计数器每增加一个数,时间增加一个计数器时钟周期,因此,计数器计多少个数,就决定了定时时长是多少。这样就能理解为什么要配置自动重装载计数器和预分频寄存器了。

1.2 STM32 通用定时器相关寄存器简介

该部分可大体浏览一下,可只看文字部分,初步了解,等以后深入。

1)控制寄存器1(TIMx_CR1)。

STM32学习--定时器中断

1.1.1 TIMx_CR1 寄存器各位描述

        我们主要关注这几位:最低位CEN,也就是计数器使能位,该位必须置 1,才能让定时器开始计数。第 4 位 DIR(direction,方向),设置计数方式是向上计数还是向下计数。

2)DMA/中断使能寄存器 (TIMx_DIER),(DMA/Interrupt Enable Register)该寄存器是一个 16 位的寄存器。

STM32学习--定时器中断

图1.1.2 TIMx_DIER寄存器描述

        第0位:更新中断允许位,本章使用定时器中断需要使该位置1。

3)预分频寄存器(TIMx_PSC)。

STM32学习--定时器中断

图1.1.3 TIMx_PSC寄存器描述

       该寄存器对时钟进行分频,然后提供给计数器,作为计数器的时钟。 定时器时钟来源有多个。常见的时钟来源是从APB1倍频而来,72MHZ。f_计数器 = 72 M/(psc+1)

这个控制寄存器带有缓冲器,它能够随时被该变预分频值,但是新的预分频器值将在下一次中断发生时被设置成新的分频系数。

4)自动重装载寄存器。TIMx_ARR实际上有两个自动重装载寄存器,一个是我们看得见的,可以直接操作的;另一个是我们看不见的,叫影子寄存器。影子寄存器里的自动重装载值才是真正使用的自动重装载值。我们可以随时向看的见的寄存器里写入新的值,但是只有在在产生中断时,影子寄存器才会重新置入自动重装载值。

STM32学习--定时器中断

图1.1.4 TIMx_ARR 寄存器描述

1.3 定时器功能描述

时基单元包含:

计数器寄存器(TIMx_CNT)

预分频器寄存器 (TIMx_PSC)

自动装载寄存器 (TIMx_ARR)

1.4计数器模式

向上计数模式:

在向上计数模式中,计数器从0计数到自动重装载值(TIMx_ARR计数器的内容),然后重新从0开始

计数并且产生一个计数器中断事件。

向下计数和中央对齐模式暂不介绍。

二、定时器中断库函数

2.1 步骤总结

  1. Timer3定时器时钟使能。
  2. 配置时基单元
  3. 设置Timer3允许中断更新
  4. Timer3中断优先级配置
  5. 使能Timer3
  6. 编写中断服务函数

2.2 库函数讲解

timer3.c文件

#include "stm32f10x.h"
void timer3_init(void)
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStr;   //定义时基单元结构体
	NVIC_InitTypeDef NVIC_Initstr;           //定义NVIC结构体
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟3使能,挂载于APB1
	TIM_TimeBaseInitStr.TIM_ClockDivision = TIM_CKD_DIV1; //默认值,目前不需要修改
	TIM_TimeBaseInitStr.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式
	TIM_TimeBaseInitStr.TIM_Period = 4999; //2hz  72000000/(4999+1)(7199+1)  
	TIM_TimeBaseInitStr.TIM_Prescaler = 7199; //设置预分频器值
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStr);   //初始化时基单元
	
	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //Timer3中断使能
	
	NVIC_Initstr.NVIC_IRQChannel = TIM3_IRQn;
	NVIC_Initstr.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Initstr.NVIC_IRQChannelPreemptionPriority = 0;//最高优先级
	NVIC_Initstr.NVIC_IRQChannelSubPriority= 0;
	
	NVIC_Init(&NVIC_Initstr);
	TIM_Cmd(TIM3, ENABLE);//开启定时器	
}

函数及参数讲解:

voidTIM_TimeBaseInit(TIM_TypeDef*TIMx, TIM_TimeBaseInitTypeDef*TIM_TimeBaseInitStruct);

举例:TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

时基初始化函数:该函数用来设置 定时器 定时时长。第一个参数指定哪个定时器。第二个参数传入时基单元结构体指针,该结构体参数如下:

  • uint16_t TIM_Prescaler;  预分频值。
  • uint16_t TIM_ClockDivision;  设置分频因子,输入捕获模式才用得到。这里我们默认使用TIM_CKD_DIV1;
  • uint16_t TIM_Period;  设置自动重装载寄存器值。
  • uint16_t TIM_CounterMode;  计数模式 :向上,向下
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);
举例:TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE );
定时器中断配置函数 :该函数用来使能定时器中断。
第一个参数指定哪个定时器;第二个参数 指定中断类型;第三个指定使能还是失能。
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)
举例 :void TIM_Cmd(TIM3, ENABLE);
定时器控制函数,用来设置开启/关闭定时器。

 中断服务函数

void TIM3_IRQHandler(void) //定时器中断服务函数,固定函数名,去starup启动函数文件找函数名
{
	if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查 TIM3 更新中断发生与否
	{
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除 TIM3 更新中断标志
		LED0=!LED0;
	}
}

 函数及参数讲解:

void TIM3_IRQHandler(void) 服务函数名的名字是固定的,可以去启动文件查找。
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t)  
举例:TIM_GetITStatus(TIM3, TIM_IT_Update)
判断定时器中断是否产生。第一个参数选择哪个定时器,;第二个参数为中断类型
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT)
举例:TIM_ClearITPendingBit(TIM3, TIM_IT_Update );
清楚中断标志位。

主函数

int main(void)
{
	delay_init();
	Led_Init();
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	timer3_init();

	while(1)
	{
	}
}

总结:

学先大体了解工作原理,学会调用库函数实现功能;然后再逐步深入。初有问题请留言。文章来源地址https://www.toymoban.com/news/detail-433927.html

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

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

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

相关文章

  • STM32学习笔记(四)丨TIM定时器及其应用(定时中断、内外时钟源选择)

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

    2023年04月13日
    浏览(59)
  • STM32 F103C8T6学习笔记4:时钟树、滴答计时器、定时器定时中断

    今日理解一下STM32F103 C8T6的时钟与时钟系统、滴答计时器、定时器计时中断的配置,文章提供原理,代码,测试工程下载。 目录 时钟树与时钟系统: 滴答计时器: 定时器计时中断: 测试结果: 测试工程下载: 该系统介绍在 STM32F10x-中文参考手册 P56页开始 微控制器的时钟系

    2024年02月13日
    浏览(43)
  • STM-32:TIM定时中断—定时器定时中断/定时器外部时钟

    定时器可以对输入的时钟进行计数,并在达到设定值时触发中断 16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时 不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等

    2024年02月09日
    浏览(54)
  • STM32——定时器——定时中断

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 本节先只讲解定时器的定时中断,内外中断源选择。 TIM(Timer)定时器 定时器可以 对输入的时钟进行计数 ,并在计数值达到设定值时触发中断。 16位计数器、预分频器、自动重装寄存器的时基单元 ,

    2024年04月10日
    浏览(45)
  • STM32定时器-定时器中断功能详解

    STM32的众多定时器中我们使用最多的是高级定时器和通用定时器,而高级定时器一般也是用作通用定时器的功能,下面我们就以通用定时器为例进行讲解,其功能和特点包括: 通用与基本定时器(2~7)位于低速的APB1总线上 高级定时器(1、8)位于高速的APB2总线上 自动装载计

    2024年02月08日
    浏览(50)
  • stm32 定时器部分(定时中断)

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

    2024年03月15日
    浏览(56)
  • 定时器详解 -- 定时器中断、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)

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

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

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

    2024年02月06日
    浏览(46)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包