首页 > 其他分享 >07_TIM定时中断

07_TIM定时中断

时间:2024-02-08 14:11:45浏览次数:25  
标签:TIM2 07 void Timer NVIC TIM InitStruct 定时

TIM定时中断

TIM简介

image-20240115191915219

定时器类型

image-20240115224129038

基本定时器

image-20240115224655218

通用定时器

image-20240116135644560

高级定时器

image-20240116153558833

基本定时器仅支持向上计数:0->重装值->发起中断

通用定时器和高级定时器支持向上计数,向下计数,中央对齐计数

向下计数:重装值->0->发起中断

中央对齐计数:0->重装值->发起中断->0->发起中断

基本定时器只能使用内部时钟(系统频率)72MHz

通用定时器可以使用内部时钟和外部时钟

定时中断基本结构

image-20240116165118689

预分频器时序

image-20240116165449819

计数器时序

image-20240116171202251

计数器无预装时序

image-20240116171944813

计数器有预装时序

image-20240116172007554

RCC时钟树

image-20240116172618121

定时器中断

接线图

image-20240117191048377

代码

Timer.c

#include "stm32f10x.h"                  // Device header

void Timer_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //使能时钟
	TIM_InternalClockConfig(TIM2); //配置内部时钟
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1; //时钟分频
	TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up; //向上计数
	TIM_TimeBaseInitStruct.TIM_Period=10000-1; //自动重装器
	TIM_TimeBaseInitStruct.TIM_Prescaler=7200-1; //预分频器
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct); //配置时基单元
	
	TIM_ClearFlag(TIM2,TIM_FLAG_Update); //清除中断标志位,防止初始化时就会进一次中断
	
	//中断配置
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //更新中断
	
	//NVIC配置
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	NVIC_InitTypeDef NVIC_InitStruct;
	NVIC_InitStruct.NVIC_IRQChannel=TIM2_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
	NVIC_Init(&NVIC_InitStruct);
	//启动定时器
	TIM_Cmd(TIM2,ENABLE);
}

/*
void TIM2_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)
	{
		
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
	}
}
*/

Timer.h

#ifndef __TIMER_H__
#define __TIMER_H__

void Timer_Init(void);

#endif

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Timer.h"

uint16_t Num;

int main(void)
{
	OLED_Init();
	Timer_Init();
	OLED_ShowString(1,1,"Num:");
	while(1)
	{
		OLED_ShowNum(1,5,Num,5);
	}
}

void TIM2_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)
	{
		Num++;
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
	}
}

定时器外部时钟

接线图

image-20240118000308537

原理图

image-20240118010739717

代码

Timer.c

#include "stm32f10x.h"                  // Device header

void Timer_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //使能时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	
	TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0); //外部时钟
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1; //时钟分频
	TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up; //向上计数
	TIM_TimeBaseInitStruct.TIM_Period=10-1; //自动重装器
	TIM_TimeBaseInitStruct.TIM_Prescaler=1-1; //预分频器
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct); //配置时基单元
	
	TIM_ClearFlag(TIM2,TIM_FLAG_Update); //清除中断标志位,防止初始化时就会进一次中断
	
	//中断配置
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //更新中断
	
	//NVIC配置
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	NVIC_InitTypeDef NVIC_InitStruct;
	NVIC_InitStruct.NVIC_IRQChannel=TIM2_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
	NVIC_Init(&NVIC_InitStruct);
	//启动定时器
	TIM_Cmd(TIM2,ENABLE);
}

uint16_t Timer_GetCounter(void)
{
	return TIM_GetCounter(TIM2);
}

/*
void TIM2_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)
	{
		
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
	}
}
*/

Timer.h

#ifndef __TIMER_H__
#define __TIMER_H__

void Timer_Init(void);
uint16_t Timer_GetCounter(void);

#endif

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Timer.h"

uint16_t Num;

int main(void)
{
	OLED_Init();
	Timer_Init();
	OLED_ShowString(1,1,"Num:");
	OLED_ShowString(2,1,"CNT:");
	while(1)
	{
		OLED_ShowNum(1,5,Num,5);
		OLED_ShowNum(2,5,Timer_GetCounter(),5);
	}
}

