Skip to content

Commit 9f83ce1

Browse files
committed
pwmout - IMX - add read methods for period and pulsewidth
1 parent ea6e806 commit 9f83ce1

File tree

1 file changed

+27
-10
lines changed
  • targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_IMX

1 file changed

+27
-10
lines changed

targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_IMX/pwmout_api.c

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ static PWM_Type *const pwm_addrs[] = PWM_BASE_PTRS;
3232
extern void pwm_setup();
3333
extern uint32_t pwm_get_clock();
3434

35-
void pwmout_init(pwmout_t* obj, PinName pin)
35+
void pwmout_init(pwmout_t *obj, PinName pin)
3636
{
3737
PWMName pwm = (PWMName)pinmap_peripheral(pin, PinMap_PWM);
3838
MBED_ASSERT(pwm != (PWMName)NC);
@@ -93,15 +93,15 @@ void pwmout_init(pwmout_t* obj, PinName pin)
9393
pinmap_pinout(pin, PinMap_PWM);
9494
}
9595

96-
void pwmout_free(pwmout_t* obj)
96+
void pwmout_free(pwmout_t *obj)
9797
{
9898
uint32_t instance = (obj->pwm_name >> PWM_SHIFT) & 0x7;
9999
uint32_t module = (obj->pwm_name >> PWM_MODULE_SHIFT) & 0x3;
100100

101101
PWM_StopTimer(pwm_addrs[instance], (1 << module));
102102
}
103103

104-
void pwmout_write(pwmout_t* obj, float value)
104+
void pwmout_write(pwmout_t *obj, float value)
105105
{
106106
if (value < 0.0f) {
107107
value = 0.0f;
@@ -130,7 +130,7 @@ void pwmout_write(pwmout_t* obj, float value)
130130
PWM_SetPwmLdok(base, (1 << module), true);
131131
}
132132

133-
float pwmout_read(pwmout_t* obj)
133+
float pwmout_read(pwmout_t *obj)
134134
{
135135
PWM_Type *base = pwm_addrs[(obj->pwm_name >> PWM_SHIFT) & 0x7];
136136
uint32_t module = (obj->pwm_name >> PWM_MODULE_SHIFT) & 0x3;
@@ -153,18 +153,18 @@ float pwmout_read(pwmout_t* obj)
153153
return (v > 1.0f) ? (1.0f) : (v);
154154
}
155155

156-
void pwmout_period(pwmout_t* obj, float seconds)
156+
void pwmout_period(pwmout_t *obj, float seconds)
157157
{
158158
pwmout_period_us(obj, seconds * 1000000.0f);
159159
}
160160

161-
void pwmout_period_ms(pwmout_t* obj, int ms)
161+
void pwmout_period_ms(pwmout_t *obj, int ms)
162162
{
163163
pwmout_period_us(obj, ms * 1000);
164164
}
165165

166166
// Set the PWM period, keeping the duty cycle the same.
167-
void pwmout_period_us(pwmout_t* obj, int us)
167+
void pwmout_period_us(pwmout_t *obj, int us)
168168
{
169169
PWM_Type *base = pwm_addrs[(obj->pwm_name >> PWM_SHIFT) & 0x7];
170170
uint32_t module = (obj->pwm_name >> PWM_MODULE_SHIFT) & 0x3;
@@ -194,17 +194,22 @@ void pwmout_period_us(pwmout_t* obj, int us)
194194
pwmout_write(obj, dc);
195195
}
196196

197-
void pwmout_pulsewidth(pwmout_t* obj, float seconds)
197+
int pwmout_read_period_us(pwmout_t *obj)
198+
{
199+
return (base->SM[module].VAL1) & PWM_VAL1_VAL1_MASK;
200+
}
201+
202+
void pwmout_pulsewidth(pwmout_t *obj, float seconds)
198203
{
199204
pwmout_pulsewidth_us(obj, seconds * 1000000.0f);
200205
}
201206

202-
void pwmout_pulsewidth_ms(pwmout_t* obj, int ms)
207+
void pwmout_pulsewidth_ms(pwmout_t *obj, int ms)
203208
{
204209
pwmout_pulsewidth_us(obj, ms * 1000);
205210
}
206211

207-
void pwmout_pulsewidth_us(pwmout_t* obj, int us)
212+
void pwmout_pulsewidth_us(pwmout_t *obj, int us)
208213
{
209214
PWM_Type *base = pwm_addrs[(obj->pwm_name >> PWM_SHIFT) & 0x7];
210215
uint32_t module = (obj->pwm_name >> PWM_MODULE_SHIFT) & 0x3;
@@ -223,6 +228,18 @@ void pwmout_pulsewidth_us(pwmout_t* obj, int us)
223228
PWM_SetPwmLdok(base, (1 << module), true);
224229
}
225230

231+
int pwmout_read_pulsewidth_us(pwmout_t *obj {
232+
uint16_t count;
233+
234+
if (pwmchannel == 0)
235+
{
236+
count = (base->SM[module].VAL3) & PWM_VAL3_VAL3_MASK;
237+
} else
238+
{
239+
count = (base->SM[module].VAL5) & PWM_VAL5_VAL5_MASK;
240+
}
241+
}
242+
226243
const PinMap *pwmout_pinmap()
227244
{
228245
return PinMap_PWM;

0 commit comments

Comments
 (0)