STM8与汇编语言(8)--16位定时器应用<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
当需要更长时间的定时时,最好使用16位的定时器,STM8单片机中都提供了2到3个的16位定时器,方便用户使用。
下面的代码给出了一个采用16位定时器实现的定时中断程序,在定时中断程序中,驱动LED指示灯的闪烁。
切记,一定要将中断服务程序的入口地址填写到中断向量表中,并且要根据定时器的中断向量号在正确的位置上填写。
同样还是利用ST的开发工具,生成一个汇编程序的框架,然后修改其中的main.asm,修改后的代码如下。
编译通过后,下载到开发板,运行程序,可以看到LED在闪烁,或者用示波器可以在LED引脚上看到方波。
stm8/
#include "mapping.inc"
#include "STM8S<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />207C_S.INC"
; 涉及到的硬件资源
; LED1定义在PD3
; KEY1定义在PD7
; 定义堆栈空间的起始位置和结束位置
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 TIM2_EGR,A ; 允许产生更新事件
LD A,#$01
LD TIM2_PSCR,A ; 计数器时钟=主时钟/2=2MHZ/2
; 相当于计数器周期为1uS
; 设定重装载时的寄存器值
; 注意必须保证先写入高8位,再写入低8位
LD A,#$ea
LD TIM2_ARRH,A ; 设定重装载时的寄存器值的高8位
LD A,#$60
LD TIM2_ARRL,A ; 设定重装载时的寄存器值的低8位
LD A,#$ea
LD TIM2_CNTRH,A; 设定计数器的初值的高8位
LD A,#$60
LD TIM2_CNTRL,A; 设定计数器的初值的低8位
; 定时周期=60000*1=60mS
LD A,#$01
; b0 = 1,允许计数器工作
; b1 = 0,允许更新
LD TIM2_CR1,A ; 设置控制器,启动定时器
LD A,#$01 ; 允许更新中断
LD TIM2_IER,A
RIM ; 允许CPU全局中断
MAIN_LOOP.L
JRA MAIN_LOOP ; 进入无限循环
; 下面是定时器2的中断服务程序
Timer2_Update_ISR.L
LD A,#0 ; 清除更新标志
LD TIM2_SR1,A
LD A,PD_ODR ; 将LED驱动信号取反
XOR A,#$08
LD PD_ODR,A ; LED闪烁频率=2MHZ/2/60000/2=8.3HZ
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+Timer2_Update_ISR} ; irq13
; 对应定时器2更新中断
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-6-2
用户277890 2010-6-2 22:10