1. 程式人生 > >基於STM32F103ZET6主控平臺實現定時器TIM3的驅動

基於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:本文的程式碼參考正點原子