1. 程式人生 > >2018 -0524 STM32計時器中斷

2018 -0524 STM32計時器中斷

用一個計時器計時1秒,使得LED燈間隔一秒閃爍。

主程式:

#include "stm32f10x.h"
#include "delay.h"
#include "LED1.h" 
#include  "time.h"
int main(void)
{

	delay_init(10);                                 //延時初始化
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設定中斷分組 這個要在設定中斷優先順序前面,一開始就要設定好的不能更改
	LED_Init1();
	Time3_Init(9999, 7199);                         //時間計算放在下面說明
	while (1)
	{
		GPIO_ResetBits(GPIOB,GPIO_Pin_12);      //讓LED燈一直亮	
	}

}

標頭檔案: 

1. LED1.h

#ifndef  __LED_H
#define __LED_H

void LED_Init1(void);
#endif

2.time.h

#ifndef __TIME__H
#define __TIME__H
#include "sys.h"

void Time3_Init(u16 arr, u16 psc);    //定時器3初始化函式
#endif

C檔案

1. LED.c

#include "LED1.h"            //引用標頭檔案
#include"stm32f10x.h"

void LED_Init1(void)
{

	GPIO_InitTypeDef	GPIO_InitStrucyure;           //結構變數
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);  //使能時鐘GPLOB
	
	GPIO_InitStrucyure.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStrucyure.GPIO_Pin=GPIO_Pin_12;
	GPIO_InitStrucyure.GPIO_Speed=GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOB,&GPIO_InitStrucyure);                 //初始化io口
	
	GPIO_SetBits(GPIOB,GPIO_Pin_12);                      // io口預設不點亮,先將io口設定為高電平

}

2.time.c

#include "time.h"
#include "delay.h"
#include "LED1.h"

void Time3_Init(u16 arr, u16 psc)
{
	NVIC_InitTypeDef NVIC_Initstruct;                              //結構變數
	TIM_TimeBaseInitTypeDef TIM_Timeinit;                          //結構變數
	
	TIM_Timeinit.TIM_ClockDivision = TIM_CKD_DIV1;                 //隨意選取
	TIM_Timeinit.TIM_CounterMode =  TIM_CounterMode_Up;            //計數模式
	TIM_Timeinit.TIM_Period = arr;                                 // 需要根據要計時的長度來計算輸入
	TIM_Timeinit.TIM_Prescaler = psc;                              //預分頻係數 計算輸入
	//TIM_Timeinit.TIM_RepetitionCounter =                         //這個不需要
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);            //使能定時器3時鐘
	TIM_TimeBaseInit(TIM3,&TIM_Timeinit);                          //初始化定時器配置
	
	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);                       //開啟定時器中斷 配置nvic
	////////配置NIIC   記住要在主函式main中 先設定好優先順序分組
	
	NVIC_Initstruct.NVIC_IRQChannel=TIM3_IRQn 	;	       //通道在stm32的標頭檔案中找,io10對應通道9 對應EXTI9_5_IRQn
	NVIC_Initstruct.NVIC_IRQChannelCmd= ENABLE;
	NVIC_Initstruct.NVIC_IRQChannelPreemptionPriority=2;	       //搶佔優先順序, 在這個之前要中斷分組好,所以要在主函式中分好組
	NVIC_Initstruct.NVIC_IRQChannelSubPriority= 2 ;                //子優先順序
	NVIC_Init(&NVIC_Initstruct);
        //////////////////////

        TIM_Cmd(TIM3,ENABLE);                                          //使能定時器

        ///前面4個步驟已經完成現在完成中斷服務函式
}

void TIM3_IRQHandler()
{
	if(TIM_GetITStatus(TIM3,TIM_IT_Update) == SET)                //獲取狀態定時器的狀態 Upadate更新中斷,是否更新了
	{
	
		GPIO_SetBits(GPIOB,GPIO_Pin_12);                      //定時器中斷髮生,將燈滅;
		delay_ms(500);
	
	        ///////別忘記了手動清除標誌位!!!!!!!!!
		
		TIM_ClearITPendingBit(TIM3,TIM_IT_Update);           //清除中斷標誌
	
	} 
	
}


其中在主程式中有   Time3_Init(9999, 7199);  這裡表示定時的時間是1s:

計算公式:

                                               T = (A+1)*(B+1)/TCLK;         A為前面的輸入  ,B 為後面的那個輸入

TCLK一般為72M      先計算(B+1)/TCLK    當B為7199時候,(B+1)/TCLK  =  0.1ms   所以要讓T 為1,  只要將A設為9999。