?? timer.asm
字號:
*********************************************************************************
* UART.ASM v1.00 *
* 版權(c) 2003- 北京合眾達電子技術有限責任公司 *
* 設計者: 段立鋒 *
*********************************************************************************
.copy "vc54x.inc" ; VC5402 Memory-Mapped Register Declaration
.copy "dec5416.inc" ; SEED DEC5416 Memory-Mapped Register Declaratio
.mmregs
.global _main
.def _timer_isr
.ref IV_RESET
****************************************************************************
* I/O空間: 插2×2個等待 ? *
* 數據空間低32K: 插2×2個等待 ? *
* 數據空間高32K: 插5×2個等待 ? *
* 程序空間低512K:?插2×2個等待 ? *
* 程序空間高512K: 插5×2個等待 ? *
****************************************************************************
SWWSR_VAL .set 07492H
SWCR_VAL .set 0001H ; 等待×2
__STACK_SIZE .set 0x100 ; 堆棧長度為256字
OVLY_0 .set 005FH ; OVLY = '0'
PLLX2 .set 01007H
****************************************************************************
*串口測試參數 *
****************************************************************************
buad_9k6h .set 00H
buad_9k6l .set 09CH
buad_19k2h .set 00
buad_19k2l .set 04EH
uart_format .set 03H ;數據長度為8個,一個停止位,沒有較驗
****************************************************************************
*定時器設置參數 *
****************************************************************************
;PRD_DATA .set 07D00H ;the period of timer is 0.001s
PRD_DATA .set 06000H ;the period of timer is 0.001s
TCR_START .set 0c61H ;start the timer
***************************************************************************
*命令分類 *
***************************************************************************
TIME_SET .set 0A2H
RESET .set 0A5H
****************************************************************************
* Declare the stack. Size is determined by the linker option -stack. The *
* default value is 256 words. *
****************************************************************************
__stack: .usect ".stack",0 ; set the stack memory
*串口接收緩沖區
*緩沖區的格式:
*第一個字節:要接收的數據長度
*第二個字節以后為要接收的數據
_uarta_rec: .usect ".uarta_rbuff",128,0,0
*串口發送緩沖區
*緩沖區格式
*第一個字節為要發送數據的長度
*第二個字節以后為要發送的數據
_uarta_tra: .usect ".uarta_tbuff",128,0,0
*系統狀態緩沖區
*系統緩沖區的定義:
*第0個字節 :IO尋址緩沖;
*第一個字節:IO尋址緩沖;
*第二個字節:1秒鐘記時滿;
*第三個字節:當前小時值;
*第四個字節:當前的分鐘值;
*第五個字節:當前的秒值;
*第六個字節:接收是否出錯
*第七個字節:計數器的累加值;
_sys_statbuff: .usect ".sys_buffer",32,0,0
.text
_main:
****************************************************************************
* INIT STACK POINTER. REMEMBER STACK GROWS FROM HIGH TO LOW ADDRESSES. *
****************************************************************************
STM #__stack,SP ; set to beginning of stack memory
ADDM #(__STACK_SIZE-1),*(SP) ; add size to get to top
ANDM #0fffeh,*(SP) ; make sure it is an even address
SSBX SXM ; turn on SXM for LD #cinit,A
****************************************************************************
* 中斷向量表重定位,配置軟件等到寄存器 *
****************************************************************************
ANDM #OVLY_0,*(PMST) ; OVLY = 0
ORM #IV_RESET,*(PMST) ; 中斷向量表重定位
STM #SWWSR_VAL,SWWSR ; 配置軟件等待寄存器
STM #SWCR_VAL,SWCR
****************************************************************************
* SET UP REQUIRED VALUES IN STATUS REGISTER *
****************************************************************************
RSBX CPL ; turn on compiler mode bit
RSBX OVM ; clear overflow mode bit
RSBX INTM ; enable the interuption
STM #0,IMR ; enable the timer interuption
****************************************************************************
*設置系統時鐘為32MHz *
****************************************************************************
STM #0B,CLKMD ;switch to DIV mode
TstSatu: LDM CLKMD,B
AND #01B,B ;poll STATUS bit
BC TstSatu,BNEQ
STM #PLLX2,CLKMD ;switch to PLL X 2 mode
PllSatu: LDM CLKMD,B
AND #01B,B ;poll STATUS bit
BC PllSatu,BEQ
****************************************************************************
*系統狀態緩沖區清零 *
****************************************************************************
STM #_sys_statbuff,AR0
RPT #01FH
ST #0,*AR0+
****************************************************************************
*主程序 *
****************************************************************************
;接收主機命令
STM #_sys_statbuff,AR0;取系統狀態緩沖區的首址
ST #03E7H,*AR0(7) ;設置每秒需要的中斷次數
CALL _uart_init ;初始化串口
timer: CALL _uart_reciever ;接收數據
;是否有錯誤
LD *AR0(6),A
STM #0,AH
BC timer_err,ANEQ
;是否要設定時間
STM #_uarta_rec,AR1
LD *AR1+,A
STM #0,AH
SUB #TIME_SET,A
BC time_set,AEQ
;是否要系統復位
STM #_uarta_rec,AR1
LD *AR1,A
STM #0,AH
SUB #RESET,A
BC sys_reset,AEQ
B timer
time_set: LD *AR1+,A
STL A,*AR0(3) ;設置當前小時
LD *AR1+,A
STL A,*AR0(4) ;設置當前分鐘
LD *AR1+,A
STL A,*AR0(5) ;設置當前秒
STM #_uarta_tra,AR2
RPT #07FH
ST #0,*AR2+
CALL _timer_start
STM #8,IMR ; enable the timer interuption
NOP
NOP
NOP
B timer
sys_reset: ST #04H,*AR0
PORTW *AR0, syscntl ;打開看門狗,使系統復位
B $
timer_err: ST #0,*AR0(6)
STM #_uarta_tra,AR2 ;取發送緩沖區的首址
ST #1,*AR2(0)
ST #0FFFFH,*AR2(1)
CALL _uart_send ;通知主機接收出錯,重發
B timer
****************************************************************************
*A通路串口初始化 *
****************************************************************************
;設置波待率
_uart_init: STM #0,AH
STM #080H,AL
STL A,*AR0(0)
PORTW *AR0(0),uart_a+_lcr;將數據80寫入到lcr寄存器
NOP
NOP
NOP
STM #buad_19k2l,AL
STL A,*AR0(0)
PORTW *AR0(0),uart_a+_dll;將buad_9k6l寫入到dll寄存器
NOP
NOP
NOP
STM #buad_19k2h,AL
STL A,*AR0(0)
PORTW *AR0(0),uart_a+_dlh;將buad_9k6l寫入到dll寄存器
NOP
NOP
NOP
;設置波待率分頻數為1
; STM 0BFH,AL
; STL A,*AR0(0)
; PORTW *AR0(0),uart_a+_lcr;將0BF寫入到lcr寄存器
; STM #010,AL
; STL A,*AR0(0)
; PORTW *AR0(0),uart_a+_efr;將010寫入到efr寄存器
; STM #0,AL
; STL A,*AR0(0)
; PORTW *AR0(0),uart_a+_lcr;將0寫入到lcr寄存器
; STM #0,AL
; STL A,*AR0(0)
; PORTW *AR0(0),uart_a+_mcr;將0寫入到mcr寄存器
;設置數據格式
STM #uart_format,AL
STL A,*AR0(0)
PORTW *AR0(0),uart_a+_lcr;將0寫入到lcr寄存器
NOP
NOP
NOP
;設置串口不使用FIFO方式
STM #0,AL
STL A,*AR0(0)
PORTW *AR0(0),uart_a+_fcr;將0寫入到fcr寄存器
NOP
NOP
NOP
;開中斷,串口輸出無限制
STM #09H,AL
STL A,*AR0(0)
PORTW *AR0(0),uart_a+_fcr;將09寫入到Mcr寄存器
NOP
NOP
NOP
RET
**************************************************************************
* 串口接收子程序 *
**************************************************************************
_uart_reciever: STM #_uarta_rec,AR1
STM #0,BH
STM #04H,BL
data_rec: PORTR (uart_a + _lsr),*AR0(0);讀取接收狀態
ANDM #01H,*AR0(0) ;檢查接收是否有錯
LD *AR0(0),A
STM #0,AH
BC data_rec,AEQ ;通知主機通訊錯
PORTR (uart_a + _rhr),*AR1+ ;讀接收數據
ANDM #0ffh,*AR1(-1)
SUB #1,B
STM #0,BH
BC data_rec,BNEQ
B uart_exit
;uart_err: ST #1,*AR0(6)
uart_exit: NOP
RET
****************************************************************************
*串口的發送子程序 *
****************************************************************************
_uart_send: STM #_uarta_tra,AR2
LD *AR2+,B
STM #0,BH
uart_check: PORTR (uart_a + _lsr),*AR0(1);讀取接收狀態
ANDM #020H,*AR0(1) ;是否已發送成功
LD *AR0(1),A
STM #0,AH
BC uart_check,AEQ
LD *AR2,A
NOP
NOP
PORTW *AR2+,(uart_a + _thr) ;發送數據
NOP
NOP
NOP
SUB #1,B
BC uart_check,BNEQ
RET
****************************************************************************
*定時器操做函數 *
* 操作內容:1、初始化定時器,定時間隔為千分之一秒,運行方式,連續運行, *
* 自動重裝 *
* 2、啟動定時器
****************************************************************************
_timer_start: STM #PRD_DATA,PRD ;set the period of the Timer0
STM #PRD_DATA,TIM
STM #TCR_START,TCR ;start the timer
RET
****************************************************************************
*定時器中斷服務程序 *
****************************************************************************
_timer_isr: PSHM AL
PSHM AH
PSHM BL
PSHM BH
LD *AR0(7),A ;取出計時值
SUB #1,A
STL A,*AR0(7)
BC change_time, AEQ
B isr_exit
change_time: ST #03E7H,*AR0(7) ;1秒計時已到
LD *AR0(5),A ;取回當前秒
ADD #1,A ;當前秒加1
STL A,*AR0(5) ;保存當前秒
SUB #60,A
BC send_time,ANEQ
ST #0,*AR0(5)
ADDM #1,*AR0(4) ;分鐘加1
LD *AR0(4),A
SUB #60,A
BC send_time,ANEQ
ST #0,*AR0(4)
ADDM #1,*AR0(3) ;小時加1
LD *AR0(3),A
SUB #24,A
BC send_time,ANEQ
ST #0,*AR0(3) ;小時復位
send_time: STM #_uarta_tra,AR2 ;將時間數據放入發送緩沖區
ST #04H,*AR2+ ;數據長度
ST #0A3H,*AR2+ ;類型
LD *AR0(3),A
STL A,*AR2+ ;送數據
LD *AR0(4),A
STL A,*AR2+
LD *AR0(5),A
STL A,*AR2+
CALL _uart_send ;發送數據
isr_exit: POPM BH
POPM BL
POPM AH
POPM AL
POPM ST1
POPM ST0
RETE
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -