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.

[参考译文] 为什么程序运行到0x3FFE 的位置?

Guru**** 657930 points
Other Parts Discussed in Thread: RF430FRL152H, TPS22919
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1161602/why-does-the-program-run-to-the-position-of-0x3ffe

主题中讨论的其他器件:RF430FRL152HTPS22919

我的程序与此类似、我使用 TimerA0_ISR 每秒进行一次计数、每5分钟启动一次 VDD2X 30秒、然后关闭 VDD2X。 当 VDD2X 输出3V 30秒时、我将在第10秒读取 ADC 值。
但程序在运行一段时间后会崩溃。 使用 CCS 进行调试后、我发现程序的返回地址已更改为0x3FFE、因此在 TimerA0_ISR 执行后、程序无法返回到正常执行程序。

我想问为什么返回地址变成0x3FFE、以及更改返回地址的可能原因是什么?
VDDSW 电压的稳定性是否会影响返回地址? ??
0x3FFE 在存储器位置中是否有任何特殊意义?

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

    你好、Chen、  

    请指明您正在使用的处理器。  

    谢谢、

    ~Leonard   

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

    我使用 RF430FRL152H

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

    下面是我的程序的一个片段、供您参考。
    主要原因是、当我将 P1.3设置为输出1以启用 TPS22919 SC70-6时、可能会发生后续程序执行跳转至0x3FFE 的情况、从而导致程序无法正确执行。 但 TimerA0的时序仍然可以工作、但它将在离开 TimerA0_ISR 后跳转到0x3FFE。

    #pragma vector = TIMER0_A0_vector
    _interrupt void TimerA0_ISR (void)

    NFC_sys_data.timerCnt += 1;
    cgMsgHeader.timer_sec += 1;

    if (nFC_sys_data.timerCnt >= interval_timer_minute){
    NFC_sys_data.timerCnt = 0;
    NFC_sys_data.adcProc_Start = 1;
    NFC_SYS_DATA.STATE = START_SETUP_STATE;
    _BIC_SR_REGISTER_ON_EXIT (LPM3_BITS);//在此中断后退出 LPM 模式

    cgMsgHeader.timer_sec = 0;

    if (nFC_sys_data.V_doub_FLAG){
    NFC_sys_data.V_doub_time += 1;
    _BIC_SR_REGISTER_ON_EXIT (LPM3_BITS);//在此中断后退出 LPM 模式

    if (nFC_sys_data.State = ADC1_keep_State){
    NFC1_sys_data.adc1_keepTime += 1;

    if (nFC_sys_data.State = idle_State){
    NFC_sys_data.Vdd2x_keepTime += 1;


    //看门狗定时器计数器复位
    WDTCTL = WDTPW + WDTIS0 + WDTIS1 + WDTCNTCL + WDTSSEL0;

    if (nFC_sys_data.adcProc_Start = 0)

    Vdd2x_setting (0);

    void adcProcess (void)(空)

    开关(NFC_sys_data.State){
    案例 START_SETUP_STATE://step 1
    Vdd2x_setting (1);
    NFC_sys_data.State = ADC1_reference_sample_State;//转到步骤2
    中断;
    案例 ADC0_SAMPLE_STATE://step 5
    //设置和读取 ADC0
    SetupSD14 (ADC0_CHANNEL);
    delay_cycles_ms (delay_cycle_CNT);
    while (!(SD14CTL0 & SD14IFG){
    };
    //delay_cycles_ms (128);
    NFC_sys_data.ADC0_Buffer = SD14MEM0;
    SD14CTL0 &=~SD14IFG;//清除数据可用中断
    NFC_SYS_DATA.STATE = ADC_SAVE_STATE;//转到步骤6
    中断;
    案例 ADC1_reference_sample_State://step 2
    SetupSD14 (reference_ADC1_channel);//设置 ADC 并启动转换
    while (!(SD14CTL0 & SD14IFG){
    };
    SD14CTL0 &=~SD14IFG;//清除数据可用中断
    NFC1_sys_data.ADC1_keepTime = 0;
    NFC_SYS_DATA.STATE = ADC1_KEEP_STATE;//转到 步骤3
    中断;
    案例 ADC1_KEEP_STATE://step 3
    if (nFC_sys_data.adc1_keepTime >= adc1_keep_time){
    NFC_sys_data.State = ADC2_thermister_sample_State;//goto 步骤4

    中断;
    案例 ADC2_Thermister_SAMPLE_STATE://step 4
    SetupSD14 (thermister_ADC2_channel);//设置 ADC 并启动转换
    delay_cycles_ms (delay_cycle_CNT);
    while (!(SD14CTL0 & SD14IFG){
    };
    NFC_sys_data.ADC2_Buffer = SD14MEM0;
    SD14CTL0 &=~SD14IFG;//清除数据可用中断
    NFC_SYS_DATA.STATE = ADC0_SAMPLE_STATE;//转到步骤5
    中断;
    案例 ADC_SAVE_STATE://step 6

    //将 ADC 数据保存到 FRAM 中
    updateADCData();
    updateHeaderDataCnt();

    NFC_sys_data.Vdd2x_keepTime = 0;
    NFC_SYS_DATA.STATE = IDLE_STATE;//转到 步骤7
    中断;
    案例 IDLE_STATE://step 7
    if (nFC_sys_data.Vdd2x_keepTime >= Vdd2x_keep_time)

    DisableSD14();
    Vdd2x_setting (0);
    NFC_sys_data.adcProc_Start = 0;

    默认值:
    中断;


    void Vdd2x_setting (u08_t enable)

    RFPMMCTL0 = PMMPW;//解锁 RFPMM
    RFPMMCTL0_L |= RFPMM_EN_BATSWITCH;//启用电池开关
    if (enable = 1){
    RFPMMCTL0_L |= RFPMMCTL0EN_VFREG_VDOUB;
    NFC_sys_data.V_doub_FLAG = 1;
    NFC_sys_data.V_doub_time = 0;
    }否则{
    RFPMMCTL0_L 和=~RFPMMCTL0EN_VFREG_VDOUB;
    NFC_sys_data.V_doub_FLAG = 0;

    RFPMMCTL0_H |= 0xFF;//锁定 RFPMM

    //SET 引脚1.3至输出-(启用/禁用 VDD2x)
    P1DIR |= 0x08;
    //切换输出高电平/低电平
    P1OUT =(使能<<3);

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

    我尝试自己分析这种情况、发现如果我首先移除 TPS22919 SC70-6以去耦 RF430FRL152H 和 TPS22919 SC70-6后面的负载、也就是说、如果我不首先控制 TPS22919 SC70-6的输出、则不会发生程序跳转。 0x3FFE。
    因此、我猜测瞬时负载电流是否太大而导致堆栈混淆。

    e2e.ti.com/.../Schematic.pdf