这几天一直纠结于使用STM8库还是用底层寄存器写程序,用了用IAR和库的搭配,方便时肯定的,但是呢,鉴于我现在工作使用的就是STM32的单片机+STM32库,考虑再三,我还是用底层吧,这样两个就可以互补了,既不会太依赖于库,又对寄存器的操作有更深的了解。。只是都是相通的,是的,相通的。。
以下是从技术手册上粘贴的:
TIM1由一个16位的自动装载计数器组成,它由一个可编程的预分频器驱动。
本章中使用i来代表1、2、3、4,分别对应于四个不同的捕获/比较通道。
级控制定时器适用于许多不同的用途:
●基本的定时
●测量输入信号的脉冲宽度(输入捕获)
●产生输出波形(输出比较,PWM和单脉冲模式)
●对应与不同事件(捕获,比较,溢出,刹车,触发)的中断
●与TIM5/TIM6或者外部信号(外部时钟,复位信号,触发和使能信号)同步
高级控制定时器广泛的适用于各种控制应用中,包括那些需要中间对齐模式PWM的应用,该模式支持互补输出和死区时间控制。
高级控制定时器的时钟源可以是内部时钟,也可以是外部的信号,可以通过配置寄存器来进行选择。
这个定时器对我的第一印象就是想到STM32的定时器1,也是高级定时器,记得当初用32的某个单片机做的项目,要出各种互补对称的脉冲,而且还必须多少多少的死区时间。。虽然很头疼,但是还是用定时器1轻松实现。看似这个定时器和STM32的高级定时器差不多,那就肯定很强大。。
//Time1定时器
void Timer1Init(void)
{
asm("sim"); // 关全局中断
TIM1_PSCRH=0;
TIM1_PSCRL=15; //(fCK_CNT)等于fCK_PSC/( PSCR[15:0]+1)。
TIM1_ARRH=0xc3;
TIM1_ARRL=0x50;//自动装载寄存器的值
TIM1_IER=0x01;//允许更新中断
TIM1_RCR=20;//重复计数寄存器值
TIM1_CR1=0x01;//打开自动装载,打开计数器
asm("rim"); // 开全局中断
}
以上是定时器的初始化,第一句不解释。TIM1_PSCRH TIM1_PSCRL为单片机的预分频器。和STM32差不多。取值貌似都是u16. 然后是TIM1_ARRH TIM1_ARRL,自动装在寄存器的值,也就是说,一旦计数到65535,寄存器溢出并触发中断,然后定时器的计数器自动装载为此值。。原来是这样,呵呵,所有单片机都一样。。允许更新中断,定时时间到进中断,地球人都知道。。重复计数器很好,他需要溢出N次才可以进中断。。呵呵。。开自动装载,开定时器。差不多就OK了。。但是哥那个晚上调了N长时间都没调通,郁闷的要死,最后的最后的最后,终于找到了, asm("sim"); // 关全局中断 asm("rim"); // 开全局中断。。哥突然想起当初的51.。不解释。。
中断函数也粘过来吧、、、
#pragma vector=TIM1_OVR_UIF_vector
__interrupt void TIM1_OVF_IRQHandler(void)
{
static unsigned char i;
if(TIM1_SR1&0x01)
{
TIM1_SR1&=~0x01;//清除中断标志
i++;
if(i%2) PD_ODR=0x00;
else PD_ODR=0xff;
}
}
看到这个日志的同志们就偷笑吧,这个代码复制粘贴,肯定能用。。