首页 > 其他分享 >STM32定时器(TIM)中断

STM32定时器(TIM)中断

时间:2023-07-27 20:44:55浏览次数:34  
标签:TIM2 NVIC 定时器 中断 STM32 TIM 时钟

一、什么是定时器中断?

大白话理解:使用一个定时器进行计时(计数),数数的方式可以从上到下(从设定值到0),也可从下到上(从0 到设定值),或者中间计数(一般用不上,记住前面两者解决大部分问题,) 要学会释怀自己,哈哈(允许我找个不会的借口)。

当计数完成以后,将会发出冲断请求(就是给中断控制系统说,我想要中断一下,去干点别的事情)。如果中断控制系统同意中断,那么将会发生中断,如果不同意,那么中断失败。

二、定时器的类型特点(简答了解一下即可)

定时器分为高级定时器 、 通用定时器和基本定时器 (效果见名知意),需要注意的是,不同的控制芯片定时器的数量可能不同。使用前首先查找相应文件,看看是否觉有自己需要的定时器。

使用定时器的时候需要注意定时器所挂在的时钟。(STM32F103C8T6)没有四个定时器(TIM1~TIM4)

本次测试使用的是TIM2定时器,实现的效果是每次定时1s进行一次LED闪烁。

16位计数器: 用于计数,每来一个时钟,系统自动在所管理的数字加1.,计数到目标之后,将会自动清零,进行下一次计数。

预分频器: 对计数器的时钟进行分频,如果不分频默认是72Mhz。

自动重装寄存器: 计数的目标值,当计数器的值达到该目标值后将会发生中断。(简单的理解就是计多少个数以后开始发生中断)

注意: 上面的寄存器都是16位的。所以单片机的最大定时时间为:

59.65s=1/72MHZ/65536/65536  

小知识: 一个定时器的输出作为另一个定时器的输入,实现定时器套娃,单片机的最大定时为24万亿年 (一本正经的胡说)

 

前面的都不重要,下面好好看一下彩色这张图,其实我们主要的就是要学会寄存器的使用和配置。本次测试使用的是内部时钟,正如你所看见的,定时器的是具有多种的,本次先使用内部使用。

需要特别的注意的就是三个模块的配置:时钟源配置、时基单元配置、中断控制配置三部分。

好了,废话不多说,直接看程序吧。

Code : timer.c

#include "timer.h"
#include "led.h"
extern uint16_t Num;
void TimerInit(void)
{
//打开定时器时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //定时器2是通用定时器,其时钟挂在到APB1时钟线上
//配置定时器2的时钟源来自内部时钟源,其实这里系统默认的就是内部时钟,所以这一步配置可以省去
TIM_InternalClockConfig(TIM2);

//定时器结构体配置
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1 ; //内部时钟分频
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period=7200-1; //定时器溢出值
TIM_TimeBaseInitStructure.TIM_Prescaler=10000-1; //分频系数
TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0; //这里使用的是通用定时器没有复用计数功能,这里设置为0

//配置定时器2初始化
TIM_TimeBaseInit(TIM2 ,&TIM_TimeBaseInitStructure);
TIM_ClearFlag(TIM2,TIM_FLAG_Update);//定时器为确保初始时候具有有效的数据,因为数据是在缓冲区中,为确保预分频中的值具有意义数据,
//系统自动产生了一个更新事件,需要使用将会导致一初始化定时器就触发更新中断事件,导致一启动就进入中断程序,所以需要进行一次中断标志位清零
/* Generate an update event to reload the Prescaler and the Repetition counter
values immediately */
//定时器中断
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//中断定时器为2 ,中断模式为数据更新时中断

//配置中断
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断分组
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel= TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM2,ENABLE); //使能定时器
}

//中断相应函数
void TIM2_IRQHandler(void )
{
if(TIM_GetFlagStatus(TIM2,TIM_FLAG_Update)==SET)
{
Num++;
TIM_ClearITPendingBit(TIM2,TIM_FLAG_Update);
}

}

Code : timer.h

#ifndef _TIMER_H_
#define _TIMER_H_
#include "stm32f10x.h" // Device header
void TimerInit(void);
#endif

 Code : main.c

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "timer.h"
uint16_t Num=0;
/*
功能的实现,注意在KEIL5中不要使用中文的空格这样将会出现错误。重点,重点,重点

*/
int main(){
Led_funcing();
TimerInit();
// int k=5;
while(1)
{
if(Num%2==0)
{
GPIO_ResetBits(GPIOC,GPIO_Pin_13);

}else
{
GPIO_SetBits(GPIOC,GPIO_Pin_13);
}
if(Num==20)
{
Num=0;
}
}
}

