STM8單片機中的外設(shè)資源是比較豐富的,定時器有8位的也有16位的,下面的實驗程序,就是利用8位定時器4來進行延時,然后驅(qū)動LED閃爍。
同樣還是利用ST的開發(fā)工具,生成一個匯編程序的框架,然后修改其中的main.asm,修改后的代碼如下。
編譯通過后,下載到開發(fā)板,運行程序,可以看到LED在閃爍,或者用示波器可以在LED引腳上看到方波。
在這里要特別提醒的是,從ST給的手冊上看,這個定時器中的計數(shù)器是一個加1計數(shù)器,但本人在實驗過程中感覺不太對,經(jīng)過反復的實驗,我認為應(yīng)該是一個減1計數(shù)器(也許是我拿的手冊不對,或許是理解上有誤)。例如,當給定時器中的自動裝載寄存器裝入255時,產(chǎn)生的方波頻率最小,就象下面代碼中計算的那樣,產(chǎn)生的方波頻率為30HZ左右。若初始化時給自動裝載寄存器裝入1,則產(chǎn)生的方波頻率最大,大約為3.9K左右。也就是說實際的分頻數(shù)為ARR寄存器的值+1。
stm8/
#include "mapping.inc"
; #include "STM8S207S8.INC"
; 涉及到的硬件資源
; 下面定義端口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
; 定義堆棧空間的起始位置和結(jié)束位置
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設(shè)置成推挽輸出
; PD7設(shè)置成懸浮輸入
LD A,#08
LD PD_DDR,A ; 將PD3設(shè)置成輸出,PD7設(shè)置成輸入
LD A,#08
LD PD_CR1,A ; 將PD3設(shè)置成推挽輸出
LD A,#00
LD PD_CR2,A ;
;
; 下面初始化定時器4
LD A,#$00
LD TIM4_IER,A ; 禁止中斷
LD A,#$01
LD TIM4_EGR,A ; 允許產(chǎn)生更新事件
LD A,#$07
LD TIM4_PSCR,A ; 計數(shù)器時鐘=主時鐘/128=2MHZ/128
; 相當于計數(shù)器周期為64uS
LD A,#255
LD TIM4_ARR,A ; 設(shè)定重裝載時的寄存器值,255是最大值
LD A,#255
LD TIM4_CNTR,A ; 設(shè)定計數(shù)器的初值
; 定時周期=(ARR+1)*64=16384uS
; 產(chǎn)生方波頻率=30.5HZ
;
LD A,#$01
; b0 = 1,允許計數(shù)器工作
; b1 = 0,允許更新
LD TIM4_CR1,A ; 設(shè)置控制器,啟動定時器
MAIN_LOOP.L
LD A,TIM4_SR ; 讀入定時器4的狀態(tài)
AND A,#01 ; 判斷是否產(chǎn)生更新標志
JREQ MAIN_LOOP ; 若沒有,則等待
LD A,#0 ; 清除更新標志
LD TIM4_SR,A
LD A,PD_ODR ; 將LED驅(qū)動信號取反
XOR A,#$08
LD PD_ODR,A ; LED閃爍頻率=2MHZ/128/255/2=30.63
JRA MAIN_LOOP ; 無限循環(huán)
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
上一篇:STM8與匯編語言(5)
下一篇:STM8與匯編語言(7)--8位定時器應(yīng)用之二
推薦閱讀最新更新時間:2025-04-23 21:49







設(shè)計資源 培訓 開發(fā)板 精華推薦
- 英飛凌微控制器:以全新實惠套件和強大開發(fā)環(huán)境為開發(fā)者提供支持
- iTOP-i.MX6開發(fā)板設(shè)備數(shù)驅(qū)動Menuconfig的用法
- 迅為IMX6ULL開發(fā)板Qt for Android搭建開發(fā)環(huán)境
- 迅為i.MX8M mini開發(fā)板Windots QT系統(tǒng)開發(fā)環(huán)境搭建
- 迅為IMX8MM開發(fā)板Yocto系統(tǒng)使用Gstarwmra(一)
- 迅為IMX8M mini開發(fā)板Linix系統(tǒng)修改默認屏幕
- iTOP-4412開發(fā)板支持4G以上文件系統(tǒng)擴展
- 迅為IMX8MM開發(fā)板Yocto系統(tǒng)設(shè)置開機自啟動
- 迅為IMX6Q開發(fā)板 Buildroot文件系統(tǒng)mqtt測試
- 使用 Analog Devices 的 AD7303BRMZ 的參考設(shè)計
- 使用 ON Semiconductor 的 ML4812 的參考設(shè)計
- TWR-K24F120M: Kinetis? K24 120 MHz MCU Tower? System Module
- SC4216 極低輸入/極低壓差 3 安培穩(wěn)壓器的典型應(yīng)用
- LT3685EMSE2A 演示板,具有 SYNC 功能的 38V 降壓型開關(guān)穩(wěn)壓器
- STEVAL-ISA189V1,基于 A6986F5V 38V、1.5A 同步降壓開關(guān)穩(wěn)壓器的評估板
- LT1372CN8 低紋波 5V 至 -3V Cuk 轉(zhuǎn)換器的典型應(yīng)用
- 【涂鴉智能】寵物喂食器
- 用于 CC2530 ZigBee 無線 MCU 的電源和電池管理參考設(shè)計
- 使用 ROHM Semiconductor 的 BU4930 的參考設(shè)計
- 強強聯(lián)合再進階!理想AD Pro輔助駕駛正式升級搭載地平線征程6M
- 英特爾與黑芝麻智能簽署合作備忘錄,聯(lián)合發(fā)布艙駕融合平臺
- 英特爾與面壁智能宣布建立戰(zhàn)略合作伙伴關(guān)系,共同研發(fā)端側(cè)原生智能座艙
- 芯馳科技發(fā)布X10,打造全民AI時代座艙處理器新標桿
- 精準適配,輕裝全能!芯馳發(fā)布E3系列高端智控MCU三大應(yīng)用場景
- 場景定義、精準創(chuàng)「芯」,芯馳全新發(fā)布AI座艙處理器和高端智控系列
- Arm 技術(shù)加持,地平線以 HSD 及征程 6P 推動汽車智能化變革
- 華為自動駕駛技術(shù)解讀
- 加速電動化轉(zhuǎn)型,邦迪汽車系統(tǒng)攜多款創(chuàng)新產(chǎn)品首秀2025上海車展
- 數(shù)據(jù)中心面臨電力約束挑戰(zhàn),推動GenAI終端發(fā)展