void TIM2_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)
	{
		Num++;
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
	}
}

标签:TIM2,07,void,Timer,NVIC,TIM,InitStruct,定时
From: https://www.cnblogs.com/mzx233/p/18011764

相关文章

  • 读千脑智能笔记07_人工智能的未来(中)
    1.      机器智能的未来1.1.        没有任何技术原因阻止我们创造智能机器1.1.1.          障碍在于我们缺乏对智能的理解,也不知道产生智能所需的机制1.2.        历史表明,我们无法预测将推动机器智能向前发展的技术进步1.2.1.    ......
  • LocalDateTime判断时间段归属
    //v2024-02-0207:52:572024-02-0214:39:14//DateinTime=Date.from(Instant.ofEpochMilli(1707150614000L));//LocalDateTimeinTimeLocalDateTime=DateUtil.dateToLocalDateTime(inTime);LocalDateTimeinTime=LocalDateTime.parse("2024-02-01......
  • golang定时器之timer+ticker
    转载: https://juejin.cn/post/7327157426298011663 Timer是一个一次性的定时器,用于在未来的某一时刻执行一次操作。基本使用创建Timer定时器的方式有两种:NewTimer(dDuration)*Timer:该函数接受一个time.Duration类型的参数d(时间间隔),表示定时器在过期之前等待的......
  • C#的timespan怎么使用
    https://www.yisu.com/ask/23316568.html1、TimeSpan类是用来表示时间间隔的,它提供了一些方法和属性来操作和获取时间间隔的信息。以下是一些常用的TimeSpan的用法示例:创建一个TimeSpan实例:TimeSpantimeSpan1=newTimeSpan(2,30,0);//2小时30分钟0秒TimeSpantim......
  • pandas.to_datetime datetime.combine 拼接日期时间
    在Python中,如果你想要使用datetime.date对象拼接时间,你需要先将datetime.date对象转换为datetime.datetime对象,然后再添加时间。(不转化也可以啊)importpandasaspdimportdatetimedefmain():date=pd.Timestamp.today().date()#将pd.Timestamp转为datetime.date类......
  • 使用IDEA直接连接数据库报错:Server returns invalid timezone. Go to 'Advanced' tab
    错误详情:使用IDEA直接连接数据库报错:Serverreturnsinvalidtimezone.Goto'Advanced'tabandset'serverTimezone'propertymanually.错误原因:MySQL驱动中默认时区是UTC,与本地时间有时差。解决方案:点开最右侧导航栏Advanced,找到serverTimezone,在value处填写GMT保存再......
  • datetime.date + datetime.timedelta 结果仍然是 datetime.date 因而不能与时间进行比
    importpandasaspdimportdatetimedefmain():foo=pd.Timestamp.now()bar=datetime.date.today()+datetime.timedelta(days=-1)res=bar+datetime.timedelta(hours=24)print(res,type(res))if__name__=='__main__':ma......
  • pandas.Timedelta(days=1) 可以 与 datetime.timedelta(days=1) 效果一致
    pandas.Timedelta(days=1)可以与datetime.timedelta(days=1)效果一致https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Timedelta.html#pandas-timedelta但pandas.Timedelta可以有其他写法......
  • Ubuntu18.04定时备份MySQL、PostgreSQL数据库
    1、备份MySQL数据库脚本LOG_DATE=`date+'%Y-%m-%d%H:%M:%S'`LOG_PATH=/home/dbserver/script_data/backup.logecho"$LOG_DATE=======>开始备份以下mysql数据库:">>${LOG_PATH}DUMP=/usr/bin/mysqldumpOUT_DIR=/home/dbserver/backup/mysql_backupLINU......
  • 【题解】P5907 数列求和加强版 / P4948 数列求和
    本题解是对warzone的题解的补充。题意:求\[\sum_{i=1}^ni^ka^i\]普通版:\(k\leq2\times10^3\)。加强版:\(k\leq10^7\)。首先先考虑普通版。\[\begin{aligned}\sum_{i=1}^ni^ka^i&=\sum_{i=1}^na^i\sum_{j=0}^k{k\bracej}i^{\underline{j}}\\&=\sum_{j=0......