?? timer.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 + -