⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timer.c

📁 基于NXP2200平台的OS移植模板
💻 C
字号:
/** @file	Timer.c
* @brief	LPC2200 Timer n驅動程序
* @Notice	采用中斷方式, 如有问题请联系作者
* @Author	Mars.zhu@hotmail.com 2007-7-6 17:03
* @Modify
*/
#include "option.h"
#include "Timer.h"

#define	PR		99
#define	PWM_PR	0

/** @func TnMR_Init()
* @brief 定时器n初始化
* @param	Tn		 定時器選擇
*			ms		 定時時間
* @Retval	void
*/
void
TnMR_Init(uint8 Tn, uint16 ms, unsigned ISR)
{
	uint32	mr;

	/** 匹配寄存器*/
	mr = Fpclk / (PR+1) / 1000 * ms;

	switch (Tn) {
	case 0:
		T0PR	= PR;
		T0MCR	= 0x03;
		T0MR0	= mr;
		T0TCR	= 0x03;
		T0TCR	= 0x01;
		SetISR(TIMER0_NO, TIMER0_Slot, ISR);
		break;
	case 1:
		T1PR	= PR;
		T1MCR	= 0x03;
		T1MR0	= mr;
		T1TCR	= 0x03;
		T1TCR	= 0x01;
		SetISR(TIMER1_NO, TIMER1_Slot, ISR);
		break;
	default:
		break;
	}
}

/** @func TnCAP_Init()
* @brief 定时器n捕获模式初始化
* @param	Tn			定時器選擇
*			CAP_MODE	捕获方式,按位操作方式
*				bit0:1--CAP上跳沿捕获
*				bit1:1--CAP下降沿捕获
*			CAPn		捕获通道选择,0~3
* @Retval	void
*/
void
TnCAP_Init(uint8 Tn, uint8 CAP_MODE, uint8 CAPn, unsigned ISR)
{
	switch (Tn) {
	case 0:
		/** Set TnCAP0 Pin*/
		switch (CAPn) {
		case 0:
			PINSEL0 = (PINSEL0&P002_CLR_BITS) | P002_FOR_CAP0_0;
			break;
		case 1:
			PINSEL0 = (PINSEL0&P004_CLR_BITS) | P004_FOR_CAP0_1;
			break;
		case 2:
			PINSEL0 = (PINSEL0&P006_CLR_BITS) | P006_FOR_CAP0_2;
			break;
		case 3:
			PINSEL1 = (PINSEL1&P029_CLR_BITS) | P029_FOR_CAP0_3;
			break;
		default:
			break;
		}

		/** Clear Int flag*/
		T0IR	= T0IR | (1<<(CAPn+4));

		/** 设置捕获控制寄存器*/
		T0CCR	= (T0CCR & (~(3<<(CAPn*3)))) | (CAP_MODE<<(CAPn*3)) | (1<<(CAPn*3+2));
		SetISR(TIMER0_NO, TIMER0_Slot, ISR);
		T0TCR	= 0x03;
		T0TCR	= 0x01;
		break;
	case 1:
		/** Set TnCAP0 Pin*/
		switch (CAPn) {
		case 0:
			PINSEL0 = (PINSEL0&P010_CLR_BITS) | P010_FOR_CAP1_0;
			break;
		case 1:
			PINSEL0 = (PINSEL0&P011_CLR_BITS) | P011_FOR_CAP1_1;
			break;
		case 2:
			PINSEL1 = (PINSEL1&P017_CLR_BITS) | P017_FOR_CAP1_2;
			break;
		case 3:
			PINSEL1 = (PINSEL1&P018_CLR_BITS) | P018_FOR_CAP1_3;
			break;
		default:
			break;
		}

		/** Clear Int flag*/
		T1IR	= T1IR | (1<<(CAPn+4));

		/** 设置捕获控制寄存器*/
		T1CCR	= (T1CCR & (~(3<<(CAPn*3)))) | (CAP_MODE<<(CAPn*3)) | (1<<(CAPn*3+2));
		SetISR(TIMER1_NO, TIMER1_Slot, ISR);
		T1TCR	= 0x03;
		T1TCR	= 0x01;
		break;
	default:
		break;
	}
}


