程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> STM8S timer5初始化設置及應用

STM8S timer5初始化設置及應用

編輯:關於C
//文件timer5.h

#ifndef _timer5_H_
#define _timer5_H_

#define		TIM5_DIV1				(uint8)0
#define		TIM5_DIV2				(uint8)1
#define		TIM5_DIV4				(uint8)2
#define		TIM5_DIV8				(uint8)3
#define		TIM5_DIV16				(uint8)4
#define		TIM5_DIV32				(uint8)5
#define		TIM5_DIV64				(uint8)6
#define		TIM5_DIV128				(uint8)7


#define	TIM5_UpDate				(unsigned char)0x01	//更新中斷通道
#define	TIM5_InChanel1		(unsigned char)0x02
#define	TIM5_InChanel2		(unsigned char)0x04
#define	TIM5_InChanel3		(unsigned char)0x08

#define	TIM5_InDir_UP		(unsigned char)0
#define	TIM5_InDir_DOWN	(unsigned char)1

#define	TIM5_IEN_ENB				TIM5_CR1 |= 0X01 ;	//開啟定時器
#define	TIM5_IEN_OFF				TIM5_CR1 &= ~0X01 ;	//關閉定時器	

extern 	void Init_TIM5_Base(uint16 Tcon,uint8 Pscr) ;

extern	void Init_TIM5_InSet(void) ;
extern	void TIM5_InChanelEnb(uint8 Chanel,uint8 en) ;
extern	void TIM5_InDirection(uint8 Chanel,uint8 Dircetion);
extern	void TIM5_InEnb(uint8 en) ;

extern	void TIM5_IntEnb(uint8 Chanel,uint8 en) ;
extern	void TIM5_Enb(uint8 en) ;

#endif


//文件timer5.c

#include "global.h" 
#include "timer5.h"


#define		Init_TIM5_Base_CALL
/*
#define		Init_TIM5_InSet_CALL
#define		TIM5_InDirection_CALL
#define		TIM5_InChanelEnb_CALL
*/
#define		TIM5_IntEnb_CALL
//#define		TIM5_InEnb_	CALL

#define		TIM5_Enb_CALL

// *****   TIM5	16位普通定時器  ********

//*************************************
// 函數名稱:Init_Timer5_Timer
// 函數功能:TIM5作定時器用時初始化
// 入口參數:
// 出口參數:無
/***************************************/
#ifdef	Init_TIM5_Base_CALL

void Init_TIM5_Base(uint16 Tcon,uint8 Pscr)
{	
// 禁止產生更新事件
		TIM5_EGR = 0x00;   
//計數器時鐘=主時鐘/16=16MHZ/16 = 1U
// 相當於計數器周期為1uS
		TIM5_PSCR = Pscr;     												
		
//設定重裝載時的寄存器值
		TIM5_ARRH = (Tcon >> 8) & 0xff;//0X07;   
		TIM5_ARRL = Tcon & 0xff ;//0XD0;  	
// 設定計數器的初值		 定時周期=(ARR+1)*8=16320uS
		TIM5_CNTRH = 0; 
		TIM5_CNTRL = 0; 		
		
// b0 = 1,允許計數器工作 b1 = 0,允許更新
// 設置控制器,啟動定時器
		TIM5_CR1 = 0x00;   	
	
}

#endif	//Init_TIM5_Base_CALL
//*************************************
// 函數名稱:Init_Timer5_In
// 函數功能:TIM5作輸入捕捉使用時初始化
// 入口參數:
// 出口參數:無
/***************************************/
#ifdef	Init_TIM5_InSet_CALL

void Init_TIM5_InSet(void)
{

		TIM5_CCER1 &= ~(SETB0 | SETB4) ; //禁止輸入捕獲1 2 3
		TIM5_CCER2 &= ~SETB0 ;

//	采樣頻率=Fmst  N = 8  
//  每個邊沿捕獲一次
		TIM5_CCMR1 |= 0x30 ;
		TIM5_CCMR2 |= 0x30 ;
		TIM5_CCMR3 |= 0x30 ;
		
		//通道映射方向
		TIM5_CCMR1 |= 0x01 ;//IC1映射在TI1FP1	
//		TIM5_CCMR1 |= 0x02 ;//IC1映射在TI2FP1		
//		TIM5_CCMR2 |= 0x01 ;//IC2映射在TI2FP2	
		TIM5_CCMR2 |= 0X02 ;//IC2映射在TI1FP2	
		TIM5_CCMR3 = 0x31 ;//IC3映射在TI3FP3	
		
		TIM5_SMCR = 0X04 ; //觸發方式復位
		
		//捕捉方向
		TIM5_InDirection(TIM5_InChanel1,TIM5_InDir_UP) ;
		TIM5_InDirection(TIM5_InChanel2,TIM5_InDir_DOWN) ;	
		TIM5_InDirection(TIM5_InChanel3,TIM5_InDir_UP) ;
		//捕捉通道使能
		TIM5_InChanelEnb((TIM5_InChanel1 | TIM5_InChanel2) ,ENB) ;
		TIM5_InChanelEnb(TIM5_InChanel3 ,DIS) ;
		
}

#endif	//Init_TIM5_InSet_CALL

//*************************************
// 函數名稱:TIM5_InDirection
// 函數功能:TIM5捕捉方向設置
// 入口參數:通道號,捕捉方向
// 出口參數:無
/***************************************/
#ifdef		TIM5_InDirection_CALL