效果很好,小伙伴们快操练起来。

 

标签:TIM2,NVIC,定时器,中断,STM32,TIM,时钟
From: https://www.cnblogs.com/Nic-zhang/p/17585900.html

相关文章

  • ST官方基于米尔STM32MP135开发板培训课程(一)
    本文将以Myirtech的MYD-YF13X以及STM32MP135F-DK为例,讲解如何使用STM32CubeMX结合Developerpackage实现最小系统启动。    1.开发准备1.1Developer package准备a.Developerpackage下载:‍https://www.st.com/en/embedded-software/stm32mp1dev.html‍b.解压后进入......
  • 使用 QEMU 代替 STM32 开发版本 docker 一键启动
    dockerfile#Compileandinstallqemu_stm32fromfedora:28RUNdnfinstall-y\arm-none-eabi-gcc\arm-none-eabi-newlib\findutils\gcc\git\glib2-devel\libfdt-devel\......
  • 成功实现FaceTime拨打,FaceTime数据筛选,检测手机号是否开通FaceTime的原理
    FaceTime是苹果公司iOS和macOS(以前称MacOSX或OSX)内置的一款视频通话软件,通过Wi-Fi或者蜂窝数据接入互联网,在两个装有FaceTime的设备之间实现视频通话。其要求通话双方均具有装有FaceTime的苹果设备,苹果ID以及可接入互联网的3G/4G/5G或者Wi-Fi网络。 一、Windows电脑上部署苹......
  • STM32 HAL库更改PWM频率的方法
    项目上用到了步进电机,控制方式为STEP/DIR。电机的STEP由PWM提供,于是控制步进电机的速度就靠PWM的频率高低来实现。实现频率更改的函数为。__HAL_TIM_SET_PRESCALER(__HANDLE__,__PRESC__);该函数可以直接更改Prescaler(PSC)预分频寄存器的数值,达成改变时钟频率的目的。举例:更......
  • 06. 系统滴答定时器
    一、SysTick定时器简介  SysTick,即系统滴答定时器,是属于CM3内核中的一个外设,内嵌在NVIC中。系统定时器是一个24bit的向下递减的计数器,SysTick的时钟源自HCLK。当计数值减到0时,将从RELOAD寄存器中自动重装载定时初值,开始新一轮计数。只要不把它在SysTick控制及状......
  • 记一次 MDK 开发 STM32WB15 时遇到的玄学BUG
    使用STM32WB15CCU6开发BLE应用调试自建的工程时,莫名报错Jlink和ST-LINK/V2都是一样的结果于是开始测试例程,开始也是正常,但是找不到自建工程的问题,开始对比代码,逐步替换然而并没有效果......
  • Python time模块和datetime模块,以及多线程
    1.time模块1.1time.time()函数time.time()函数返回自1970年1月1日0点到现在的秒数。纪元时间戳可以用于剖析代码,也就是测量一段代码的运行时间。如果在代码块开始时调用time.time(),并在结束时再次打开,就可以用第二个时间戳减去第一个,得到这两次调用之间经过的时间。......
  • 洛谷 P9221 「TAOI-1」Pentiment 题解
    Description给定\(n\timesm\)的矩阵,从第\(1\)行任意格子出发,每次向下、左、有走一步,有\(q\)个障碍不能经过,求走到第\(n\)行任意格子的方案。对于所有数据,\(1\leqn,m\leq10^9\),\(1\leqq\leq10^5\)。link:https://www.luogu.com.cn/problem/P9221Solution算法一考......
  • RuntimeWarning: More than 20 figures have been opened. Figures created through t
    问题描述使用matplotlib绘制多幅图出现如下问题RuntimeWarning:Morethan20figureshavebeenopened.Figurescreatedthroughthepyplotinterface(matplotlib.pyplot.figure)areretaineduntilexplicitlyclosedandmayconsumetoomuchmemory.(Tocontrol......
  • 解决 datetime数据在DataGridView里不显示秒的问题
    1.选择要编辑的列》外观》DefaultCellStyle2.CellStyle生成器》行为》Format》三个点3.选择日期时间》选择需要的时间格式 ......