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.

要使用TMS570LC4357上的外设,是必须要先进入privileged mode才能进行配置使用吗

要用到MCU上的CAP作为辅助PWM功能,IO口配置了,CAP寄存器也配置了,但MCU无任何动作,看了文档,是有些寄存器必须要在privileged mode才能写操作,也看了论坛里别人的相关提问,但任然不知道如何操作,才能让MCU进入privileged mode,感觉好无助,搞了快1周时间了,MCU死活没动作,板子是LAUNCHXL2板子,同程序里别的演示代码都好好的,我也看了演示代码,里面有串口通信的例程,我想里面应该有配置代码,一路追踪找了好久,感觉这个串口的配置里面就没有进入privileged  mode的相关配置代码

  • 您可以先参考一下

    infocenter.arm.com/.../DDI0363E_cortexr4_r1p3_trm.pdf

    的第2.3节

    用户模式以外的其他模式均被视为特权模式,只有具有特权访问权限的设备寄存器才能在这些模式下访问。

    复位后,CPU处于超级用户模式(SVC),这是特权模式。
    可以访问任何外设寄存器(读或写)。

    通常在此模式下,完成设备初始化。

    配置设备后,建议将CPU模式切换到用户模式。
    用户模式是唯一没有特权的模式。
    仅当您尝试写入受保护的寄存器时,访问受保护的寄存器才会导致数据中止。读取访问不会导致任何中止。
  • 那如此说来,MCU复位后是可以直接就配置外设寄存器咯?不需要再配置为特权模式?那是不是我的ECAP配置本身有问题呢?
    pmmREG->PDCLKDIS = 0x00;
    pmmREG->PDCLKDISCLR = 0x10;//使能ECAP模块时钟
    while(pmmTurnONLogicPowerDomain(PMM_LOGICPD6) == FALSE);
    while(pmmIsLogicPowerDomainActive(PMM_LOGICPD6) == FALSE);
    //pmmREG->PDCLKDISCLR = 0x10;//使能ECAP模块时钟

    ecapEnableAPWMmode(ecapREG2, ACTIVE_HIGH, 1000000, 50000);
    ecapEnableAPWMmode(ecapREG3, ACTIVE_HIGH, 1000000, 50000);
    上面是我的ECAP配置代码,IO口复用代码如下
    /* Enable Pin Muxing */
    pinMuxReg->KICKER0 = 0x83E70B13;
    pinMuxReg->KICKER1 = 0x95A4F1E0;
    pinMuxReg->PINMUX[24] = PINMUX_BALL_W8_ECAP3 | PINMUX_BALL_V8_ECAP2 | PINMUX_BALL_H19_MIBSPI5CLK | PINMUX_BALL_E19_MIBSPI5NCS_0;
    PINMUX_GATE_EMIF_CLK_ENABLE(OFF);
    PINMUX_EMIF_OUTPUT_ENABLE(OFF);
    PINMUX_GIOA_DISABLE_HET1_ENABLE(OFF);
    PINMUX_GIOB_DISABLE_HET2_ENABLE(OFF);
    PINMUX_ETHERNET_SELECT(MII);
    PINMUX_ALT_ADC_TRIGGER_SELECT(1);


    PINMUX_ETPWM1_EQEPERR_ENABLE(EQEPERR12);
    PINMUX_ETPWM2_EQEPERR_ENABLE(EQEPERR12);
    PINMUX_ETPWM3_EQEPERR_ENABLE(EQEPERR12);
    PINMUX_ETPWM4_EQEPERR_ENABLE(EQEPERR12);
    PINMUX_ETPWM5_EQEPERR_ENABLE(EQEPERR12);
    PINMUX_ETPWM6_EQEPERR_ENABLE(EQEPERR12);
    PINMUX_ETPWM7_EQEPERR_ENABLE(EQEPERR12);
    PINMUX_ETPWM_TIME_BASE_SYNC_ENABLE(OFF);
    PINMUX_ETPWM_TZ1_ENABLE(ASYNC);
    PINMUX_ETPWM_TZ2_ENABLE(ASYNC);
    PINMUX_ETPWM_TZ3_ENABLE(ASYNC);
    PINMUX_ETPWM_EPWM1SYNCI_ENABLE(ASYNC);

    PINMUX_ETPWM_SOC1A_ENABLE(ON);
    PINMUX_ETPWM_SOC2A_ENABLE(ON);
    PINMUX_ETPWM_SOC3A_ENABLE(ON);
    PINMUX_ETPWM_SOC4A_ENABLE(ON);
    PINMUX_ETPWM_SOC5A_ENABLE(ON);
    PINMUX_ETPWM_SOC6A_ENABLE(ON);
    PINMUX_ETPWM_SOC7A_ENABLE(ON);

    PINMUX_EQEP1A_FILTER_ENABLE(OFF);
    PINMUX_EQEP1B_FILTER_ENABLE(OFF);
    PINMUX_EQEP1I_FILTER_ENABLE(OFF);
    PINMUX_EQEP1S_FILTER_ENABLE(OFF);
    PINMUX_EQEP2A_FILTER_ENABLE(OFF);
    PINMUX_EQEP2B_FILTER_ENABLE(OFF);
    PINMUX_EQEP2I_FILTER_ENABLE(OFF);
    PINMUX_EQEP2S_FILTER_ENABLE(OFF);

    PINMUX_ECAP1_FILTER_ENABLE(OFF);
    PINMUX_ECAP2_FILTER_ENABLE(OFF);
    PINMUX_ECAP3_FILTER_ENABLE(OFF);
    PINMUX_ECAP4_FILTER_ENABLE(OFF);
    PINMUX_ECAP5_FILTER_ENABLE(OFF);
    PINMUX_ECAP6_FILTER_ENABLE(OFF);

    PINMUX_GIOA0_DMA_ENABLE(OFF);
    PINMUX_GIOA1_DMA_ENABLE(OFF);
    PINMUX_GIOA2_DMA_ENABLE(OFF);
    PINMUX_GIOA3_DMA_ENABLE(OFF);
    PINMUX_GIOA4_DMA_ENABLE(OFF);
    PINMUX_GIOA5_DMA_ENABLE(OFF);
    PINMUX_GIOA6_DMA_ENABLE(OFF);
    PINMUX_GIOA7_DMA_ENABLE(OFF);
    PINMUX_GIOB0_DMA_ENABLE(OFF);
    PINMUX_GIOB1_DMA_ENABLE(OFF);
    PINMUX_GIOB2_DMA_ENABLE(OFF);
    PINMUX_GIOB3_DMA_ENABLE(OFF);
    PINMUX_GIOB4_DMA_ENABLE(OFF);
    PINMUX_GIOB5_DMA_ENABLE(OFF);
    PINMUX_GIOB6_DMA_ENABLE(OFF);
    PINMUX_GIOB7_DMA_ENABLE(OFF);

    pinMuxReg->PINMUX[174] |= (uint32)(~(0XFEFFFFFFU));

    PINMUX_TEMP1_ENABLE(OFF);
    PINMUX_TEMP2_ENABLE(OFF);
    PINMUX_TEMP3_ENABLE(OFF);

    /* Disable Pin Muxing */
    pinMuxReg->KICKER0 = 0x00000000;
    pinMuxReg->KICKER1 = 0x00000000;
  • 现在我的所有外设时钟都打开了,IO口也配置了,外设复用也配置了,然后ECAP的控制寄存器也配置为PWM模式了,周期寄存器,占空比也设置了,还可能哪里没配置呢,感觉弄个外设咋这么异常复杂啊,晕哦
  • 总算找到问题了,现在ECAP配置为辅助PWM可以工作了,出PWM波了,原因如下:
    uint16 ECCTL1; /**< 0x0028 Capture Control Reg 1 Register*/
    uint16 ECCTL2; /**< 0x002A Capture Control Reg 2 Register*/
    以上两行代码是TI的那个配置软件产生的代码,注意ECCTL1和ECCTL2各自定义的寄存器地址偏移量

    28h ECCTL2 Capture Control Register 2 Section 33.5.7
    2Ah ECCTL1 Capture Control Register 1 Section 33.5.8
    以上两行是芯片数据手册中明确定义的相关寄存器的地址偏移量,这两个地址和代码发生器产生的刚好对调了一下,导致我在这个配置初始化的问题上折腾了差不多一周时间,各种怀疑我的代码是不是哪里不对,TI啊,你们别这么坑好么