/** @func TnMAT_Init()
* @brief 定时器n匹配模式初始化
* @param	Tn			定時器選擇
*			time		匹配时间,该值会直接写入到匹配寄存器中
*			T_MODE		匹配控制模式
*				0: 匹配时,定时器复位
*				1: 匹配时,定时器停止
*			EXT_MODE	匹配时,外部输出控制
*				0: 不执行任何动作
*				1: 外部匹配输出0
*				2: 外部匹配输出1
*				3: 外部匹配输出翻转
*			MATn		匹配通道选择,0~3
* @Retval	void
*/
void
TnMAT_Init(uint8 Tn, uint32 time, uint8 T_MODE, uint8 EXT_MODE, uint8 MATn, unsigned ISR)
{
	switch (Tn) {
	case 0:
		if (EXT_MODE) {
			switch (MATn) {
			case 0:
				PINSEL0 = (PINSEL0&P003_CLR_BITS) | P003_FOR_MAT0_0;
				break;
			case 1:
				PINSEL0 = (PINSEL0&P005_CLR_BITS) | P005_FOR_MAT0_1;
				break;
			case 2:
				PINSEL1 = (PINSEL1&P016_CLR_BITS) | P016_FOR_MAT0_2;
				break;
			case 3:
				PINSEL1 = (PINSEL1&P029_CLR_BITS) | P029_FOR_MAT0_3;
				break;
			default:
				break;
			}
		}
		T0IR = T0IR | (1<<MATn);
		T0PR = PR;

		/** 匹配寄存器*/
		*(uint32*)((&T0MR0)+MATn) = time;
		/** 匹配控制寄存器*/
		T0MCR = (T0MCR & (~(7<<(MATn*3)))) | (1<<(MATn*3+1+T_MODE)) | (1<<(MATn*3));
		/** 外部匹配寄存器*/
		T0EMR = (T0EMR & (~(3<<(MATn*2+4)))) | (EXT_MODE<<(MATn*2+4));
		SetISR(TIMER0_NO, TIMER0_Slot, ISR);
		T0TCR = 0x03;
		T0TCR = 0x01;
		break;
	case 1:
		if (EXT_MODE) {
			switch (MATn) {
			case 0:
				PINSEL0 = (PINSEL0&P012_CLR_BITS) | P012_FOR_MAT1_0;
				break;
			case 1:
				PINSEL0 = (PINSEL0&P013_CLR_BITS) | P013_FOR_MAT1_1;
				break;
			case 2:
				PINSEL1 = (PINSEL1&P019_CLR_BITS) | P019_FOR_MAT1_2;
				break;
			case 3:
				PINSEL1 = (PINSEL1&P020_CLR_BITS) | P020_FOR_MAT1_3;
				break;
			default:
				break;
			}
		}
		T1IR = T1IR | (1<<MATn);
		T1PR = PR;

		/** 匹配寄存器*/
		*(uint32*)((&T1MR0)+MATn) = time;
		/** 匹配控制寄存器*/
		T1MCR = (T1MCR & (~(7<<(MATn*3)))) | (1<<(MATn*3+1+T_MODE)) | (1<<(MATn*3));
		/** 外部匹配寄存器*/
		T1EMR = (T1EMR & (~(3<<(MATn*2+4)))) | (EXT_MODE<<(MATn*2+4));
		SetISR(TIMER1_NO, TIMER1_Slot, ISR);
		T1TCR = 0x03;
		T1TCR = 0x01;
		break;
	default:
		break;
	}
}

