Assembly 看门狗中断在汇编中如何工作
我试图解释下面TI MSP 430的汇编代码。当我在我的调试器中一步一步地通过这些行时,子例程“beep02”继续循环一段时间,我不知道它的起源,然后它突然跳入“WDT_ISR”子例程 我的假设是,看门狗中断服务在“狗吠”时被调用,将从循环中正常运行的代码中获取程序,并在WDT_ISR中前进。这是正确的吗Assembly 看门狗中断在汇编中如何工作,assembly,watchdog,Assembly,Watchdog,我试图解释下面TI MSP 430的汇编代码。当我在我的调试器中一步一步地通过这些行时,子例程“beep02”继续循环一段时间,我不知道它的起源,然后它突然跳入“WDT_ISR”子例程 我的假设是,看门狗中断服务在“狗吠”时被调用,将从循环中正常运行的代码中获取程序,并在WDT_ISR中前进。这是正确的吗 .title "morse.asm" ;*******************************************************************
.title "morse.asm"
;*******************************************************************************
; Project: morse.asm
; Author: Spencer Gardner
;
; Description: Outputs a message in Morse Code using a LED and a transducer
; (speaker). The watchdog is configured as an interval timer.
; The watchdog interrupt service routine (ISR) toggles the green
; LED every second and pulse width modulates (PWM) the speaker
; such that a tone is produced.
;
; Revisions:
;
; RBX430-1 eZ430 Rev C
; OPTION A OPTION B
; .------------. .------------.
; SW1-->|P1.0^ P3.0|-->LCD_A0 (RED) LED<--|P1.0 P3.0|-->LCD_RST
; SW2-->|P1.1^ P3.1|<->SDA (GREEN) LED<--|P1.1 P3.1|<->SDA
; SW3-->|P1.2^ P3.2|-->SCL NC-->|P1.2 P3.2|-->SCL
; SW4-->|P1.3^ P3.3|-->LCD_RW NC-->|P1.3 P3.3|-->LED_3 (Y)
; INT1-->|P1.4 P3.4|-->LED_5 (GREEN) NC-->|P1.4 P3.4|<--NC
; INTA-->|P1.5 P3.5|<--RX NC-->|P1.5 P3.5|<--NC
; SVO1<--|P1.6 P3.6|<--RPOT NC-->|P1.6 P3.6|<--NC
; SVO2<--|P1.7 P3.7|<--LPOT NC-->|P1.7 P3.7|<--NC
; | | | |
; LCD_D0<->|P2.0 P4.0|-->LED_1 (G) SW_1-->|P2.0^ P4.0|<--NC
; LCD_D1<->|P2.1 P4.1|-->LED_2 (O) SW_2-->|P2.1^ P4.1|<--NC
; LCD_D2<->|P2.2 P4.2|-->LED_3 (Y) SW_3-->|P2.2^ P4.2|<--NC
; LCD_D3<->|P2.3 P4.3|-->LED_4 (R) SW_4-->|P2.3^ P4.3|<--RPOT
; LCD_D4<->|P2.4 P4.4|-->LCD_BL LCD_BL<--|P2.4 P4.4|<--LPOT
; LCD_D5<->|P2.5 P4.5|-->SPEAKER NC-->|P2.5 P4.5|-->SPEAKER
; LCD_D6<->|P2.6 P4.6|-->LED_6 (RED) (G) LED_1<--|P2.6 P4.6|-->LED_4 (R)
; LCD_D7<->|P2.7 P4.7|-->LCD_E (O) LED_2<--|P2.7 P4.7|<--NC
; .------------. .------------.
;
;*******************************************************************************
.cdecls C,LIST,"msp430.h" ; include c header
;------------------------------------------------------------------------------
; System equates
myCLOCK .equ 1200000 ; 1.2 Mhz clock
WDT_CTL .equ WDT_MDLY_0_5 ; WD configuration (Timer, SMCLK, 0.5 ms)
WDT_CPI .equ 500 ; WDT Clocks Per Interrupt (@1 Mhz)
WDT_IPS .equ myCLOCK/WDT_CPI ; WDT Interrupts Per Second
STACK .equ 0x0600 ; top of stack
;------------------------------------------------------------------------------
; External references
.ref numbers ; codes for 0-9
.ref letters ; codes for A-Z
; numbers--->N0$--->DASH,DASH,DASH,DASH,DASH,END ; 0
; N1$--->DOT,DASH,DASH,DASH,DASH,END ; 1
; ...
; N9$--->DASH,DASH,DASH,DASH,DOT,END ; 9
;
; letters--->A$---->DOT,DASH,END ; A
; B$---->DASH,DOT,DOT,DOT,END ; B
; ...
; Z$---->DASH,DASH,DOT,DOT,END ; Z
; Morse code is composed of dashes and dots, or phonetically, "dits" and "dahs".
; There is no symbol for a space in Morse, though there are rules when writing them.
; 1. One dash is equal to three dots
; 2. The space between parts of the letter is equal to one dot
; 3. The space between two letters is equal to three dots
; 4. The space between two words is equal to seven dots.
; 5 WPM = 60 sec / (5 * 50) elements = 240 milliseconds per element.
; element = (WDT_IPS * 6 / WPM) / 5
; Morse Code equates
ELEMENT .equ WDT_IPS*240/1000
;------------------------------------------------------------------------------
; Global variables ; RAM section
.bss beep_cnt,2 ; beeper flag
.bss delay_cnt,2 ; delay flag
;------------------------------------------------------------------------------
; Program section
.text ; program section
message: .string "HELLO CS 124 WORLD" ; PARIS message
.byte 0
.align 2 ; align on word boundary
RESET: mov.w #STACK,SP ; initialize stack pointer
mov.w #WDT_CTL,&WDTCTL ; set WD timer interval
mov.b #WDTIE,&IE1 ; enable WDT interrupt
bis.b #0x20,&P4DIR ; set P4.5 as output (speaker)
clr.w beep_cnt ; clear counters
clr.w delay_cnt
bis.w #GIE,SR ; enable interrupts
; output 'A' in morse code
loop: mov.w #ELEMENT,r15 ; output DOT
call #beep
mov.w #ELEMENT,r15 ; delay 1 element
call #delay
mov.w #ELEMENT*3,r15 ; output DASH
call #beep
mov.w #ELEMENT,r15 ; delay 1 element
call #delay
mov.w #ELEMENT*3,r15 ; output DASH
call #beep
mov.w #ELEMENT,r15 ; delay 1 element
call #delay
mov.w #ELEMENT*7,r15 ; output space
call #delay ; delay
jmp loop ; repeat
; beep r15 ticks of the watchdog timer
beep: mov.w r15,beep_cnt ; start beep
beep02: tst.w beep_cnt ; beep finished?
jne beep02 ; n
ret ; y
; delay r15 ticks of the watchdog timer
delay: mov.w r15,delay_cnt ; start delay
delay02: tst.w delay_cnt ; delay done?
jne delay02 ; n
ret ; y
;------------------------------------------------------------------------------
; Watchdog Timer interrupt service routine
;
WDT_ISR: tst.w beep_cnt ; beep on?
jeq WDT_02 ; n
dec.w beep_cnt ; y, decrement count
xor.b #0x20,&P4OUT ; beep using 50% PWM
WDT_02: tst.w delay_cnt ; delay?
jeq WDT_10 ; n
dec.w delay_cnt ; y, decrement count
WDT_10: reti ; return from interrupt
;------------------------------------------------------------------------------
; Interrupt Vectors
;------------------------------------------------------------------------------
.sect ".int10" ; Watchdog Vector
.word WDT_ISR ; Watchdog ISR
.sect ".reset" ; PUC Vector
.word RESET ; RESET ISR
.end
.title“morse.asm”
;*******************************************************************************
; 项目名称:morse.asm
; 作者:斯宾塞·加德纳
;
; 描述:使用LED和传感器输出莫尔斯电码信息
; (发言者)。看门狗配置为间隔计时器。
; 看门狗中断服务程序(ISR)切换为绿色
; LED每秒和脉冲宽度调制(PWM)扬声器
; 这样就产生了一种音调。
;
; 修订:
;
; RBX430-1 eZ430版本C
; 方案A和方案B
; .------------. .------------.
; SW1-->P1.0^P3.0-->LCD|A0(红色)LED LCD|RST
; SW2-->P1.1^P3.1 | SDA(绿色)LED | P1.2^P3.2 |-->SCL NC-->P1.2 P3.2 |-->SCL
; SW4-->P1.3^P3.3-->LCD|RW NC-->P1.3 P3.3-->LED|3(Y)
; INT1-->| P1.4 P3.4 |-->LED|U 5(绿色)NC-->| P1.4 P3.4 | P1.5 P3.5 | P1.5 P3.5 | P2.3 ^ P4.3 | LCD | U BL LCD | P2.5 P4 5 |-->扬声器
; LCD|D6 | P2.6 P4.6 |-->LED|6(红色)(G)LED|1LED|4(R)
; LCD|D7 | P2.7 P4.7 |-->LCD|E(O)LED|u 2DASH,破折号,破折号,破折号,破折号,结束;0
; N1$-->点,破折号,破折号,破折号,破折号,结束;1.
; ...
; N9$-->破折号,破折号,破折号,破折号,点,结束;9
;
; 字母---->A$--->点、破折号、结尾;A.
; 破折号,点,点,点,结束;B
; ...
; Z$--->破折号,破折号,圆点,圆点,结束;Z
; 莫尔斯电码由破折号和圆点组成,或者从语音上说是“dits”和“dahs”。
; 莫尔斯电码中没有空格符号,尽管在书写时有规则。
; 1.一个破折号等于三个点
; 2.字母各部分之间的间距等于一个点
; 3.两个字母之间的间距等于三个点
; 4.两个单词之间的空格等于七个点。
; 5 WPM=60秒/(5*50)元素=每个元素240毫秒。
; 元素=(WDT_IPS*6/WPM)/5
; 摩尔斯电码等于
元件。等效WDT_IPS*240/1000
;------------------------------------------------------------------------------
; 全局变量;闸板段
.bss哔哔声,2;寻呼机标志
.bss延迟,2;延迟标志
;------------------------------------------------------------------------------
; 节目组
.文本;节目组
消息:。字符串“HELLO CS 124 WORLD”;巴黎消息
.字节0
.2;在单词边界上对齐
重置:mov.w#堆栈,SP;初始化堆栈指针
电影w#WDT#U CTL和WDTCTL;设置WD定时器间隔
电影b#WDTIE和IE1;启用WDT中断
bis.b#0x20和P4DIR;将P4.5设置为输出(扬声器)
clr.w蜂鸣器;清除计数器
clr.w延迟
之二.w#GIE,SR;启用中断
; 莫尔斯电码输出“A”
回路:mov.w#元素,r15;输出点
呼叫#嘟嘟声
mov.w#元素,r15;延迟1元件
呼叫延迟
mov.w#元素*3,r15;输出短跑
呼叫#嘟嘟声
mov.w#元素,r15;延迟1元件
呼叫延迟
mov.w#元素*3,r15;输出短跑
呼叫#嘟嘟声
mov.w#元素,r15;延迟1元件
呼叫延迟
mov.w#元素*7,r15;输出空间
呼叫延迟;延迟
jmp环;重复
; 看门狗定时器发出r15滴答声
嘟嘟声:移动带r15,嘟嘟声;开始嘟嘟声
beep02:tst.w beep_cnt;嘟嘟声结束了吗?
jne-02;N
ret;Y
; 延迟看门狗定时器的r15滴答声
延迟:mov.w r15,延迟时间;启动延迟
delay02:tst.w delay\u cnt;延迟完成了吗?
jne-delay02;N
ret;Y
;------------------------------------------------------------------------------
; 看门狗定时器中断服务程序
;
WDT_ISR:tst.w beep_cnt;接通?
jeq WDT_02;N
12月w日哔哔声;y、 递减计数
xor.b#0x20,&P4OUT;使用50%PWM发出嘟嘟声
WDT_02:tst.w延迟_cnt;延迟
jeq WDT_10;N
12月w日延迟时间;y、 递减计数
WDT_10:reti;中断返回
;------------------------------------------------------------------------------
; 中断向量
;------------------------------------------------------------------------------
“int10”节;看门狗向量
.单词WDT_ISR;监督机构
.sect“.reset”;PUC向量
沃尔先生