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/MSP430FR2355:MSP 调试调用栈错误

Guru**** 2555630 points
Other Parts Discussed in Thread: OPT3001

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/882511/ccs-msp430fr2355-msp-debug-call-stack-error

器件型号:MSP430FR2355
主题中讨论的其他器件:OPT3001

工具/软件:Code Composer Studio

我附上了该代码并在标记为错误的指令上加下划线。

我试图通过 witty fox 从 opt3001模块读取值。

#include //通用 MSP430器件包括
#include 

#define OPT3001 0x44
#define RESULT 0x00
#define Configuration 0x01

#define ONE_BYTE 0x1
#define two_bytes 0x2
#define Three _bytes 0x3

unsigned long lux;

void GPIO_PING_configurations (void);

void I2C_transmission ch变速箱 设置(unsigned char num_OF_BYTES);
void I2C_WRITE (unsigned char 从机 char 从机地址、unsigned char char register 1、unsigned char cyte_address1、void
、unsigned char
void I2C_read (unsigned char slave_address);

unsigned long convert_to_lux (unsigned int 指数、unsigned int 尾数);

unsigned char TXData[3];
unsigned char RXData[2];
unsigned char ByteCtr;

void main (void)
{

WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器

GPIO_PIN_configurations ();

PM5CTL0 &=~LOCKLPM5;//禁用 GPIO 上电默认高阻抗模式
//激活先前配置的端口设置
unsigned int 指数;
unsigned int 尾数;

while (1)
{

//写入配置寄存器(0x01)以设置 OPT3001
I2C_Transmission _setup (three 字节)的操作模式;
I2C_WRITE (OPT3001、配置、0xC2、0x10);

//延迟100毫秒以允许转换过程完成
__delay_cycles (100);

I2C_transmission 设置(two_bytes);
I2C_setup_write (OPT3001、Result);

I2C_transmission 设置(One_byte);
I2C_Read (OPT3001);
//从原始结果值
指数中提取指数的高四位和尾数的低12位= RXData[0]>> 4;
尾数=(RXData[0]<< 8 | RXData[1])& 0x0FFF;

//take the Exponent and 尾数值并计算相应的 lux 值
lux = convert_TO_lux (指数、尾数);
}//结束背景循环
}// end main ()


#if defined (__TI_Compiler_version__)|| defined (__IAR_systems_icc_)
#pragma vector = USCI_BUSCI_0_ void


(void)#interrupt USCI_isr (n_b0_isr)(n_isr)(nvoid _isr)#interrupt

(n_isr)
#endif
{
switch (__even_in_range (UCB0IV、USCI_I2C_UCBIT9IFG))
{
case USCI_none:break;//向量0:no interrupts break;
case USCI_I2C_UCALIFG:break;
case USCI_I2C_UCCIFG:
UCB0CTL1_中断;

case USCI_CCIFG:USCI_中断/ UCCIFG;case 4:中断/中断/中断

//向量10:RXIFG3中断;
实例 USCI_I2C_UCTXIFG3:中断;//向量14:TXIFG3中断;
实例 USCI_I2C_UCRXIFG2:中断;//向量16:RXIFG2中断;
实例 USCI_I2C_UCTXIFG2:中断;//向
量18:TXIFG2中断;USCI_USCI_UCRXIFG


24:USCI_USCI_USCI_USCI_UCR_BRECOK;实例 USCI_USCI_USCI_USCI_USCI_USCI_USCI_USCI_USCI_USCI_USCI_USCI 中断;USCI_USCI_USCI_USCI_USCI_USCI_US RXIFG0 break;

RXData[ByteCTR]= UCB0RXBUF;//加载 RX 缓冲
区 ByteCTR++;//递增 RX 字节计数

器 break;

case USCI_I2C_UCTXIFG0://向量26:TXIFG0 break;

UCB0TXBUF = TXData[ByteCTR];// Increment USCI_CCUSCI_TXC0 b_R+






;// InCLUSCI_CLUSCI_CLUST_TXC0:// Increment UST_CLUST_CLUST_CLUST_CLUST_CLUST_CLUST_CLUST_CLUST_CLUST_CLUST_CLUST_CLUST_CLUST_CLUST_CLUST_RISTER;// Increment/ BOUT0:// Increment_CK_



中断;//矢量30:时钟低电平超时
情况 USCI_I2C_UCBIT9IFG:中断;//矢量32:第九位
默认值:中断;
}


}void I2C_translation_setup (unsigned char num_for_bytes)
{
//为 I2C 模式配置 USCI_B0并指定要发送/接收

的字节数 UCB0CTLW0 |= UCSWRST; //软件复位使能
UCB0CTLW0 |= UCMODE_3 | UCMST | UCSYNC|UCSSEL_3;// I2C 主模式、SMCLK
UCB0CTLW1 |= UCAST_2;//自动停止生成
//到达 UCB0TBCNT 后
UCB0BRW = 0x8;//
UCB0TBCLK
= UCB0CTL1字节/ UCB0CTL = UCB0B0字节;//接收~到 UCB0TBCL1 //清除复位寄存
器 UCB0IE |= UCTXIE0 | UCRXIE0 | UCNACKIE | UCBCNTIE;//发送和 NACK 中断使能
}

void I2C_WRITE (unsigned char slave_address、unsigned char register_address、unsigned char byte_1、unsigned char byte_2)
{
UCB0I2CSA = slave_address
;// TXData register = slave_address;//设置数据地址 //设置控制寄存器地址
TXData[1]= byte_1;//设置寄存器数据 LSB
TXData[2]= byte_2;//设置寄存器数据 MSB
ByteCtr = 0;//加载字节计数
器 while (UCB0CTLW0 & UCTXSTP);//确保发送停止条件
UCB0CTLW0 | UCB0CTLW0 | UCBCTLW0 | UCB0CTLWT= UCTLW0;//确保发送停止条件
// I2C 起始条件
__bis_SR_register (LPM0_Bits | GIE);//输入 LPM0带中断
//保持在 LPM0中直到所有数据
//为 TX
}

void I2C_setup_write (unsigned char slave_address、unsigned char register_address)
{
UCB0I2CSA = slave_address;//设置从
器地址= TX0_address;//设置从器件地址= TX0_address]; //设置控制寄存器地址
ByteCtr = 0;//加载字节计数
器 while (UCB0CTLW0 & UCTXSTP);//确保发送停止条件
UCB0CTLW0 |= UCTR;// I2C TX
UCB0CTLW0 |= UCTXSTT;// I2C 开始条件
_ bis_SR_register (LPMG0 | BITS);// I2C //输入带中断的 LPM0
//保持在 LPM0中直到所有数据
//已发送
}

void I2C_read (unsigned char slave_address)
{
UCB0I2CSA = slave_address;//设置从器件地址
ByteCtr = 0;//加载字节计数
器 while (UCB0CTLW0 & UCTXSTP);//确保发送 UCB0CTLW0
~停止条件;//确保发送 UCB0CTLW0 // I2C RX
UCB0CTLW0 |= UCTXSTT;// I2C 开始条件
__bis_SR_register (LPM0_Bits | GIE); //输入带中断的 LPM0
//保持在 LPM0中直到所有数据
//为 RX
}

unsigned long convert_to-lux (unsigned int 指数、unsigned int 尾数)
{
//根据以下公式将结果寄存器转换为 lux 测量:
// lux = 0.01 *(2^E[3:0])* R[11:0]

;unsigned int 结果
unsigned int count;
unsigned long conved_lux;

result = 1;
for (count =指数; count > 0;count--)
{
result = result * 2;
}
conved_lux =尾数/ 100;
converted_lux *= result;

return conved_lux;
}

void GPIO_pin_configurations (void)
{
//设置 P1.2和 P1.3引脚以实现 I2C 功能
P4SEL0 || BIT6 | BIT7;
} 

编辑:这是带下划线的代码行。

_bis_SR_register (LPM0_bits | GIE);//输入 LPM0、带中断 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Sahil、

    作为一个好的做法、我不建议将您的所有代码转储到一个线程中、并提到有一个错误。 请更加具体地说明错误以及您迄今为止为解决该错误所做的工作。 我们的社区将更有可能提供指导。

    此外、在以后的帖子中、请在插入任何代码时使用语法 Highlighter。 它有助于提高可读性、并使社区成员更容易提供帮助。 我已经对您的代码进行了格式化。

    现在、上面下划线的代码是 CPU 进入睡眠状态的位置。 如果您尝试调试代码、我不建议使用 LPMx 模式。 相反,只需放置一个 while (1)循环,然后在循环内部放置一个 nop(),您可以在其中停止调试器。 此外、编译器优化级别会影响调试行为、因此请检查这些级别是否较低。

    此致、

    James

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

    很抱歉、我转储了这样的代码、我将确保不会再次发生这种情况。

    我使用过的  

    _bis_SR_register (LPM0 | GIE); 

    这样、我的 MCU 在使用 I2C 通信时消耗的功率就更低、直到发生中断、即 UCRXIFG0或 UCTXIFG0置1。

    我尝试逐行执行我的代码、然后执行  

    I2C_WRITE (OPT3001、配置、0xC2、0x10); 

    会调用 I2C_WRITE 函数、程序永远不会从写入函数中退出。 我认为我的 MCU 在进入 LPM0后没有被唤醒、可能是因为我的数据没有被传输、因此 UCTXIFG0永远不会被置位。  

    我正在研究您的建议。

    我只是想知道为什么不建议在调试期间使用 LPMx。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    > //Set P1.2 and P1.3 pins for I2C functionality
    > P4SEL0 |= BIT6 | BIT7;
    根据数据表(SLASEC4D)、表6-66、P4.6/7是 UCB1、而不是 UCB0。 要获得 UCB0、您应该使用 P1.2/3 [参考数据表表6-63]
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是,现在代码正在工作。

    谢谢您、很抱歉这个愚蠢的错误。