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.

[参考译文] AM2634:配置2个 SDFM 后、代码会运行到异常点

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1383365/am2634-when-2-sdfms-are-configured-the-code-runs-to-the-exception-point

器件型号:AM2634

工具与软件:

环境:CCS12.7 sdk9.0.02  我使用我自己的 PCB 与263x

在 syscfg 中配置的 SDFM0: 使用滤波器通道4、IO 设置 SDFM CLK 引脚 A15数据引脚 C14             

在 syscfg 中配置的 SDFM1: 使用滤波器通道3/4、IO 设置 SDFM CLK 引脚 B13和 A13数据引脚 B12&A12    

编译器和运行, 代码到波纹管,我甚至没有配置关于中断

void __attribute__((interrupt("ABORT"), section(".text.hwi"),weak)) HwiP_data_abort_handler_c(void)
{
    volatile uint32_t loop = 1;
    while(loop!=0U)
    {
        ;
    }
}

我的代码如下:

void init_sigmaDelta(void)
{
    /* Over value threshold settings */
    uint16_t hlt = 0x7FFF;
    /* Under value threshold settings */
    uint16_t llt = 0x0000;

    /* Configure Modulator Clock rate = Modulator data rate */
    SDFM_setupModulatorClock(SDFM_VBUS_BASE_ADDR, SDFM_FILTER_4, SDFM_MODULATOR_CLK_EQUAL_DATA_RATE); //VBUS

    SDFM_setupModulatorClock(SDFM_UW_PHASE_BASE_ADDR, SDFM_FILTER_3, SDFM_MODULATOR_CLK_EQUAL_DATA_RATE);
    SDFM_setupModulatorClock(SDFM_UW_PHASE_BASE_ADDR, SDFM_FILTER_4, SDFM_MODULATOR_CLK_EQUAL_DATA_RATE);

    SDFM_enableSynchronizer(SDFM_VBUS_BASE_ADDR, SDFM_FILTER_4, SDFM_CLOCK_SYNCHRONIZER | SDFM_DATA_SYNCHRONIZER);
    SDFM_selectClockSource(SDFM_VBUS_BASE_ADDR, SDFM_FILTER_4, SDFM_CLK_SOURCE_CHANNEL_CLK);
    SDFM_configEnhancedComparator(SDFM_VBUS_BASE_ADDR, (SDFM_FILTER_4 | SDFM_FILTER_SINC_3 | SDFM_SET_OSR(32)), SDFM_THRESHOLD(32767,0), \
                                   SDFM_THRESHOLD(32767,0), (SDFM_HTLZ_DISABLE | 32767));
    SDFM_selectCompEventSource(SDFM_VBUS_BASE_ADDR, SDFM_FILTER_4 , SDFM_COMP_EVENT_1 , SDFM_COMP_EVENT_SRC_COMPH1);
    SDFM_selectCompEventSource(SDFM_VBUS_BASE_ADDR, SDFM_FILTER_4 , SDFM_COMP_EVENT_2 , SDFM_COMP_EVENT_SRC_COMPL1);
    SDFM_configDataFilter(SDFM_VBUS_BASE_ADDR, (SDFM_FILTER_4 | SDFM_FILTER_SINC_3 | SDFM_SET_OSR(128)), \
                          (SDFM_FILTER_ENABLE | SDFM_DATA_FORMAT_16_BIT | SDFM_SHIFT_VALUE(7)));
    SDFM_enableMainFilter(SDFM_VBUS_BASE_ADDR);
    
    SDFM_enableSynchronizer(SDFM_UW_PHASE_BASE_ADDR, SDFM_FILTER_3, SDFM_CLOCK_SYNCHRONIZER | SDFM_DATA_SYNCHRONIZER);
    SDFM_enableSynchronizer(SDFM_UW_PHASE_BASE_ADDR, SDFM_FILTER_4, SDFM_CLOCK_SYNCHRONIZER | SDFM_DATA_SYNCHRONIZER);
    SDFM_selectClockSource(SDFM_UW_PHASE_BASE_ADDR, SDFM_FILTER_3, SDFM_CLK_SOURCE_CHANNEL_CLK);
    SDFM_selectClockSource(SDFM_UW_PHASE_BASE_ADDR, SDFM_FILTER_4, SDFM_CLK_SOURCE_CHANNEL_CLK);
    SDFM_configEnhancedComparator(SDFM_UW_PHASE_BASE_ADDR, (SDFM_FILTER_3 | SDFM_FILTER_SINC_3 | SDFM_SET_OSR(32)), SDFM_THRESHOLD(32767,0), \
                                  SDFM_THRESHOLD(32767,0), (SDFM_HTLZ_DISABLE | 32767));
    SDFM_selectCompEventSource(SDFM_UW_PHASE_BASE_ADDR, SDFM_FILTER_3 , SDFM_COMP_EVENT_1 , SDFM_COMP_EVENT_SRC_COMPH1);
    SDFM_selectCompEventSource(SDFM_UW_PHASE_BASE_ADDR, SDFM_FILTER_3 , SDFM_COMP_EVENT_2 , SDFM_COMP_EVENT_SRC_COMPL1);
    SDFM_configEnhancedComparator(SDFM_UW_PHASE_BASE_ADDR, (SDFM_FILTER_4 | SDFM_FILTER_SINC_3 | SDFM_SET_OSR(32)), SDFM_THRESHOLD(32767,0), \
                                  SDFM_THRESHOLD(32767,0), (SDFM_HTLZ_DISABLE | 32767));
    SDFM_selectCompEventSource(SDFM_UW_PHASE_BASE_ADDR, SDFM_FILTER_4 , SDFM_COMP_EVENT_1 , SDFM_COMP_EVENT_SRC_COMPH1);
    SDFM_selectCompEventSource(SDFM_UW_PHASE_BASE_ADDR, SDFM_FILTER_4 , SDFM_COMP_EVENT_2 , SDFM_COMP_EVENT_SRC_COMPL1);
    SDFM_configDataFilter(SDFM_UW_PHASE_BASE_ADDR, (SDFM_FILTER_3 | SDFM_FILTER_SINC_3 | SDFM_SET_OSR(128)), \
                          (SDFM_FILTER_ENABLE | SDFM_DATA_FORMAT_16_BIT | SDFM_SHIFT_VALUE(7)));
    SDFM_configDataFilter(SDFM_UW_PHASE_BASE_ADDR, (SDFM_FILTER_4 | SDFM_FILTER_SINC_3 | SDFM_SET_OSR(128)), \
                          (SDFM_FILTER_ENABLE | SDFM_DATA_FORMAT_16_BIT | SDFM_SHIFT_VALUE(7)));
    SDFM_enableMainFilter(SDFM_UW_PHASE_BASE_ADDR);
}

