单片机
返回首页

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

2021-10-11 来源:eefocus

上次写的是用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

             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

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 红外线探测报警器

  • 短波AM发射器电路设计图

  • RS-485基础知识:处理空闲总线条件的两种常见方法

  • 如何调制IC555振荡器

  • 基于ICL296的大电流开关稳压器电源电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章