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

发布者:温暖心情最新更新时间:2021-10-11 来源: eefocus关键字: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

[1] [2]
关键字:STM8  汇编语言  8位定时器 引用地址:STM8与汇编语言(7)--8位定时器应用之二

上一篇:STM8与汇编语言(6)--8位定时器应用之一
下一篇:STM8与汇编语言(8)--16位定时器应用

推荐阅读最新更新时间:2024-11-13 17:32

用C语言和ARM汇编语言设置SDRAM的惯用方法
用C语言设置SDRAM的惯用方法 /* SDRAM regisers */ #define MEM_CTL_BASE 0x48000000 // BWSCON的地址 #define SDRAM_BASE 0x30000000 // SDRAM的起始地址 /* SDRAM 13个寄存器的值 */ /* 定义了一个数组,把13个寄存器的设置值存到一个数组里面 */ unsigned long const mem_cfg_val ={ // 注意unsigned long const 的含义 0x22111110, //BWSCON
[单片机]
IAR for stm8使用标准固件库的方法以及注意事项
标准库其实挺方便的。有了一个模板之后,如果改参数,根本就不需要再去查手册,重新定义寄存器值了。 第一部分,stm8标准库介绍。 stm8的标准库名称代码是stsw-stm8069,根据这个代码就可以到st的官网上下载到最新的固件库。 解压固件库后,有几个文件夹,我这里只是简单的说明各文件夹和文件的作用,具体的说明参考文件包中的chm帮助文档。 Libraries是驱动文件夹,里面的inc文件夹是h文件,src文件夹是c文件,这是最关键的东西。 Utilities是stm自己提供的EVAL开发板程序,如果没用这个EVAL开发板可以无视,有也可以无视,反正就很简单的一个led程序 Project文件夹是工程模板文件,里面有两个重
[单片机]
单片机汇编语言程序设计
1、汇编语言源程序的格式 1.内部数据传送指令 汇编语言是面向机器的,因此,语言格式因机器不同而异。对MCS-51系统来说,汇编语言中每条语句的格式包括下列4项内容: 标号: 操作码 操作数; 注释 汇编语句中,标号和操作码要用冒号 : 隔开;操作码和操作数之间的分隔符是空格,多个操作数之间用 , 分隔;操作数与注释之间用 ; 分隔;操作码是必选项,其余都是可选项,即任何语句都必须包含操作码,其他部分因语句不同而异。 1.ORG伪指令 ORG伪指令称为起始汇编伪指令,一般用于汇编语言源程序或某数据块的开头,格式为: :ORG 16位的地址或标号 2.END伪指令 END伪指令称为汇编结束伪指令,经常用在
[单片机]
单片机<font color='red'>汇编语言</font>程序设计
STM8学习笔记——定时器定时功能和中断相关
定时器都差不多,无非就是计数,溢出了标志置位,如果中断允许的话产生一个中断。说到中断,STM8S105的中断向量表如下 时基单元: 在选用内部时钟的情况下,CK_PSC是由fmaster提供的,经过定时器预分频器分频产生CK_CNT时钟,然后作为一次计数的时基,举个例子,16M的内部RC,经过16分频,则CK_CNT为1M,那么定时1ms只需计数1000次。 计数模式: 共有三种:向上,向下,中央对齐 以向上计数为例:计数器从0计数到用户定义的比较值(TIMx_ARR寄存器的值),然后重新从0开始计数并产生一个计数器溢出事件,同时,如果TIM1_CR1寄存器的UDIS位是0,将会产生一个更新事件(U
[单片机]
玩转单片机STM8(二)
现在学习STM8,由于ST已经提供标准驱动库函数,对C语言能力要求已经很弱了,只要上过大学C语言课程,都可以进行编程。 但是我建议大家把C语言学深点。它的核心就是指针,玩转指针,就玩懂了C语言。它的其他功能和其他语言没有任何差别。只是逻辑控制而已。能把C的指针真正弄懂,你还不得不学习一下机器语言,万变不离其宗。见多识广,千万不要怀疑自己大脑的记忆能力,也不要认为多学会学混,我的经验是,学得越多,只会让你你看得更明白。 STM8系统的机器指令的长度是8位的。固定长度,你可以大致看看每个Bit是什么意思。这都是工程师精确设计的,也是人设计的。别人能做到的,你为什么不行?多问问自己。 机器指令的介绍,一定会花大篇幅介绍寻址。
[单片机]
IAR embedded Workbench for STM8 **教程
IAR for STM8 3.10**版全名IAR Embedded Workbench for STM8,IAR for STM8是一款即嵌入式工作平台,在有些地方也会看见IAR EWARM,IAR Stm8 主要用于ARM处理器的软件开发,是一款来自IAR官网的一种集成开发环境,支持市面上所有的STM8系列芯片,有一百多种之多没闪电吧小编这里整理了IAR for STM8 3.10完整安装包和补丁授权文件,另外还为大家带来了详细的图文教程! 安装**教程 1.本站下载压缩包,解压后获得安装包和补丁,双击安装包EWSTM8-3104-Autorun.exe安装 2.点第一项IAR Embedded Workbench for
[单片机]
IAR embedded Workbench for <font color='red'>STM8</font> **教程
stm8时钟切换
STM8的时钟系统相较于STM32,没有那么复杂,从时钟树上可以看到全貌,如图 主时钟源可以选择4种时钟源:HSE(1-24MHZ)、HSI(16M)、LSI(128K)和最大24M的外部高速时钟。 系统复位后,默认使用HSI的8分频作为主时钟,因为HSI稳定的时间较短,8分频可保证系统在较差的VDD条件下安全启动。 现在将HSI时钟切换到HSE void Sys_clk_Init() //使用外部16M晶振 { //CLK_ICKR |= 0x00; //开启HSI CLK_ECKR |= 0X01; //开启HSE while(!(CLK_ECKR
[单片机]
<font color='red'>stm8</font>时钟切换
STM8学习总结三:TIM1定时器使用
本文主要总结关于STM8在库函数开发时,各条语句的含义。 (1)TIM1初始化配置函数 函数主要作用:对计数器的参数,工作模式进行设定,并使能; void Tim1_Init(void) { TIM1_TimeBaseInit(16,TIM1_COUNTERMODE_UP,1000,0); //(定时器频率:16分频即系统频率的1/16,为1M,向上计数,定时器溢出值,重装载计数从0开始) TIM1_ITConfig(TIM1_IT_UPDATE , ENABLE);//中断配置与使能函数 TIM1_ARRPreloadConfig(ENABLE);//使能数值自动重装载功能 TIM1_Cmd(ENA
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved