溢出中断
void TIM_Init(void)
{
TSCR1_TEN = 1;
TSCR1_TFFCA = 1;
// 定时器溢出中断使能, 0:关闭溢出中断,1:使能溢出中断
TSCR2_TOI = 1;
// 定时器溢出触发TFLG2_TOF中断,中断处理函数TFLG2_TOF=1清除TOF中断;
TSCR2_PR = 4; //8MHZ/16 2us
TSCR1_PRNT = 0; //精确定时器选择,0:使用传统定时器(TSCR2[2:0]作为预分频), 1:使用精确定时器,PTPSR中的所有位都作为预分频选择;
TIE = 0x00; // 定时器中断使能, 0:IC/OC相应通道中断禁止,1:IC/OC相应通道中
TCTL1 = 0x00;
TCTL2 = 0x00;
TCTL3 = 0x00;
TCTL4 = 0x00;
TFLG1 = 0xFF;
TFLG2 = 0xFF;
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt VectorNumber_Vtimovf void overflow(void)
{
if(TFLG2_TOF ==1)
{
TFLG2_TOF = 1; //清除TOF标志
TCNT = 15535; // 从TCNT开始进行计算,直到65535溢出,触发中断。 2*500 = 1ms 100 = 2*500 00 计数值为:65535 - 50000 = 15535
PTP ^= 0XFF;
}
}
#pragma CODE_SEG DEFAULT
延迟函数
/************************************************************/
/* 初始化TIM模块:产生周期性中断 */
/************************************************************/
void TIM_INIT (void)
{
TSCR1_TFFCA = 1; //快速清空标志位
TSCR1_TEN = 1; // 定时器使能控制,0:关闭主定时器,包括计数器; 1:允许定时器正常工作;
TIOS = 0xff; // 输入捕获/输出比较选择 IOSx=0, 输入捕获,IOSx=1, 输出比较;
TCTL1 = 0x00; // 后四个通道设置为定时器与输出引脚断开,即禁止比较
TCTL2 = 0x00; // 前四个通道设置为定时器与输出引脚断开,即禁止比较
TIE = 0x00; // 禁止所有通道定时中断 采用的定时器溢出中断所以不需要引脚,只有在输入捕获的时候才会用到
TSCR2 = 0x06; // 预分频系数pr2-pr0:110,预分频系数为64,定时器时钟周期为8us 1/(8mhz/64)*1000 000
TFLG1 = 0xff; // 清除各IC/OC中断标志位
TFLG2 = 0xff; // 清除自由定时器中断标志位
}
/*************************************************************/
/* 延时函数 */
/*************************************************************/
void delay1ms (unsigned int n)
{
unsigned int i;
for (i=0;i<n;i++)
{
TFLG1_C0F = 1; // 清除标志位
TC0 = TCNT+125; // 设置输出比较时间为1ms TCNT 的值在这儿无需更改,原因是,周期计数从0到65535 ,一个周期时间为你设置的8us。执行125次才为1ms。
while (TFLG1_C0F == 0); // 等待COF位为1,即等待输出比较通道已发生输出比较事件
}
}
寄存器
不想写
可以看看这个大佬写的定时器 包括溢出触发 脉冲触发 输入捕获触发 输出比较。真的好NB啊。
https://blog.youkuaiyun.com/songyulong8888/article/details/113122516
原创不易多多支持 ,有错请各位大佬指正