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.

[参考译文] 编译器/MSP430F5529:启用捕获中断会导致ISR_TRAP.asm在应用程序挂起时运行

Guru**** 2538950 points
Other Parts Discussed in Thread: MSP430F5529

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/574400/compiler-msp430f5529-enabling-capture-interrupt-causes-isr_trap-asm-to-run-while-application-hangs

部件号:MSP430F5529

工具/软件:TI C/C++编译器

您好,

请使用MSP430F5529启动板测量信号的周期。 信号通过WFP 1.2 传送到MCU。 我在捕获模式下将TA0与CCR1寄存器一起使用。 调试程序时,主应用程序(即代码的LED闪烁部分)工作正常,但立即启用中断,下面的程序将运行(ISR_TRAP.ASM)。 这会导致整个应用程序挂起。 我需要帮助来解决此问题,谢谢。

;************************************************************************
;* ISR_TRAP.asm - 15.12 v.1. *
;* *
;*版权所有(c) 2003-2016 Texas2016 Texas Instruments Incorporated *
;* http://www.ti.com/                                                         *
;* *;*
以源代码和二进制形式重新分发和使用,无论是否使用 *
;*修改,但前提是满足以下条件 *
;*满足条件: *
;* *
;* 重新分发源代码必须保留上述版权 *
;* 注意,此条件列表和以下免责声明。 *
;* *
;* 以二进制形式重新分发时必须复制上述版权 *
;* 注意,此条件列表和中的以下免责声明 *
;* 随提供的文档和/或其他材料 *
;* 分发。 *
;* *
;* 德州仪器(TI)公司的名称和名称都不是 *
;* 的贡献者可用于支持或推广产品 *
;* 派生自本软件,未事先编写特定内容 *
;* 权限。 *
;* *
;*本软件由版权所有者和贡献者提供 *
;*“按原样”和任何明示或暗示的担保,包括但不包括 *
;*仅限于适销性和适用性的暗示担保 *
;*不存在特定目的。 在任何情况下,版权都不应享有 *
;*所有者或贡献者对任何直接,间接,附带, *
;*特殊,惩戒性或后果性损害(包括但不包括 *
;*仅限于采购替代货物或服务;无法使用, *
;*数据或利润;或业务中断) *
;*责任理论,无论是合同,严格责任还是侵权行为 *
;*(包括疏忽或其他)因使用而产生的任何原因 本
软件的*;*,即使被告知可能会造成此类损坏。 *
;* *
;********************************************************************************


----------------------------------
;---缺省ISR处理程序(如果用户不提供
);---简单地将设备放入lpm0
;------------------

	.sect	".text:_ISR:__TI_ISR_TRA"
	.ALIGN	2
	.GLOBAL	__TI_ISR_TRAP
__TI_ISR_TRAP:
比宽 #(0x0010),SR
JMP __TI_ISR_TRAP

无操作 ;CPU40兼容性NOP

;**********************************************************************
;*生成属性 *;*
HW_MPY_INITY_INFO=1:文件没有任何内嵌的硬件颠簸 *;*
HW_MPY_ISR_INFO =1:文件没有ISR,但调用不顺利或不能进行*;******************************************************************************

.battr "ti",Tag_File,1,Tag_HW_MPY_inline_info (1)
.battr "ti",Tag_File,1,Tag_HW_MPY_ISR_INFO (1)


这是我正在调试的程序:

/**
部分:包含的文件
*/

#include <stdio.h>
#include <stdint.h>
#include "driverlib.h"
#include "lc_driver.h"

/**
部分:全局变量定义
*/

uint16_t period_raw =0;
uint16_t captured_value;
uint16_t previous_capture;
f_old;
float period_old;float period;
浮点周期更改;
浮点校准电容;
浮点测量电容;

/**
部分:宏声明
*/

#define RA 1000								//电阻器RA值(欧姆)
#define rb 1万							//电阻器rb值(欧姆)
#define K (1.44 /(RA)+(2 * RB)))) 		//确定电容的常量
#define P 1								//一个计时器tick值(以秒为单位)/**


部分:函数原型
*/

void capture _config (void);
内联void capture interrupt (void);

/**
部分:主应用
*/

