TIME4:
● 8位向上计数的自动重载计数器;
● 3位可编程的预分配器(可在 运行中修改),提供1, 2, 4, 8, 16, 32, 64 和128 这8种分频比例。
● 中断产生
– 在计数器更新时:计数器溢出。
几个相关的寄存器;
控制寄存器1 (TIMx_CR1)
控制寄存器2 (TIMx_CR2) [注意:TIM4没有该寄存器]
事件产生寄存器(TIMx_EGR)
状态寄存器1 (TIMx_SR1)
中断使能寄存器(TIMx_IER)
自动重装载寄存器(TIMx_ARR)
预分频寄存器(TIMx_PSCR) 计数器时钟频率fCK_CNT=fCK_PSC/ 2(PSC[2:0])
计数器(TIMx_CNTR) {TIMx_CNTRL TIMx_CNTRH}
详细内容见:STM8S数据手册
8位定时器
main()
{
// 首先初始化GPIO
PD_DDR = 0x08;
PD_CR1 = 0x08; // 将PD3设置成推挽输出
PD_CR2 = 0x00;
// 然后初始化定时器4
TIM4_IER = 0x00; // 禁止中断
TIM4_EGR = 0x01; // 允许产生更新事件
TIM4_PSCR = 0x07; // 计数器时钟=主时钟/128=2MHZ/128
// 相当于计数器周期为64uS
TIM4_ARR = 255; // 设定重装载时的寄存器值,255是最大值
TIM4_CNTR = 255; // 设定计数器的初值
// 定时周期=(ARR+1)*64=16320uS
TIM4_CR1 = 0x01; // b0 = 1,允许计数器工作
// b1 = 0,允许更新
// 设置控制器,启动定时器
TIM4_IER = 0x01; // 允许更新中断
_asm("rim"); // 允许CPU全局中断
while(1) // 进入无限循环
{
}
}
@far @interrupt void TIM4_UPD_OVF_IRQHandler (void)
{
TIM4_SR1 = 0x00; // 清除更新标志
PD_ODR = PD_ODR ^ 0x08; // LED驱动信号取反
//LED闪烁频率=2MHZ/128/255/2=30.63
}
0
16位定时器:
main()
{
// 首先初始化GPIO
PD_DDR = 0x08;
PD_CR1 = 0x08; // 将PD3设置成推挽输出
PD_CR2 = 0x00;
// 然后初始化定时器4
TIM2_IER = 0x00; // 禁止中断
TIM2_EGR = 0x01; // 允许产生更新事件
TIM2_PSCR = 0x01; // 计数器时钟=主时钟/128=2MHZ/2
// 相当于计数器周期为1uS
// 设定重装时的寄存器值
// 注意必须保证先写入高8位,再写入低8位
TIM2_ARRH = 0xEA; // 设定重装载时的寄存器的高8位
TIM2_ARRL = 0x60;
TIM2_CNTRH = 0xEA; // 设定计数器的初值
TIM2_CNTRL = 0x60;
// 定时周期=1*60000=60000uS=60ms
TIM2_CR1 = 0x01; // b0 = 1,允许计数器工作
// b1 = 0,允许更新
// 设置控制器,启动定时器
TIM2_IER = 0x01; // 允许更新中断
_asm("rim"); // 允许CPU全局中断
while(1) // 进入无限循环
{
}
}
// 函数功能:定时器4的更新中断服务程序
// 输入参数:无
// 输出参数:无
// 返 回 值:无
@far @interrupt void TIM2_UPD_IRQHandler (void)
{
TIM2_SR1 = 0x00; // 清除更新标志
PD_ODR = PD_ODR ^ 0x08; // LED驱动信号取反
//LED闪烁频率=2MHZ/2/60000/2=8.3
}