Other Parts Discussed in Thread: MSP-EXP432E401Y
Tool/software: TI-RTOS
This is my first post so Hello everyone!
These are my first steps with TI-RTOS and MSP432E401Y (TI Launchpad).
When reviewing examples from TI resource explorer I got stuck with adding a driver when extending pwmled1 example. The pwmled1 controls onboard led with PWM0. I would like to extend i.e. add new driver instance for PWM1 to use both PWM0 and PWM1.
What I did:
- added an enum (file: MSP_EXP432E401Y.h):
typedef enum MSP_EXP432E401Y_PWMName {
MSP_EXP432E401Y_PWM0 = 0,
MSP_EXP432E401Y_PWM1, /*newly added*/
MSP_EXP432E401Y_PWMCOUNT
} MSP_EXP432E401Y_PWMName;
- extended arrays (file MSP_EXP432E401.c):
const PWMMSP432E4_HWAttrs pwmMSP432E4HWAttrs[MSP_EXP432E401Y_PWMCOUNT] = {
{
.pwmBaseAddr = PWM0_BASE,
.pwmOutput = PWM_OUT_0,
.pwmGenOpts = PWM_GEN_MODE_DOWN | PWM_GEN_MODE_DBG_RUN,
.pinConfig = PWMMSP432E4_PF0_M0PWM0
},
{ /*newly added*/
.pwmBaseAddr = PWM0_BASE,
.pwmOutput = PWM_OUT_1,
.pwmGenOpts = PWM_GEN_MODE_DOWN | PWM_GEN_MODE_DBG_RUN,
.pinConfig = PWMMSP432E4_PF1_M0PWM1
}
};
const PWM_Config PWM_config[MSP_EXP432E401Y_PWMCOUNT] = {
{
.fxnTablePtr = &PWMMSP432E4_fxnTable,
.object = &pwmMSP432E4Objects[MSP_EXP432E401Y_PWM0],
.hwAttrs = &pwmMSP432E4HWAttrs[MSP_EXP432E401Y_PWM0]
},
{ /*newly added*/
.fxnTablePtr = &PWMMSP432E4_fxnTable,
.object = &pwmMSP432E4Objects[MSP_EXP432E401Y_PWM1],
.hwAttrs = &pwmMSP432E4HWAttrs[MSP_EXP432E401Y_PWM1]
}
};
- added line in board.h file:
#define Board_PWM0 MSP_EXP432E401Y_PWM0 #define Board_PWM1 MSP_EXP432E401Y_PWM1 /*new line*/
- and finally intializet and populated structures with parameters in pwmled1.c:
void *mainThread(void *arg0)
{
/* Period and duty in microseconds */
uint16_t pwm1Period = 3000;
uint16_t pwm1duty = 0;
uint16_t pwm1dutyInc = 100;
uint16_t pwm2Period = 3000;
uint16_t pwm2duty = 0;
uint16_t pwm2dutyInc = 100;
/* Sleep time in microseconds */
uint32_t time = 50000;
PWM_Handle pwm1 = NULL;
PWM_Params pwm1params;
PWM_Handle pwm2 = NULL;
PWM_Params pwm2params;
/* Call driver init functions. */
PWM_init();
PWM_Params_init(&pwm1params);
pwm1params.dutyUnits = PWM_DUTY_US;
pwm1params.dutyValue = 0;
pwm1params.periodUnits = PWM_PERIOD_US;
pwm1params.periodValue = pwm1Period;
pwm1 = PWM_open(Board_PWM0, &pwm1params);
if (pwm1 == NULL) {
/* Board_PWM0 did not open */
while (1);
}
PWM_Params_init(&pwm2params);
pwm2params.dutyUnits = PWM_DUTY_US;
pwm2params.dutyValue = 0;
pwm2params.periodUnits = PWM_PERIOD_US;
pwm2params.periodValue = pwm2Period;
pwm2 = PWM_open(Board_PWM1, &pwm2params);
if (pwm2 == NULL) {
/* Board_PWM1 did not open */
while (1);
}
PWM_start(pwm1);
PWM_start(pwm2);
/* Loop forever incrementing the PWM duty */
while (1) {
PWM_setDuty(pwm1, pwm1duty);
pwm1duty = (pwm1duty + pwm1dutyInc);
if (pwm1duty == pwm1Period || (!pwm1duty)) {
pwm1dutyInc = - pwm1dutyInc;
}
PWM_setDuty(pwm2, pwm2duty);
pwm2duty = (pwm2duty + pwm2dutyInc);
if (pwm2duty == pwm2Period || (!pwm2duty)) {
pwm2dutyInc = - pwm2dutyInc;
}
usleep(time);
}
}
Effects: neither my new PWM1 nor PWM0 works.
Thank you in advance for telling me what I did wrong or/and lead me to proper solution.
Tomasz