/** @func TnCNT_Init()
* @brief 计数器n初始化
* @param	Tn		定時器選擇
*			MODE	计数器模式选择
*				0: CAPn的上升沿计数
*				1: CAPn的下降沿计数
*				2: CAPn上升沿和下降沿都计数
*			CAPn	计数器输入端0~3
* @Retval	void
*/
void
TnCNT_Init(uint8 Tn, uint8 MODE, uint8 CAPn)
{
	switch (Tn) {
	case 0:
		switch (CAPn) {
		case 0:
			PINSEL0 = (PINSEL0&P002_CLR_BITS) | P002_FOR_CAP0_0;
			break;
		case 1:
			PINSEL0 = (PINSEL0&P004_CLR_BITS) | P004_FOR_CAP0_1;
			break;
		case 2:
			PINSEL0 = (PINSEL0&P006_CLR_BITS) | P006_FOR_CAP0_2;
			break;
		case 3:
			PINSEL1 = (PINSEL1&P029_CLR_BITS) | P029_FOR_CAP0_3;
			break;
		default:
			break;
		}
//		T0CTCR	= (CAPn<<2) | (MODE+1);
		T0TCR	= 0x03;
		T0TCR	= 0x01;
		break;
	case 1:
		switch (CAPn) {
		case 0:
			PINSEL0 = (PINSEL0&P010_CLR_BITS) | P010_FOR_CAP1_0;
			break;
		case 1:
			PINSEL0 = (PINSEL0&P011_CLR_BITS) | P011_FOR_CAP1_1;
			break;
		case 2:
			PINSEL1 = (PINSEL1&P017_CLR_BITS) | P017_FOR_CAP1_2;
			break;
		case 3:
			PINSEL1 = (PINSEL1&P018_CLR_BITS) | P018_FOR_CAP1_3;
			break;
		default:
			break;
		}
//		T1CTCR	= (CAPn<<2) | (MODE+1);
		T1TCR	= 0x03;
		T1TCR	= 0x01;
		break;
	default:
		break;
	}
}

/** @func	TnPWM_Init()
* @brief	PWMn初始化, 单边沿控制模式
* @param	ch			PWM 通道号
*			Cyc			PWM 周期(us)
*			Mode		PWM 输出模式 1 单边沿 2 双边沿
*			H_time		PWM 高电平时间
*			L_time		PWM 低电平时间(Mode=1无效)
* @Retval	void
*/
void
TnPWM_Init(uint8 ch, uint32 Cyc, uint32 H_time)
{
	uint32	mr_cyc, mr_duty;

	/** 计算匹配值*/
	mr_cyc   = Fpclk / (PWM_PR+1) / 1000 * Cyc;
	mr_cyc  /= 1000;
	mr_duty  = Fpclk / (PWM_PR+1) / 1000 * H_time;
	mr_duty /= 1000;

	PWMPR	= PWM_PR;
	PWMMCR	= PWM_RESET;				// MR0
	PWMMR0	= mr_cyc;					// cycle
	/** Set PWM Pin*/
	switch (ch) {
	case 1:
		PINSEL0 = (PINSEL0&P000_CLR_BITS) | P000_FOR_PWM1;
		PWMMR1	= mr_duty;
		break;
	case 2:
		PINSEL0 = (PINSEL0&P007_CLR_BITS) | P007_FOR_PWM2;
		PWMMR2	= mr_duty;
		break;
	case 3:
		PINSEL0 = (PINSEL0&P001_CLR_BITS) | P001_FOR_PWM3;
		PWMMR3	= mr_duty;
		break;
	case 4:
		PINSEL0 = (PINSEL0&P008_CLR_BITS) | P008_FOR_PWM4;
		PWMMR4	= mr_duty;
		break;
	case 5:
		PINSEL1 = (PINSEL1&P021_CLR_BITS) | P021_FOR_PWM5;
		PWMMR5	= mr_duty;
		break;
	case 6:
		PINSEL0 = (PINSEL0&P009_CLR_BITS) | P009_FOR_PWM6;
		PWMMR6	= mr_duty;
		break;
	default:
		return;
	}
	PWMLER	= (1 << 0) | (1 << ch);		// 锁存
	PWMPCR	= 1 << (ch + 8);			// 使能对应PWM通道输出
	PWMTCR	= 0x09;						// 启动定时器, PWM使能
}

/** @func	TnPWM_Flush()
* @brief	重设PWM信号占空比
* @param	ch			PWM 通道号
*			time		PWM 高电平时间
* @Retval	void
*/
void
TnPWM_Flush(uint8 ch, uint32 time)
{
	uint32	mr;

	mr  = Fpclk / (PWM_PR+1) / 1000 * time;
	mr /= 1000;

	switch (ch) {
	case 1:
		PWMMR1	= mr;
		break;
	case 2:
		PWMMR2	= mr;
		break;
	case 3:
		PWMMR3	= mr;
		break;
	case 4:
		PWMMR4	= mr;
		break;
	case 5:
		PWMMR5	= mr;
		break;
	case 6:
		PWMMR6	= mr;
		break;
	default:
		return;
	}
	PWMLER	= 1 << ch;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -