STM32基本定时器中断

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

提示:这里可以添加本文要记录的大概内容:

定时器有什么用?精准延时,PWM,做一个时钟:年月日,时分秒。时钟最基本的就是1s怎么来?


提示:以下是本篇文章正文内容,下面案例可供参考

一、STM32定时器的结构?

1. 51定时器的结构

1.1如何实现定时1s的功能?

  1. 选定时功能
  2. 装初值
  3. 配置定时器中断
  4. 中断里面计数,计数多少次根据定时的需要

2. stm32定时器的结构

2.1 通用定时器

部分芯片时没有基本定时器的

有基本定时器的型号

  1. 时钟来源RCC
  2. 控制器,应该是要使能
  3. 分频器
  4. 装计数初值
  5. 中断

二、使用步骤

1.开启时钟

代码如下(示例):

c 复制代码
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);

2.初始化定时器


代码如下(示例):

c 复制代码
//TIM_TimeBaseInitStruct.TIM_ClockDivision=
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_Period=50000-1;
TIM_TimeBaseInitStruct.TIM_Prescaler= 72-1;
//TIM_TimeBaseInitStruct.TIM_RepetitionCounter=

TIM_TimeBaseInit(TIM6, &TIM_TimeBaseInitStruct);

3.中断配置(分组、优先级)

3.1 配置中断源

timer6只有溢出中断

c 复制代码
	TIM_ITConfig( TIM6, TIM_IT_Update, ENABLE);

3.2配置中断优先级

c 复制代码
	NVIC_InitStruct.NVIC_IRQChannel=TIM6_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelCmd= ENABLE;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;   //0-3
	NVIC_InitStruct.NVIC_IRQChannelSubPriority=  1;        //0-3
	NVIC_Init(&NVIC_InitStruct);

3.3 开启定时器

出了GPIO今后每个外设都要单独开启

c 复制代码
	TIM_Cmd( TIM6, ENABLE);      //使能

3.4 中断服务函数

在启动文件找到中断向量表,然后完成中断服务函数

c 复制代码
void TIM6_IRQHandler()
{

	if(TIM_GetITStatus( TIM6, TIM_IT_Update))
		
	{
	
	    TIM_ClearITPendingBit(TIM6, TIM_IT_Update);
		num++;
		if(num==20)
		{
		   num=0;
			//led取反
		
		}
	}
}

3.5判断中断源, 清除中断源

三、参考初始化函数

3.1写成外设初始化函数,方便main函数调用

c 复制代码
void timer6()
{

	/*
	
	1.开启APB1时钟   72MHz
	2.配置定时器6    TimeInit()  72预分配,0-65535     1000000us/50000us =CNT=20         定时时间/中断溢出时间=计数值
	3.中断配置       分组,优先级 。开启中断源
	4.中断服务函数   计数值, 1us  ,计数20次后让一个LED取反
	*/
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
	
	//TIM_TimeBaseInitStruct.TIM_ClockDivision=
	TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_TimeBaseInitStruct.TIM_Period=50000-1;
	TIM_TimeBaseInitStruct.TIM_Prescaler= 72-1;
	//TIM_TimeBaseInitStruct.TIM_RepetitionCounter=
	
	TIM_TimeBaseInit(TIM6, &TIM_TimeBaseInitStruct);
	//开启中断:
	TIM_ITConfig( TIM6, TIM_IT_Update, ENABLE);
	
	TIM_Cmd( TIM6, ENABLE);      //使能
	
	NVIC_InitStruct.NVIC_IRQChannel=TIM6_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelCmd= ENABLE;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;   //0-3
	NVIC_InitStruct.NVIC_IRQChannelSubPriority=  1;        //0-3
	NVIC_Init(&NVIC_InitStruct);
	
	
}

3.2中断函数

c 复制代码
void TIM6_IRQHandler()
{

	if(TIM_GetITStatus( TIM6, TIM_IT_Update))
		
	{
	
	    TIM_ClearITPendingBit(TIM6, TIM_IT_Update);
		num++;
		if(num==20)
		{
		   num=0;
			//led取反
		
		}
	}
}

3.3 中断服务函数加入时分秒

c 复制代码
void TIM6_IRQHandler()
{

	if(TIM_GetITStatus( TIM6, TIM_IT_Update))
		
	{
	
	    TIM_ClearITPendingBit(TIM6, TIM_IT_Update);
		num++;
		if(num==20)
		{
		   num=0;
			//led取反
			GPIOA->ODR^=0x0100;         
			//   异或,相同为0,不同为1 
			//拿0 去异或,原来是0,还是0;原来是1,还是1。既可以保持不变
			//拿1 去异或,原来是0,变成1;原来是0,变成1。起到取反的作用
			second++;
			one_second_flag=1;
			if(second==60)
			{
				second=0;
				minute++;
				if(minute==60)
				{
					minute=0;
					hour++;
					if(hour==24)
					{
						hour=0;
					}
				}
			}
		
		}
	}
}

四、测试验证

在中断服务函数设定断点

4.1时钟使能查看

4.2 更新中断状态位


4.3 其他状态和配置

五、拓展

串口: 时钟

  1. 通过串口获取时分秒
  2. 通过串口修改时间

总结

深入浅出,从51单片机定时结构到stm32定时结构引导讲解了,STM32如何实现定时1s的原理,并工程实现

相关推荐
Jason_zhao_MR1 小时前
米尔电子参展预告_中国工博会2026-外发版
嵌入式硬件·机器人·工业控制
Zw-awa2 小时前
电机家族:有的电机听“目标”,有的电机听“力气”
stm32
FPGA小徐6 小时前
STM32五路气敏传感器阵列电路详解:从HHC1000分压到AD8606跟随器和ADC采样
stm32·单片机·嵌入式硬件
Horn Still Sounds8 小时前
IMX6ULL裸机|I2C通信协议 + ADC模数转换学习笔记
arm开发·笔记·单片机·嵌入式硬件
智感子8 小时前
无人值守称重:地磅系统架构与流程
嵌入式硬件
新晨单片机设计9 小时前
S011C-基于STM32智能灯光控制系统(光强、声音、人体)【Proteus仿真+Keil程序+原理图】
stm32·嵌入式硬件·proteus·智能灯光控制系统
无敌贵点大王10 小时前
RTThread学习记录13——关于要使用一个外设,RTThread与cubemx到底要怎么配合?
c语言·stm32·学习·rtthread
女神下凡12 小时前
芯参谋(26):DDR4_软件设计规范
arm开发·单片机·嵌入式硬件
zd84510150012 小时前
DSLogic逻辑分析仪连接失败
嵌入式硬件
国科安芯13 小时前
星载通信载荷信号处理中抗辐射微控制器的选型与适应性分析
人工智能·嵌入式硬件·mcu·信号处理·risc-v·抗辐射·空间信息