上次寫的是用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
; 定義堆??臻g的起始位置和結束位置
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
上一篇:STM8與匯編語言(6)--8位定時器應用之一
下一篇:STM8與匯編語言(8)--16位定時器應用
推薦閱讀最新更新時間:2025-04-23 21:49







設計資源 培訓 開發板 精華推薦
- LTC1727ES8-2.5 單電源監視器與其他禁用的典型應用
- LTM4620IY 5 至 16Vin、1.5V 和 1.2V 輸出 DC/DC 穩壓器的典型應用電路
- 使用 ON Semiconductor 的 LV57331TT 的參考設計
- 使用 Analog Devices 的 LTC6905CS5-100 的參考設計
- LT1768CGN 演示板,具有超寬多模調光范圍的高功率雙路 CCFL 電源
- 使用 ROHM Semiconductor 的 BU4341 的參考設計
- 帶模塊數據采集系統的 Bank 隔離、2 通道、16 位、500 kSPS、同時采樣信號鏈
- LT6656ACDC-1.25、1.25V 升壓輸出電流電壓基準的典型應用
- LT3486EFE 演示板,具有 PWM 調光功能的雙路 1.3A 白光 LED 升壓轉換器
- 半導體散熱器——基于CH224K的PD誘騙模塊