void  TIM5_InDirection(uint8 Chanel,uint8 Dircetion)
{
		if(Chanel == TIM5_InChanel1) //通道1
		{		
				if(Dircetion == TIM5_InDir_UP)
					TIM5_CCER1 &= ~SETB1 ;//捕捉在TI1F或TI2F的上升沿
				else
					TIM5_CCER1 |= SETB1 ;
		}
		else	if(Chanel == TIM5_InChanel2)//通道2
		{
				//捕捉在TI1F或TI2F的上升沿
				if(Dircetion == TIM5_InDir_UP)
							TIM5_CCER1 &= ~SETB5 ;
				else
					TIM5_CCER1 |= SETB5 ;				
		}
		else	if(Chanel == TIM5_InChanel3)//通道3
		{
				if(Dircetion == TIM5_InDir_UP)
							TIM5_CCER2 &= ~SETB1 ;//捕捉在TI3F的上升沿
				else
					TIM5_CCER2 |= SETB1 ;						
		}

}
#endif	//TIM5_InDirection_CALL
//*************************************
// 函數名稱:TIM5_InChanelEnb
// 函數功能:TIM5輸入通道使能函數
// 入口參數:TIM5通道號 使能參數
// 出口參數:無
/***************************************/
#ifdef	TIM5_InChanelEnb_CALL

void TIM5_InChanelEnb(uint8 Chanel,uint8 en)
{
		if(ENB == en)		
		{
			if(Chanel & TIM5_InChanel1)
				TIM5_CCER1 |= SETB0 ;	//捕捉1使能
			if(Chanel & TIM5_InChanel2)
				TIM5_CCER1 |= SETB4 ;	//捕捉2使能
			if(Chanel & TIM5_InChanel3)
				TIM5_CCER2 |= SETB0 ;	//捕捉3使能
		}
		else 
		{
			if(Chanel & TIM5_InChanel1)
				TIM5_CCER1 &= ~SETB0 ;	//捕捉1禁止使能
			if(Chanel & TIM5_InChanel2)
				TIM5_CCER1 &= ~SETB4 ;	//捕捉2禁止使能
			if(Chanel & TIM5_InChanel3)
				TIM5_CCER2 &= ~SETB0 ;	//捕捉3禁止使能				
		}
					
}
#endif	//TIM5_InChanelEnb_CALL
//*************************************
// 函數名稱:TIM5_IntEnb
// 函數功能:TIM5中斷使能函數
// 入口參數:TIM5中斷號 使能參數
// 出口參數:無
/***************************************/
#ifdef	TIM5_IntEnb_CALL	

void  TIM5_IntEnb(uint8 Chanel,uint8 en)
{
		if(ENB == en)		
		{
			if(Chanel & TIM5_UpDate)	
				TIM5_IER 	|= SETB0 ;	//允許更新中斷
			if(Chanel & TIM5_InChanel1)
				TIM5_IER |= SETB1 ;	//開捕捉/比較1中斷
			if(Chanel & TIM5_InChanel2)
				TIM5_IER |= SETB2 ;	//開捕捉/比較2中斷
			if(Chanel & TIM5_InChanel3)
				TIM5_IER |= SETB3 ;	//開捕捉/比較3中斷
		}
		else 
		{
			if(Chanel & TIM5_UpDate)	
				TIM5_IER 	&= ~SETB0 ;	//禁止更新中斷
			if(Chanel & TIM5_InChanel1)
				TIM5_IER 	&= ~SETB1 ;		//禁止捕捉/比較1中斷
			if(Chanel & TIM5_InChanel2)
				TIM5_IER 	&= ~SETB2 ;		//禁止捕捉/比較2中斷
			if(Chanel & TIM5_InChanel3)
				TIM5_IER 	&= ~SETB3 ;		//禁止捕捉/比較3中斷		
		}	
}
#endif	//TIM5_IntEnb_CALL	
//*************************************
// 函數名稱:Tim5In_Enb
// 函數功能:TIM5 開捕捉中斷 
// 入口參數:
// 出口參數:無
/***************************************/
#ifdef	TIM5_InEnb_CALL

void TIM5_InEnb(uint8 en)
{
		if(en == ENB)
		{
			TIM5_CNTRH = 0; 
			TIM5_CNTRL = 0; 
			//開捕捉/比較1.2中斷
			TIM5_IntEnb((TIM5_InChanel1 | TIM5_InChanel2),ENB) ; 
			TIM5_CR1 |= 0X01 ;	//開啟定時器
		}
		else
		{			
			//關閉捕捉/比較1.2.3中斷
			TIM5_IntEnb((TIM5_InChanel1 | TIM5_InChanel2 | TIM5_InChanel3),DIS) ; 
			TIM5_CR1 &= ~0X01 ;	//關閉定時器			
		}
}
#endif	//TIM5_InEnb_CALL
//*************************************
// 函數名稱:Tim5er_Enb
// 函數功能:TIM5er使能 作定時器用
// 入口參數:
// 出口參數:無
/***************************************/
#ifdef	TIM5_Enb_CALL

void TIM5_Enb(uint8 en)
{	
		if(en == ENB)
		{
			TIM5_IntEnb(TIM5_UpDate,ENB) ; //使能更新中斷
			TIM5_CR1 |= 0X01 ;	//開啟定時器
		}
		else
		{
			TIM5_IntEnb(TIM5_UpDate,DIS) ; //禁止更新中斷
			TIM5_CR1 &= ~0X01 ;	//關閉定時器			
		}
}
#endif	//TIM5_Enb_CALL



//實例應用
void main(void)
{
//-----TIM5 初始化--------------------------
	Init_TIM5_Base(30,TIM5_DIV16) ; //16M/16=1M 定時30*1U=30U中斷一次
	TIM5_Enb(ENB) ;			//TIM5定時器使能計數 使能中斷


	while(1)
	{
			
	}
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved