henai521 发表于 2011-3-23 23:47:15

【ST公益分享】STM8-8位定时器应用之二

  
 
上次写的是用STM8单片机中的8位定时器作为软件延时,采用的是查询方式。在实际系统中,定时器的应用,更多的是采用中断方式,下面的代码就给出8位定时器在中断方式下的应用。
实验程序首先初始化驱动LED的端口,然后初始化8位的定时器4,最后启动中断允许,要记住,一定要将中断服务程序的入口地址填写到中断向量表中,并且要根据中断向量号在正确的位置上填写。
同样还是利用ST的开发工具,生成一个汇编程序的框架,然后修改其中的main.asm,修改后的代码如下。
编译通过后,下载到开发板,运行程序,可以看到LED在闪烁,或者用示波器可以在LED引脚上看到方波。
 
stm8/
 
       #include "mapping.inc"
      
;      #include "STM8S207S8.INC"
 
; 涉及到的硬件资源
; LED1定义在PD3
 
; 下面定义端口D的寄存器地址
PD_ODR   EQU    $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

feixiang20 发表于 2017-6-29 15:44:53

定时器的代码确实比较难写
页: [1]
查看完整版本: 【ST公益分享】STM8-8位定时器应用之二