你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 4852|回复: 1

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

[复制链接]

10

主题

10

回帖

0

蝴蝶豆

新手上路

最后登录
2019-8-1
发表于 2011-3-23 23:47:15 | 显示全部楼层 |阅读模式
  
 
上次写的是用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
<
回复

使用道具 举报

91

主题

4603

回帖

4

蝴蝶豆

论坛元老

最后登录
2020-12-8
发表于 2017-6-29 15:44:53 | 显示全部楼层
定时器的代码确实比较难写
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版