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

2010-6-2 15:22 3783 9 10 分类: MCU/ 嵌入式

                     


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


 


当需要更长时间的定时时,最好使用16位的定时器,STM8单片机中都提供了23个的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


 


                       201062


 

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户277890 2010-6-2 22:10

bu cuo
相关推荐阅读
用户1203741 2012-04-24 12:00
STM32L开发经验之一
STM32L开发经验之一   这2天在调试单位的一个电路板,电路板的核心芯片是ST公司的STM32L152,在进行系统时钟源切换时发现一个问题:当选择系统时钟源为外接振荡器HSE时,有时对...
用户1203741 2011-09-01 22:32
液晶显示器FP71G+不亮的维修
液晶显示器FP71不亮的维修 有一台液晶显示器,型号是FP71G+,开机后不亮。上网查找了一些信息,据说此款显示器出现这种现象多半都是高压有问题,而且还指出了大部分问题都出现那对三极管上(型号为570...
用户1203741 2010-09-19 16:06
算法优化的重要性
                    算法优化的重要性 前些日子,在开发一个单片机的产品时,遇到这么一个问题,就是要将一个无符号的16位数,乘以1.2288后,再赋给另一个无符号的16位数。用C语言...
用户1203741 2010-08-19 16:56
STM8的C语言编程(14)-- PWM
                STM8的C语言编程(14)-- PWM 在单片机应用系统中,也常常会用到PWM信号输出,例如电机转速的控制。现在很多高档的单片机也都集成了PWM功能模块,方便用户的应...
用户1203741 2010-08-16 10:02
STM8的C语言编程(13)-- 蜂鸣器
                 STM8的C语言编程(13)-- 蜂鸣器 蜂鸣器是现在单片机应用系统中很常见的,常用于实现报警功能。为此STM8特别集成了蜂鸣器模块,应用起来非常方便。在应用蜂鸣器模...
用户1203741 2010-08-13 09:10
STM8的C语言编程(12)-- AD转换
                                       STM8的C语言编程(12)-- AD转换 在许多的单片机应用系统中,都需要A/D转换器,将模拟量转换成数字量。在STM8...
EE直播间
更多
我要评论
1
9
关闭 站长推荐上一条 /3 下一条