This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/MSP430F5529:具有汇编中断和开关的 MSP430工作 LED

Guru**** 2589280 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/947108/ccs-msp430f5529-msp430-operating-leds-with-interrupts-and-switches-in-assembly

器件型号:MSP430F5529

工具/软件:Code Composer Studio

我正在尝试创建一个基本程序、该程序将在按下 SW2时切换 LED2。  我认为设置正确、但我认为我的中断功能是问题所在。  你们能在这里发现我的错误吗?  提前感谢您。

;------------------------------------------------------------------
;与 TI Code Composer Studio 一起使用的 MSP430汇编代码模板
;;;;;;---------------


cdecls C、list、"msp430.h" ;包含设备头文件

;-----------------
.def 复位 ;导出程序入口点到
;使链接器知道它。
.defSW2_ISR
;------------------------------------------------------
.text ;汇编到程序内存中。
保留 ;覆盖 ELF 条件链接
;并保留当前部分。
.retainrefs ;并保留任何具有的段
;对当前段的引用。

;------------------------------------------------------------------
复位: MOV.w #_STACK_END、SP ;初始化 stackpointer
StopWDT: MOV.w #WDTPW|WDTHOLD、&WDTCTL;停止看门狗计时

器设置:
bs.b#00000001b、&P1DIR;将 P1.0设置为输出(LED1)
BIS.b #10000000b、&P4DIR ;将 P4.7设置为输出(LED2)
BIC.b #00000001b、&P1OUT;关闭 LED1
BIC.b#10000000b、&P4OUT;关闭 LED2
BIC.b#00000010b、&P2DIR;将 P2.1设置为 SW1的输入
BIS.b#00000010b、&P2REN;在 P2.1上启用上拉电阻
BIS.b#00000010b、&P2OUT;正确的 IO
BIC.b#00000010b、&P1DIR 所需;将 P1.1设置为 SW2
bs.b#00000010b、&P1REN 的输入;在 P1.1
bs.b#00000010b、&P1OUT 处启用上拉电阻器;正确的 IO 所需
BIS.w #GIE、SR ;启用全局中断
BIS.b#00000010b、&P2IE;从位1启用端口2中断
bis.b#00000010b、&P2IES;将中断设置为从高电平到低电平的调用
BIC.b#00000010b、&P2IFG;清除中断标志
BIS.b#00000010b、&P1IE;从位1启用端口1中断
bis.b#00000010b、&P1IES;将中断设置为从高电平到低电平的调用
bic.b#00000010b,&P1IFG;清除中断标志
;---------------
;这里的主循环
;--------------------------------------------------------------------------

InfLoop:
JMP$;在这里循环,直到中断

SW2_ISR:
BIC.b #00000010b、&P1IFG ;清除中断标志

ChkSw: bit.b #02h、&P1IN ;检查是否按下 SW2
;(P1IN 上的0000_0010)
jnzLExit;如果不为零,则 SW2未按下
;循环并再次检查
去抖:MOV.w #2000,R15 ;设置为(2000 * 10 cc)

SWD20ms:Dec.w R15 ;减量 R15
NOP
NOP
NOP
NOP
NOP
NOP
NOP
Jnz SWD20ms ;延迟?
bit.b #00000010b、&P1IN ;验证 SW2是否仍然按下
jnzLExit;如果不是,请等待 SW2,按

“LEDON”: BIS.b #008h、&P4OUT ;打开 LED1

SW2WAIT:bit.b #002h、&P1IN ;测试 SW2
JZ SW2等待 ;等待 SW2被释放
BIC.b #008h、&P4OUT ;关闭 LED1

LExit: 重提
;----------------------------------------------------------------
;堆栈指针定义
;-----------------
.global __stack_end
.sect .stack

;------------------------------------------------------------------------------------------------
;中断矢量
;-----
.sect ".reset" ;MSP430复位向量
短路复位
.sect ".int20" ;P1.x 矢量
SW2_ISR
.end

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    第69行和第73行应在注释中显示"LED2"、而不是"LED1"

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    首先启用全局中断、然后与端口中断进行中间操作。 启用端口中断、设置边沿、然后清除标志。 这是混乱的。

    清除标志尤其是一项浪费的工作、因为它已经导致了一个中断。 因为我只看到一个 ISR 和两个已启用的中断、所以这确实是一个问题。

    对于开关去抖、有更好的方法:

    哦、如果不在主循环中设置低功耗模式、您就会错过 MSP430的最佳功能之一。