【问题标题】:MSP430 - Assembly ISR doesn't get runMSP430 - 装配 ISR 未运行
【发布时间】: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 部分做同样的事情

标签: assembly interrupt msp430


【解决方案1】:

好的,我想通了。显然中断向量表是一个硬编码的内存空间。从数据表中,我发现端口 1 的中断向量是 0xFFDE,转换为INT47,因此我将汇编程序的底部更改为:

.sect ".int47"
.word buttonISR
.end

现在效果很好!

【讨论】:

  • 它是如何翻译成 INT47 的?
  • 参见第 52 页,第 6.3 节关于 MSP430 数据表中的中断向量地址,并在表中查找 IO 端口 p1。
猜你喜欢
  • 2014-01-15
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
  • 2013-03-10
  • 1970-01-01
  • 2014-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多