原创 STM8与汇编语言(6)--8位定时器应用之一

2010-5-31 17:15 3234 8 8 分类: MCU/ 嵌入式

                     


                 STM8与汇编语言(6)--8位定时器应用之一<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


 


STM8单片机中的外设资源是比较丰富的,定时器有8位的也有16位的,下面的实验程序,就是利用8位定时器4来进行延时,然后驱动LED闪烁。


同样还是利用ST的开发工具,生成一个汇编程序的框架,然后修改其中的main.asm,修改后的代码如下。


编译通过后,下载到开发板,运行程序,可以看到LED在闪烁,或者用示波器可以在LED引脚上看到方波。


在这里要特别提醒的是,从ST给的手册上看,这个定时器中的计数器是一个加1计数器,但本人在实验过程中感觉不太对,经过反复的实验,我认为应该是一个减1计数器(也许是我拿的手册不对,或许是理解上有误)。例如,当给定时器中的自动装载寄存器装入255时,产生的方波频率最小,就象下面代码中计算的那样,产生的方波频率为30HZ左右。若初始化时给自动装载寄存器装入1,则产生的方波频率最大,大约为3.9K左右。也就是说实际的分频数为ARR寄存器的值+1


 


stm8/


 


       #include "mapping.inc"


      


;      #include "STM8S207S8.INC"


 


; 涉及到的硬件资源


; 下面定义端口D的寄存器地址


PD_ODR   EQU    $<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />500f                  


PD_IDR   EQU    $5010


PD_DDR   EQU    $5011


PD_CR1   EQU    $5012


PD_CR2   EQU    $5013


 


; 定时器4的寄存器定义


TIM4_CR1   EQU    $5340


TIM4_IER   EQU    $5341


TIM4_SR    EQU    $5342


TIM4_EGR   EQU    $5343


TIM4_CNTR  EQU    $5344


TIM4_PSCR  EQU    $5345


TIM4_ARR   EQU    $5346


 


; 定义堆栈空间的起始位置和结束位置


stack_start.w  EQU    $stack_segment_start


stack_end.w    EQU    $stack_segment_end


 


 


               segment 'rom'          ; 下面开始定义一个段,该段位于ROM


main.l                            ; 定义复位后的第一条指令的标号(即入口地址)


;


; 首先要初始化堆栈指针


               LDW     X,#stack_end         


               LDW     SP,X


 


; 下面初始化IO端口


; PD3设置成推挽输出


; PD7设置成悬浮输入


          LD      A,#08


         LD      PD_DDR,A     ; PD3设置成输出,PD7设置成输入


          LD      A,#08


             LD      PD_CR1,A      ; PD3设置成推挽输出


          LD      A,#00


                LD      PD_CR2,A              ;


;


; 下面初始化定时器4                            


          LD      A,#$00


           LD      TIM4_IER,A       ; 禁止中断


          LD      A,#$01      


          LD      TIM4_EGR,A       ; 允许产生更新事件


                LD      A,#$07


                LD      TIM4_PSCR,A       ; 计数器时钟=主时钟/128=2MHZ/128


                                                     ; 相当于计数器周期为64uS


                LD      A,#255


                LD      TIM4_ARR,A        ; 设定重装载时的寄存器值,255是最大值


                LD      A,#255


                LD      TIM4_CNTR,A       ; 设定计数器的初值


                                                      ; 定时周期=(ARR+1)*64=16384uS


                                       ; 产生方波频率=30.5HZ


                                                                                                                                            ;


LD      A,#$01


                                            ; b0 = 1,允许计数器工作


; b1 = 0,允许更新


LD      TIM4_CR1,A       ; 设置控制器,启动定时器


MAIN_LOOP.L


              LD      A,TIM4_SR           ; 读入定时器4的状态


              AND     A,#01               ; 判断是否产生更新标志


              JREQ    MAIN_LOOP         ; 若没有,则等待


        LD      A,#0                  ; 清除更新标志


        LD      TIM4_SR,A                                


                                  


       LD      A,PD_ODR              ; LED驱动信号取反


       XOR     A,#$08


       LD      PD_ODR,A              ; LED闪烁频率=2MHZ/128/255/2=30.63


    JRA     MAIN_LOOP             ; 无限循环


 


 


  interrupt NonHandledInterrupt


NonHandledInterrupt.l


       iret


 


; 下面定义中断向量表      


               segment 'vectit'


               dc.l {$82000000+main}                                                               ; reset


               dc.l {$82000000+NonHandledInterrupt}    ; trap


               dc.l {$82000000+NonHandledInterrupt}    ; irq0


               dc.l {$82000000+NonHandledInterrupt}    ; irq1


               dc.l {$82000000+NonHandledInterrupt}    ; irq2


               dc.l {$82000000+NonHandledInterrupt}    ; irq3


               dc.l {$82000000+NonHandledInterrupt}    ; irq4


                     dc.l {$82000000+NonHandledInterrupt}    ; irq5


               dc.l {$82000000+NonHandledInterrupt}    ; irq6


               dc.l {$82000000+NonHandledInterrupt}    ; irq7


               dc.l {$82000000+NonHandledInterrupt}    ; irq8


               dc.l {$82000000+NonHandledInterrupt}    ; irq9


               dc.l {$82000000+NonHandledInterrupt}    ; irq10


               dc.l {$82000000+NonHandledInterrupt}    ; irq11


               dc.l {$82000000+NonHandledInterrupt}    ; irq12


               dc.l {$82000000+NonHandledInterrupt}    ; irq13


               dc.l {$82000000+NonHandledInterrupt}    ; irq14


               dc.l {$82000000+NonHandledInterrupt}    ; irq15


               dc.l {$82000000+NonHandledInterrupt}    ; irq16


               dc.l {$82000000+NonHandledInterrupt}    ; irq17


               dc.l {$82000000+NonHandledInterrupt}    ; irq18


               dc.l {$82000000+NonHandledInterrupt}    ; irq19


               dc.l {$82000000+NonHandledInterrupt}    ; irq20


               dc.l {$82000000+NonHandledInterrupt}    ; irq21


               dc.l {$82000000+NonHandledInterrupt}    ; irq22


               dc.l {$82000000+NonHandledInterrupt}    ; irq23


               dc.l {$82000000+NonHandledInterrupt}    ; irq24


               dc.l {$82000000+NonHandledInterrupt}    ; irq25


               dc.l {$82000000+NonHandledInterrupt}    ; irq26


               dc.l {$82000000+NonHandledInterrupt}    ; irq27


               dc.l {$82000000+NonHandledInterrupt}    ; irq28


                     dc.l {$82000000+NonHandledInterrupt}    ; irq29


 


       end


 


                                    2010-5-31


 

文章评论0条评论)

登录后参与讨论
我要评论
0
8
关闭 站长推荐上一条 /2 下一条