历史上的今天
今天是:2024年10月11日(星期五)
2021年10月11日 | 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
史海拾趣
|
招聘熟”红外框”(触摸屏)的电子工程师 我公司想招一个电子工程师,要求:对”红外手写” (也叫触摸屏)非常熟悉的,专职和兼职都可以.工作地点:杭州.(也可在深圳),薪金优 ,有意者可联系我,或把简历发至公司邮箱:bearbear-bear@163.com电话:0755-82132 ...… 查看全部问答> |
|
利用深圳欧恩光电技术研究所的光照传感器po188,在手机上可以实现以下功能: 1.节能(键盘感应) 在正常使用手机的情况下,白天可以自动关闭键盘背光灯,晚上则可自动开启,起到节能作用; 2.智能感光(LCD感应) 感应环境光线强弱,自动调节LCD屏亮度等级 ...… 查看全部问答> |
|
最近一家公司要求我把我原来在MOBILE的程序移植到他们的设备上,现主要是这三个方面不大清楚怎么移植,没做过wince5.0,不知是否要向他们要除了设备之外的材料?怎么实现… 查看全部问答> |
|
用evc编的托盘程序,当鼠标移动到图标上时,无法显示提示信息,请高手帮忙...... static NOTIFYICONDATA nid; nid.uFlags=0; nid.cbSize=sizeof(NOTIFYICONDATA); nid.hWnd=hwnd; nid.uID=IDI_APPICON; nid.hIcon=LoadIcon(hInstance,MA ...… 查看全部问答> |
|
在高压危险场所,为提高操作人员的人身安全,使用隔空测量数据是非常需要的,因此采用蓝牙通信系统实现了对远离危险场所进行测量和记录所需数据。本系统使用超低功耗性能优秀的MSP430系列单片机作为核心控制器件,由蓝牙PDA接收信号并对其进行相应 ...… 查看全部问答> |




