基于STM32F103ZET6主控平台实现定时器TIM3的驱动

一个热爱代码的工程师,唯有凭借双手不断敲打,才可以快速提升实力!

本文谨以记录,日后相忘时再作复习,代码没有贵贱,既来之则安之。

定时器描述:定时器的运用主要是对重装载值和预分频的配置,这两个寄存器配置决定定时器定时的时长,接下来是开启定时器中断,当设置的时长溢出便会进入中断,在相应的中断服务函数中编写要执行的程序即可实现隔一段时间执行一次程序的效果,例如LED的亮灭。

第一步:编写tim.h头文件

#ifndef __TIM_H
#define __TIM_H
#include "sys.h"
void TIM3_Init(u16 arr,u16 psc);//定时器3初始化
#endif

第二步:编写tim.c文件

#include "tim.h"
#include "led.h"

void TIM3_IRQHandler(void)
{
	if(TIM3->SR&0x0001)
	{
		LED0=!LED0;
	}
	TIM3->SR&=~(1<<0);//处理完中断之后应该向 TIM3_SR 的最低位写 0,来清除该中断标志
}
//定时器3中断初始化
void TIM3_Init(u16 arr,u16 psc)
{
	RCC->APB1ENR|=1<<1;//开启TIM3定时器时钟
	TIM3->ARR=arr;//设置重装载值
	TIM3->PSC=psc;//设置预分频值
	TIM3->DIER|=1<<0;//开启中断允许
	TIM3->CR1|=0x01;//开启定时器3
	MY_NVIC_Init(1,3,TIM3_IRQn,2);
}

第三步:编写main函数

#include "sys.h"
#include "usart.h"		
#include "delay.h"
#include "led.h"
#include "beep.h"
#include "key.h"
#include "tim.h"
u8 Wl_stat=0;//while标志位
int main(void)
{		
//	int key_stat;
	Stm32_Clock_Init(9);	  //系统时钟设置
	delay_init(72);	  		  //延时初始化
	uart_init(72,115200); 	//串口初始化为115200
	LED_Init();
	BEEP_Init();
	TIM3_Init(4999,7199);
	while(1)
	{
		if(Wl_stat==0)//代表进入WHILE循环
		{
			printf("Input While(1)-->\r\n");
			Wl_stat=1;
		}
		LED1=!LED1;
		delay_ms(200);
	}
} 

第四步:编译通过后,烧录进STM32F103ZET6开发板,实现程序设计效果即可。

效果:【在完成软件设计之后,我们将编译好的文件下载到精英 STM32 V1 开发板上,观看其运行结果是否与我们编写的一致。如果没有错误,我们将看 DS0 不停闪烁(每 400ms 闪烁一次),而 DS1 也是不停的闪烁,但是闪烁时间较 DS0 慢( 1s 一次)】

想太多,做太少,怎改变自己

谢谢大家的关注和支持,来自一个嵌入式软硬件工程师的内心情感!

PS:本文的代码参考正点原子

猜你喜欢

转载自blog.csdn.net/weixin_41586634/article/details/82786690