和主循环:

int main(void)
{
    System_init();
    Board_init();

    init_sigmaDelta();
    while(1);

    Board_deinit();
    System_deinit();

    return 0;
}

当我删除 sdfm0或 sdfm1时、 代码运行正常、 无论通道如何匹配、我都尝试了多次、只要 同时配置2个 SDFM、就会发生错误。

当我在 评估板上运行代码时、一切都正常、包括2个 SDFM 一起工作、但在我自己的板上、2个 SDFM 无法一起配置、 这是为什么? 我运行了 SPI/PWM/UART/ADC/DAC 等其他外设、……除了2个 SDFM 一起配置外、其他一切都正常

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

    抱歉、芯片不同、我的芯片使用的是 AM2632C、但评估板使用的是 AM2634B

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

    我通过操纵地址重写了该代码,并发现问题发生在以下:

    static uint16_t u16Reg, u16Reg1= 0;
        u16Reg  = HW_RD_REG16(0x50268080);
        u16Reg1 = HW_RD_REG16(0x50269060);

    当我读取0x50268080 (SDFM0中的 CTL4)一切正常时、

    但是、当我读取0x50269060 (SDFM1中的 CTL3)时、代码会 发生异常。

    然后我使用 View->Memory Browser、 发现在代码初始化后、地址0x50269000之前有一个值、但所有后续值都是"??"

    当我使用评估板时、所有地址都有其值。

    我认为这是产生错误的原因、但为什么会这样? 2632C 是否不支持两个 SDRAM?如果不支持、如何解决?

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

    我的芯片是  AM2632CNTFHAZCZ、第九个字符是"D"、评估板是 AM2634COMFHAZCZ、第九个字符是"M"。 这 就是为什么我的芯片只有一个 SDFM?

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

    您好、Zhou、

    我们中的许多人都因假期而外出,因此在此延迟响应,我们对此深表歉意。

    是的、这是您所使用的特定器件的限制、仅支持单个 SDFM 实例。 EVM (LaunchPad 和 controlCARD)始终使用超集器件、以使开发人员能够利用所有可用外设、并在系统/应用清理完毕后削减至低端选项。

    此致、

    Zackary