【发布时间】:2014-09-22 20:20:03
【问题描述】:
尝试在我的 MSP430 上按下按钮时在汇编中编写 ISR。我已经按照网络上的一些说明进行操作,但我无法将 ISR“链接”到按钮按下。
具体来说,我正在尝试将一个按钮连接到端口 P1.1 以运行我的 ISR。
我已经完成的步骤
1) 启用 P1.1 的中断P1IE |= BIT1;
2) 选定的 H->L 过渡:P1IES |= BIT1;
3) 清除标志寄存器:P1IFG &= ~BIT1;
4) 启用全局中断:__enable_interrupt();
不过,我认为我遗漏了一些东西。我不明白如何告诉程序运行我的 ISR,不幸的是我在网上没有找到任何关于这部分非常清楚的指南。这是我在汇编中的 ISR:
.cdecls C,LIST,"msp430.h"
.sect ".text:_isr"
buttonISR: push R4
mov.w #1000, R4
loop: dec.w R4
jnz loop
reti
.sect BUTTON_ISR
.word buttonISR
.end
【问题讨论】:
-
我对 MSP430 不够熟悉,无法专门回答这个问题,但是对于大多数架构,您必须通过将 ISR 的地址放入对应于中断向量表的插槽中来注册 ISR您要处理的 IRQ。
-
该汇编语言是否区分带有尾随冒号的标签和不带有冒号的标签?如果有,有什么区别?
-
好的@reirab,是的,我听说过这个
interrupt vector table,但我现在不确定如何使用它。 @wallyk 抱歉,打错字了 -
您似乎没有设置按下按钮时想要生成的中断号(使用
P1IV寄存器)。您正在混合旧式 (.sect/.word) 和新式 (.intvec) 声明中断向量的方式。你也弄错了旧样式,应该是.word buttonISR。 -
谢谢罗斯。我的代码是我在网络各个地方看到的点点滴滴的凝结,所以我并不感到惊讶。我还没有找到可以像我需要的那样清楚地解释这些事情的资源。因此,我删除了
.intvec...,因为我假设它与.sect/.word部分做同样的事情