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.

[参考译文] RTOS/MSP432P401R:PWM未打开

Guru**** 2609955 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/655535/rtos-msp432p401r-pwm-did-not-open

部件号:MSP432P401R

工具/软件:TI-RTOS

您好,我正在尝试使用PWM引脚来控制4个电机。 我正在使用引脚2.4 ,2.5 ,2.6 和2.7 ,因此我编辑了PWM LED示例以使用这些引脚。 我将计时器从TA1更改为TA0,并将应用程序.cfg文件的计时器ID设置为1,2和3,但我仍然收到错误"PWM_0 did not open"。 即使由于该错误而导致系统中止,该功能的执行仍会继续, 电机开始工作,但存在loader_exit。 我遵循了此线程中描述的步骤:

我做了以下更改:

Board.h 
...
#define Board_PWM0 MSP_EXP432P401R_PWM_TA0_1 #define Board_PWM1 MSP_EXP432P401R_PWM_TA0_2 #define Board_PWM2 MSP_EXP432P401R_PWM_TA0_3 #define Board_PWM3 MSP_EXP432P401R_PWM_TA0_4
...
MSP_EXP432P401R.h
...
typedef enum MSP_EXP432P401R_PWMName {
MSP_EXP432P401R_PWM_TA0_1 = 0,
MSP_EXP432P401R_PWM_TA0_2,
MSP_EXP432P401R_PWM_TA0_3,
MSP_EXP432P401R_PWM_TA0_4,

MSP_EXP432P401R_PWMCOUNT
} MSP_EXP432P401R_PWMName;
... 
MSP_EXP432P401R.c
...
const PWMTimerMSP432_HWAttrsV1 pwmTimerMSP432HWAttrs[MSP_EXP432P401R_PWMCOUNT]={
{
timerBaseAddr = timer_A0_base,
.clockSource = TIME_A_CLOCKSOURCE_SMCLK,
compareRegister = timer_a_CAPTURECOMPare_register_1,
.gpioPort = gPIO_PORT_P2,
.gpioPinIndex = gPIO_PIN4,
.pwmMode = gPI_primary_module_function
},
{
timerBaseAddr = timer_A0_base,
.clockSource = TIME_A_CLOCKSOURCE_SMCLK,
compareRegister = timer_a_CAPTURECOMPare_register_2,
.gpioPort = gPIO_PORT_P2,
.gpioPinIndex = gPIO_PIN5,
.pwmMode = gPI_primary_module_function
},
{
timerBaseAddr = timer_A0_base,
.clockSource = TIME_A_CLOCKSOURCE_SMCLK,
compareRegister = timer_a_CAPTURECOMPare_register_3,
.gpioPort = gPIO_PORT_P2,
.gpioPinIndex = gPIO_PIN6,
.pwmMode = gPI_primary_module_function
},
{
timerBaseAddr = timer_A0_base,
.clockSource = TIME_A_CLOCKSOURCE_SMCLK,
compareRegister = timer_a_CAPTURECOMPare_register_4,
.gpioPort = gPIO_PORT_P2,
.gpioPinIndex = gPIO_PIN7,
.pwmMode = gPI_primary_module_function
}
};

