梁的笔记 https://bbs.21ic.com/?793936 [收藏] [复制] [RSS] 相信奇迹

日志

STM8S学习笔记之四(STM8 time1)

已有 1204 次阅读2013-3-31 07:54 |个人分类:STM8S学习笔记|系统分类:单片机| stm8, 单片机, 学习笔记

        这几天一直纠结于使用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;
            }
        }


      看到这个日志的同志们就偷笑吧,这个代码复制粘贴,肯定能用。。



路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)