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