const PWM_Config PWM_config[]={
{
.fxnTablePtr =&PWMTimerMSP432_fxnTable,
.object =&pwmTimerMSP432Objects[0],
.hwAttrs =&pwmTimerMSP432HWAttrs[0]
},
{
.fxnTablePtr =&PWMTimerMSP432_fxnTable,
.object =&pwmTimerMSP432Objects[1],
.hwAttrs =&pwmTimerMSP432HWAttrs[1]
},
{
.fxnTablePtr =&PWMTimerMSP432_fxnTable,
.object =&pwmTimerMSP432Objects[2],
.hwAttrs =&pwmTimerMSP432HWAttrs[2]
},
{
.fxnTablePtr =&PWMTimerMSP432_fxnTable,
.object =&pwmTimerMSP432Objects[3],
.hwAttrs =&pwmTimerMSP432HWAttrs[3]
},
{NULL, NULL, NULL}
;

/*
==== MSP_EXP432P401R_INITPWM =========
*/
void MSP_EXP432P401R_initPWM (void)
{
/*在端口2上使用端口映射获取引脚(2.4 ,2.5 ,2.6 ,2.7)上的计时器输出*/
const uint8_t端口映射[]={
PM_NONE,PM_NONE,PM_NONE,PM_NONE,
PM_TA0CCR1A,PM_TA0CCR2A,PM_TA0CCR3A,PM_TA0CCR4A
};

/*映射捕获将寄存器与端口2进行比较*/
MAP_PMAP_configurePorts((const uint8_t *)端口映射,PMAP_P2MAP,1,
PMAP_禁用_重新配置);

PWM_init();
}...

以下是功能和主要功能:

电机.c...

pwm_handle pwm1;
pwm_handle pwm2;

void init_motors()
{
uINT16_t pwmPeriod = 2万; // T = 20ms
uINT16_t j=1299; //rampa
uINT16_t i=0;

PWM_Params参数1;
PWM_Params参数2;

/*PWM0*/
pwm_params_init(&params1);
params1.dutyUnits = PWM_Duty_US;
params1.dutyValue = duty1;
params1.periodUnits = PWM_period_US;
params1.periodValue = pwmPeriod;

pwm1 = pwm_open (Board_PWM1,&params1);
IF (pwm1 == NULL){System_abort ("Board_PWM1 Did not open");}
PWM_START (pwm1);

/*PWM1*/
PWM_Params_init (&params2);
params2.dutyUnits = PWM_Duty_US;
params2.dutyValue = duty2;
params2.periodUnits = PWM_period_US;
params2.periodValue = pwmPeriod;

pwm2 = pwm_open(Board_PWM2,&params2);
IF (pwm2 == NULL){System_abort ("Board_PWM2 did not open");}
PWM_START (pwm2);

同时(duty1 < 1299){
用于(i=0;i<j;i=i+10){
_delay_cycles(1000);
}
duty1++;
二元2++;
pwm_setDuty (pwm1,duty1);
pwm_setDuty (pwm2,duty2);
J=j-1;
}
}

int main(void)
{/*

Call board init functions */
Board_initGeneral ();
Board_initGPIO ();
Board_initPWM();
Board_initI2C();
// Board_initSDSPI();
// Board_initSPI();
// Board_initUART();
// Board_initWatchdog ();
// Board_initWiFi();

init_motors(); //此处是函数

System_flush();

/* Start BIOS */
BIOS_start();

return (0);
}...

谢谢你。

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

    能否指定您正在使用的SDK发行版本? 我们需要尝试电路板上的代码,以查看设备发生的情况。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,用户:

    您的代码不在CCS中编译。 我注意到的错误是PWMTimerMSP432_HWAttrsV1不适用于MSP432P4设备。 而是PWMTimerMSP432_HWAttrsV2。 请确认您是否正在使用最新版本的SDK。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    首先,感谢您的关注,很抱歉未能尽快回答。

    经过许多调试时间后,我意识到这是项目中另一个任务的堆栈大小问题。 显然,执行"init_motors()"功能时,PWM端口正在正确初始化,但在启动TI-RTOS SYS/BIOS并执行上述任务后,它内存不足,并且在没有警告的情况下,它正在执行与"init_motors()"第一个指令一致的下一个指令。 这导致PWM端口初始化2次并出现错误。
    通过增加有问题任务的堆栈大小,可以轻松解决该问题。

    希望这对遇到此问题的其他人有所帮助。

    此致,

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

    感谢您的响应和解决方案。 但是,由于PWMTimerMSP432_HWAttrsV2的原因,我仍然无法获取要编译的源代码。 您能否分享正在使用的SDK版本?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好Amit:

    我不确定这是否是您的问题,如果不是,请告诉我。 这是我在项目中使用的内容:
    CCS版本7.0 .........0
    编译器版本TI v 16.9 .0.LTS
    XDCtools版本3.32 .1.22_core
    用于MSP43X 2.20 的TI-RTOS。0.06

    希望这能回答您的问题。

    此致,

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

    感谢您的更新。 但是请注意,用于MSP43X的TI-RTOS在我们添加功能时可能不会有未来的更新。 今后,将采用TI-RTOS和FreeRTOS with POSIX的SimpleLink SDK将成为软件开发平台,并将看到未来的更新和功能添加。 因此,如果可能,我建议切换到SDK。