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

2010-6-2 15:18 4275 8 8 分类: MCU/ 嵌入式

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


 


上次写的是用STM8单片机中的8位定时器作为软件延时,采用的是查询方式。在实际系统中,定时器的应用,更多的是采用中断方式,下面的代码就给出8位定时器在中断方式下的应用。


实验程序首先初始化驱动LED的端口,然后初始化8位的定时器4,最后启动中断允许,要记住,一定要将中断服务程序的入口地址填写到中断向量表中,并且要根据中断向量号在正确的位置上填写。


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


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


 


stm8/


 


       #include "mapping.inc"


      


;      #include "STM8S207S8.INC"


 


; 涉及到的硬件资源


; LED1定义在PD3


 


; 下面定义端口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,#$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     ; 设定计数器的初值


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


                                                                                                                                 


         LD       A,#$01          ; b0 = 1,允许计数器工作


                                         ; b1 = 0,允许更新


 


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


          LD      A,#$01          ; 允许更新中断


     LD      TIM4_IER,A      ;


          RIM                     ; 允许CPU全局中断


                                  


MAIN_LOOP.L


          JRA     MAIN_LOOP       ; 进入无限循环


 


; 下面是定时器4的中断服务程序


TIMER4_ISR.L                               


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


          LD      TIM4_SR,A                                   


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


          XOR     A,#$08


          LD      PD_ODR,A        ; LED闪烁频率=2MHZ/128/256/2=30.5


          IRET                    ; 中断返回


 


 


  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+TIMER4_ISR}                ; irq23


                                                      ; 对应的是定时器4的中断入口


               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


 


 


 


                    201061


 

文章评论0条评论)

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