STM32学习笔记(十二)定时器中断实验

STM32F103ZET6之定时器中断实验


文章目录

  • STM32F103ZET6之定时器中断实验
  • 前言
  • 一、定时器基本原理
    • 1.资源介绍
    • 2.通用定时器功能
    • 3.计数模式介绍
    • 4.工作原理
  • 二、相关寄存器
    • 1.控制寄存器 1(TIMx_CR1)
    • 2.DMA/中断使能寄存器(TIMx_DIER)
    • 3.预分频寄存器(TIMx_PSC)
    • 4.自动重装载寄存器(TIMx_ARR)
    • 5.计数器当前值寄存器( TIMx_CNT)
  • 三、操作步骤
    • 1.溢出时间计算
    • 2.操作步骤
  • 四、程序源码
    • 1.timer.h
    • 2.timer.c
    • 3.main.c
  • 五、实验结果
  • 总结


前言

对于STM32的学习可分为3个版本。
1.寄存器版本
2.库函数版本
3.HAL库版本
由于个人原因,选择库函数版本来进行STM32的学习。


提示:软件安装等问题,不进行讲解!!!

一、定时器基本原理

1.资源介绍

STM32学习笔记(十二)定时器中断实验_第1张图片
STM32学习笔记(十二)定时器中断实验_第2张图片

2.通用定时器功能

STM32学习笔记(十二)定时器中断实验_第3张图片
STM32学习笔记(十二)定时器中断实验_第4张图片

3.计数模式介绍

STM32学习笔记(十二)定时器中断实验_第5张图片

4.工作原理

STM32学习笔记(十二)定时器中断实验_第6张图片

二、相关寄存器

1.控制寄存器 1(TIMx_CR1)

STM32学习笔记(十二)定时器中断实验_第7张图片

2.DMA/中断使能寄存器(TIMx_DIER)

STM32学习笔记(十二)定时器中断实验_第8张图片

3.预分频寄存器(TIMx_PSC)

STM32学习笔记(十二)定时器中断实验_第9张图片

4.自动重装载寄存器(TIMx_ARR)

STM32学习笔记(十二)定时器中断实验_第10张图片

5.计数器当前值寄存器( TIMx_CNT)

STM32学习笔记(十二)定时器中断实验_第11张图片

三、操作步骤

1.溢出时间计算

STM32学习笔记(十二)定时器中断实验_第12张图片

STM32学习笔记(十二)定时器中断实验_第13张图片

2.操作步骤

STM32学习笔记(十二)定时器中断实验_第14张图片

四、程序源码

1.timer.h

代码如下:

#ifndef __TIMER_H
#define __TIMER_H

#include "sys.h"

void TIM3_Int_Init(u16 arr,u16 psc);

#endif

2.timer.c

代码如下:

#include "timer.h"
#include "led.h"

void TIM3_Int_Init(u16 arr,u16 psc)
{
	TIM_TimeBaseInitTypeDef IM_TimeBaseInitstr;
	NVIC_InitTypeDef NVIC_Initstr;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//定时器时钟使能
	
	IM_TimeBaseInitstr.TIM_Period=arr;
	IM_TimeBaseInitstr.TIM_Prescaler=psc;
	IM_TimeBaseInitstr.TIM_CounterMode=TIM_CounterMode_Up;
	IM_TimeBaseInitstr.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseInit(TIM3, &IM_TimeBaseInitstr);//初始化时钟
	
	TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);//开启定时器中断
	
	NVIC_Initstr.NVIC_IRQChannel=TIM3_IRQn;
	NVIC_Initstr.NVIC_IRQChannelCmd=ENABLE;
	NVIC_Initstr.NVIC_IRQChannelPreemptionPriority=0;
	NVIC_Initstr.NVIC_IRQChannelSubPriority=2;
	NVIC_Init(&NVIC_Initstr);//配置NVIC
	
	TIM_Cmd(TIM3, ENABLE);//使能定时器
}
void TIM3_IRQHandler(void)//中断服务函数
{
	if(TIM_GetITStatus(TIM3, TIM_IT_Update)==SET)
	{
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update);//清除更新中断标志
		LED1=!LED1;
	}
}

3.main.c

代码如下:

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "beep.h"
#include "key.h"
#include "timer.h"

int main(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	delay_init();
    LED_Init();
	Beep_Init();
	KEY_Init();
	TIM3_Int_Init(4999,7199);//间隔500ms
	while(1)
	{
		LED2=!LED2;
		delay_ms(200);
	}
}

五、实验结果

LED1状态翻转,间隔500ms;(定时器)
LED2状态翻转,间隔200ms;(延时)


总结

坚持!!!

你可能感兴趣的:(STM32学习笔记,stm32)