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的原理,并工程实现

相关推荐
-凌凌漆-3 分钟前
【嵌入式】FreeRTOS串口等待vTaskDelay()
嵌入式硬件
小昭在路上……37 分钟前
GPIO端口引脚(位域)打包技巧笔记
单片机·嵌入式硬件
是翔仔呐37 分钟前
第13章 SPI通信协议全解:底层时序、4种工作模式与W25Qxx Flash芯片读写实战
c语言·开发语言·stm32·单片机·嵌入式硬件·学习·gitee
悠哉悠哉愿意43 分钟前
【单片机复习笔记】第十六届省赛复盘
笔记·单片机·嵌入式硬件
IT方大同1 小时前
RT_thread(RTOS实时操作系统)线程的创建与切换
c语言·开发语言·嵌入式硬件
是翔仔呐1 小时前
第14章 CAN总线通信全解:底层原理、帧结构与双机CAN通信实战
c语言·开发语言·stm32·单片机·嵌入式硬件·学习·gitee
沐欣工作室_lvyiyi2 小时前
基于单片机的智能浴室(论文+源码)
stm32·单片机·嵌入式硬件·智能浴室
二本咕咕-机械转码2 小时前
STM32是怎么跑起来的?启动流程 + 时钟树一次讲透(面试高频)
stm32·嵌入式硬件·面试
撩妹小狗2 小时前
揭秘舵机精准控制的PWM奥秘
单片机·嵌入式硬件
Heartache boy2 小时前
野火STM32_HAL库版课程笔记-TIM通道输出应用之PWM实现呼吸灯
笔记·stm32·单片机·嵌入式硬件