int main (void)
{
WDT_A_HOLD (WDT_A_BASE);								//停止监视程序计时器
GPIO _setAsOutputPin (GPIO端口P1,GPIO _PIN0);

capture_config();//									为捕获模式配置timerA

delay_ms(50);										//允许555计时器稳定?

CHAR DISPLAY_DATA[20];

	while (1)
	{
		IF (TIMER_A_CAPTENT_OVERFLOW == Timer_a_getCaptureCompareInterruptStatus\
		(TIMER_A0_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_1,TIMER_A_CAPTENT_OVERFLOW))
	{//
			重置计时器?}
	

		//闪烁LED
		GPIO _setOutputHighOnPin (GPIO端口P1,GPIO _PIN0);
		DELAY _ms (1000);
		GPIO _setOutputLowOnPin (GPIO端口P1,GPIO _PIN0);
		DELAY _ms(1000);
	}


/**
部分:功能定义
*/

void capture_config(void)
{//
	将WFP设置1.2 为输入
	GPIO端口P1(GPIO_PORT_P1, GPIO_PIN2);
	//将WFP 1.2 设置为捕获输入
	

	
	
	
	分配器gPIO_setAsalModuleFunctionInputPin(GPIO_PORT_Pp1,时钟时间器=_CONSTROPH_CLAM_PARAME_PARAMERA_PARAMERA_PARAME_POSTER_1_PARAMERASE_PARAMERADE_PARAMERADE_PARAMERADE_PARAMERADE_PARAMERADE_PARAMERADE_PARAMERADE_PARAMERADE_PORADE_PORADE_PORADE_PORADE_PORADE_PORADE_PORADE_PORADE_PORADE_TIME_PORADE_PORADE_PORADE_PORADE_PORADE_PORADE_POST_PORADE_PORADE_POST_PORAME_PORADE
	
	
	continuous_param.startTimer = false;
	Timer_a_initContinuousMode(timer_A0_base,&continuous_param);

	//初始化timerA捕获模式
	Timer_a_clearCaptureCompareInterrupt (timer_A0_base, timer_a_CAPTURMPare_register_0);
	
	Timer_a_initcapcapture_mode_mode_timer_conve_capture_param.captureRegister =
	capture_param.captureInterruptEnable
	
	capture_param.captureInputSelect capture_param.captureMode
	Capture_param.synchronizeCaptureSource = timer_a_capture_synchronous;
	capture_param.captureOutputMode = timer_a_OUTPUTMODE_OUTBITVALUE;
	Timer_a_initCaptureMode (timer_A0_base,&capture_param);

	Timer_a_startCounter(timer_A0_base, Timer_a_continuous模式);

	//启用中断
	__bis_sr_register(GIE);




	
	
	
	
	
	
		
	
	
	
		
		
	
}内联void capture_interrupt (void){静态uint8_t interrupt number =0;interrupt number++;//获取捕获的值captured_value = Timer_a_getCapture CompareCount(timer_A0_base, timer_a_captur_1=


;interrupt_parag_f_f_f_f_f_f_f_={_number_interrupt_parag_f_f_number=0;<_interrupt_para=_par_____para=0; se_number=_par_______parinterrupt______ 中断服务例程
*/

#pragma vector=Timer1_A1_vector
__interrupt void timer_A0_ISR(void)
{
	SWITCH(__偶 数_IN_RANGE(TA0IV, 14))
	{
		案例0://							无
			中断;
		案例2:							// CCR1 IFG
			capture_interrupt ();
			案例
		4:							// CCR2 IFG
			中断;
		案例6:CCIFG/							
			
									R3/
			
		CCIfG中断						:案例8
			:CCR3/ CCR3/ CCIFG中断
		案例12:						// CCR6 IFG
			中断;
		案例14:						// TAOIFG
			中断;
		默认:						//从未执行
			中断;
	}

尽管应用程序挂起,但在“监视”窗口中查看CCR1寄存器,确认当从信号发生器接收1KHz的信号时,计时器的捕获模式正在工作。 下面显示了此操作的屏幕截图:

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

    您应该使用TIMER0_A1_Vector而不是Timer1_A1_Vector,错误的ISR初始化将您的程序置入ISR陷阱。

    此致,
    Ryan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢Ryan,应用程序不再挂起。