上次写的是用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 |
定时器的代码确实比较难写 |
从零开始操作STM8寄存器(风驰iCreate奉献)
【中文资料】初学STM8库函数的中文帮助软件
绝对经典的中文STM8学习手册,淘宝上学习板资料,友情大放送!
【原创教程】风驰iCreate独家开源STM8 27个例程和10多万字的pdf教程
STM8的LCD1602 4线驱动,为什么不工作
【精华资料】由零开始开发STM8
STM8S 的触摸库是如何在主程序中查询键的呢、
【精华资料】STM8的C语言编程1-14讲完整版
【精品教程】STM8系列单片机入门教程系列
STM8 第一次进中断不准【悬赏问答】