STM32基本定时器中断

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

文章目录

  • 前言
  • 一、STM32定时器的结构?
    • 1. 51定时器的结构
      • 1.1如何实现定时1s的功能?
    • 2. stm32定时器的结构
      • 2.1 通用定时器
  • 二、使用步骤
    • 1.开启时钟
    • 2.初始化定时器
    • 3.中断配置(分组、优先级)
      • 3.1 配置中断源
      • 3.2配置中断优先级
      • 3.3 开启定时器
      • 3.4 中断服务函数
      • 3.5判断中断源, 清除中断源
  • 三、参考初始化函数
    • 3.1写成外设初始化函数,方便main函数调用
    • 3.2中断函数
    • 3.3 中断服务函数加入时分秒
  • 四、测试验证
    • 4.1时钟使能查看
    • 4.2 更新中断状态位
    • 4.3 其他状态和配置
  • 五、拓展
  • 总结


前言

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

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


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

一、STM32定时器的结构?

1. 51定时器的结构

STM32基本定时器中断_第1张图片

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

STM32基本定时器中断_第2张图片

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

2. stm32定时器的结构

STM32基本定时器中断_第3张图片

2.1 通用定时器

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

STM32基本定时器中断_第4张图片
有基本定时器的型号
STM32基本定时器中断_第5张图片

STM32基本定时器中断_第6张图片

STM32基本定时器中断_第7张图片

STM32基本定时器中断_第8张图片

STM32基本定时器中断_第9张图片

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

二、使用步骤

1.开启时钟

STM32基本定时器中断_第10张图片

代码如下(示例):

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);

2.初始化定时器

STM32基本定时器中断_第11张图片
STM32基本定时器中断_第12张图片

代码如下(示例):

//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只有溢出中断
STM32基本定时器中断_第13张图片

	TIM_ITConfig( TIM6, TIM_IT_Update, ENABLE);

3.2配置中断优先级

	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今后每个外设都要单独开启

	TIM_Cmd( TIM6, ENABLE);      //使能

3.4 中断服务函数

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

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判断中断源, 清除中断源

STM32基本定时器中断_第14张图片

三、参考初始化函数

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

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中断函数

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 中断服务函数加入时分秒

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;
					}
				}
			}
		
		}
	}
}

四、测试验证

在中断服务函数设定断点

STM32基本定时器中断_第15张图片

4.1时钟使能查看

STM32基本定时器中断_第16张图片

4.2 更新中断状态位

STM32基本定时器中断_第17张图片
STM32基本定时器中断_第18张图片

4.3 其他状态和配置

STM32基本定时器中断_第19张图片

五、拓展

串口: 时钟

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

STM32基本定时器中断_第20张图片

总结

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

你可能感兴趣的:(STM32,学习教程,stm32,单片机,嵌入式硬件)