@@ -46,22 +46,22 @@ typedef enum {
46
46
} PWMType ;
47
47
48
48
static const PWMType PORT [] = {
49
- PWM1A , // PWM_PWM1A
50
- PWM1B , // PWM_PWM1B
51
- PWM1C , // PWM_PWM1C
52
- PWM1D , // PWM_PWM1D
53
- PWM1E , // PWM_PWM1E
54
- PWM1F , // PWM_PWM1F
55
- PWM1G , // PWM_PWM1G
56
- PWM1H , // PWM_PWM1H
57
- PWM2A , // PWM_PWM2A
58
- PWM2B , // PWM_PWM2B
59
- PWM2C , // PWM_PWM2C
60
- PWM2D , // PWM_PWM2D
61
- PWM2E , // PWM_PWM2E
62
- PWM2F , // PWM_PWM2F
63
- PWM2G , // PWM_PWM2G
64
- PWM2H , // PWM_PWM2H
49
+ PWM1A , // PWM_PWM1A
50
+ PWM1B , // PWM_PWM1B
51
+ PWM1C , // PWM_PWM1C
52
+ PWM1D , // PWM_PWM1D
53
+ PWM1E , // PWM_PWM1E
54
+ PWM1F , // PWM_PWM1F
55
+ PWM1G , // PWM_PWM1G
56
+ PWM1H , // PWM_PWM1H
57
+ PWM2A , // PWM_PWM2A
58
+ PWM2B , // PWM_PWM2B
59
+ PWM2C , // PWM_PWM2C
60
+ PWM2D , // PWM_PWM2D
61
+ PWM2E , // PWM_PWM2E
62
+ PWM2F , // PWM_PWM2F
63
+ PWM2G , // PWM_PWM2G
64
+ PWM2H , // PWM_PWM2H
65
65
};
66
66
67
67
static __IO uint16_t * PWM_MATCH [] = {
@@ -111,23 +111,23 @@ typedef enum {
111
111
112
112
typedef struct {
113
113
MTU2_PWMType port ;
114
- __IO uint16_t * pulse1 ;
115
- __IO uint16_t * pulse2 ;
116
- __IO uint16_t * period1 ;
117
- __IO uint16_t * period2 ;
118
- __IO uint8_t * tior ;
119
- __IO uint8_t * tcr ;
120
- __IO uint8_t * tmdr ;
114
+ __IO uint16_t * pulse1 ;
115
+ __IO uint16_t * pulse2 ;
116
+ __IO uint16_t * period1 ;
117
+ __IO uint16_t * period2 ;
118
+ __IO uint8_t * tior ;
119
+ __IO uint8_t * tcr ;
120
+ __IO uint8_t * tmdr ;
121
121
int max_period ;
122
122
} st_mtu2_ctrl_t ;
123
123
124
124
static st_mtu2_ctrl_t mtu2_ctl [] = {
125
125
{ TIOC0A , & MTU2TGRA_0 , & MTU2TGRC_0 , & MTU2TGRB_0 , & MTU2TGRD_0 , & MTU2TIORH_0 , & MTU2TCR_0 , & MTU2TMDR_0 , 125000 }, // PWM_TIOC0A
126
126
{ TIOC0C , & MTU2TGRC_0 , & MTU2TGRA_0 , & MTU2TGRB_0 , & MTU2TGRD_0 , & MTU2TIORL_0 , & MTU2TCR_0 , & MTU2TMDR_0 , 125000 }, // PWM_TIOC0C
127
- { TIOC1A , & MTU2TGRA_1 , NULL , & MTU2TGRB_1 , NULL , & MTU2TIOR_1 , & MTU2TCR_1 , & MTU2TMDR_1 , 503000 }, // PWM_TIOC1A
128
- { TIOC1B , & MTU2TGRB_1 , NULL , & MTU2TGRA_1 , NULL , & MTU2TIOR_1 , & MTU2TCR_1 , & MTU2TMDR_1 , 503000 }, // PWM_TIOC1B
129
- { TIOC2A , & MTU2TGRA_2 , NULL , & MTU2TGRB_2 , NULL , & MTU2TIOR_2 , & MTU2TCR_2 , & MTU2TMDR_2 , 2000000 }, // PWM_TIOC2A
130
- { TIOC2B , & MTU2TGRB_2 , NULL , & MTU2TGRA_2 , NULL , & MTU2TIOR_2 , & MTU2TCR_2 , & MTU2TMDR_2 , 2000000 }, // PWM_TIOC2B
127
+ { TIOC1A , & MTU2TGRA_1 , NULL , & MTU2TGRB_1 , NULL , & MTU2TIOR_1 , & MTU2TCR_1 , & MTU2TMDR_1 , 503000 }, // PWM_TIOC1A
128
+ { TIOC1B , & MTU2TGRB_1 , NULL , & MTU2TGRA_1 , NULL , & MTU2TIOR_1 , & MTU2TCR_1 , & MTU2TMDR_1 , 503000 }, // PWM_TIOC1B
129
+ { TIOC2A , & MTU2TGRA_2 , NULL , & MTU2TGRB_2 , NULL , & MTU2TIOR_2 , & MTU2TCR_2 , & MTU2TMDR_2 , 2000000 }, // PWM_TIOC2A
130
+ { TIOC2B , & MTU2TGRB_2 , NULL , & MTU2TGRA_2 , NULL , & MTU2TIOR_2 , & MTU2TCR_2 , & MTU2TMDR_2 , 2000000 }, // PWM_TIOC2B
131
131
{ TIOC3A , & MTU2TGRA_3 , & MTU2TGRC_3 , & MTU2TGRB_3 , & MTU2TGRD_3 , & MTU2TIORH_3 , & MTU2TCR_3 , & MTU2TMDR_3 , 2000000 }, // PWM_TIOC3A
132
132
{ TIOC3C , & MTU2TGRC_3 , & MTU2TGRA_3 , & MTU2TGRB_3 , & MTU2TGRD_3 , & MTU2TIORL_3 , & MTU2TCR_3 , & MTU2TMDR_3 , 2000000 }, // PWM_TIOC3C
133
133
{ TIOC4A , & MTU2TGRA_4 , & MTU2TGRC_4 , & MTU2TGRB_4 , & MTU2TGRD_4 , & MTU2TIORH_4 , & MTU2TCR_4 , & MTU2TMDR_4 , 2000000 }, // PWM_TIOC4A
@@ -138,7 +138,8 @@ static uint16_t init_mtu2_period_ch[5] = {0};
138
138
static int32_t mtu2_period_ch [5 ] = {1 , 1 , 1 , 1 , 1 };
139
139
#endif
140
140
141
- void pwmout_init (pwmout_t * obj , PinName pin ) {
141
+ void pwmout_init (pwmout_t * obj , PinName pin )
142
+ {
142
143
// determine the channel
143
144
PWMName pwm = (PWMName )pinmap_peripheral (pin , PinMap_PWM );
144
145
MBED_ASSERT (pwm != (PWMName )NC );
@@ -150,7 +151,7 @@ void pwmout_init(pwmout_t* obj, PinName pin) {
150
151
mtu2_init ();
151
152
152
153
obj -> pwm = pwm ;
153
- st_mtu2_ctrl_t * p_mtu2_ctl = & mtu2_ctl [(int )(obj -> pwm - MTU2_PWM_OFFSET )];
154
+ st_mtu2_ctrl_t * p_mtu2_ctl = & mtu2_ctl [(int )(obj -> pwm - MTU2_PWM_OFFSET )];
154
155
155
156
obj -> ch = (uint8_t )(((uint32_t )p_mtu2_ctl -> port & 0x000000F0 ) >> 4 );
156
157
if (obj -> ch == 4 ) {
@@ -208,18 +209,20 @@ void pwmout_init(pwmout_t* obj, PinName pin) {
208
209
}
209
210
}
210
211
211
- void pwmout_free (pwmout_t * obj ) {
212
+ void pwmout_free (pwmout_t * obj )
213
+ {
212
214
pwmout_write (obj , 0 );
213
215
mtu2_free ();
214
216
}
215
217
216
- void pwmout_write (pwmout_t * obj , float value ) {
218
+ void pwmout_write (pwmout_t * obj , float value )
219
+ {
217
220
uint32_t wk_cycle ;
218
221
219
222
if (obj -> pwm >= MTU2_PWM_OFFSET ) {
220
223
#ifdef FUMC_MTU2_PWM
221
224
/* PWM by MTU2 */
222
- st_mtu2_ctrl_t * p_mtu2_ctl = & mtu2_ctl [(int )(obj -> pwm - MTU2_PWM_OFFSET )];
225
+ st_mtu2_ctrl_t * p_mtu2_ctl = & mtu2_ctl [(int )(obj -> pwm - MTU2_PWM_OFFSET )];
223
226
uint8_t tmp_tstr_st ;
224
227
225
228
if (value < 0.0f ) {
@@ -229,7 +232,7 @@ void pwmout_write(pwmout_t* obj, float value) {
229
232
} else {
230
233
// Do Nothing
231
234
}
232
- wk_cycle = (uint32_t )* p_mtu2_ctl -> period1 ;
235
+ wk_cycle = (uint32_t ) * p_mtu2_ctl -> period1 ;
233
236
if ((obj -> ch == 4 ) || (obj -> ch == 3 )) {
234
237
tmp_tstr_st = (1 << (obj -> ch + 3 ));
235
238
} else {
@@ -291,18 +294,19 @@ void pwmout_write(pwmout_t* obj, float value) {
291
294
}
292
295
}
293
296
294
- float pwmout_read (pwmout_t * obj ) {
297
+ float pwmout_read (pwmout_t * obj )
298
+ {
295
299
uint32_t wk_cycle ;
296
300
float value ;
297
301
298
302
if (obj -> pwm >= MTU2_PWM_OFFSET ) {
299
303
#ifdef FUMC_MTU2_PWM
300
304
/* PWM by MTU2 */
301
305
uint32_t wk_pulse ;
302
- st_mtu2_ctrl_t * p_mtu2_ctl = & mtu2_ctl [(int )(obj -> pwm - MTU2_PWM_OFFSET )];
306
+ st_mtu2_ctrl_t * p_mtu2_ctl = & mtu2_ctl [(int )(obj -> pwm - MTU2_PWM_OFFSET )];
303
307
304
- wk_cycle = (uint32_t )* p_mtu2_ctl -> period1 ;
305
- wk_pulse = (uint32_t )* p_mtu2_ctl -> pulse1 ;
308
+ wk_cycle = (uint32_t ) * p_mtu2_ctl -> period1 ;
309
+ wk_pulse = (uint32_t ) * p_mtu2_ctl -> pulse1 ;
306
310
value = ((float )wk_pulse / (float )wk_cycle );
307
311
#endif
308
312
} else {
@@ -320,16 +324,19 @@ float pwmout_read(pwmout_t* obj) {
320
324
return (value > 1.0f ) ? (1.0f ) : (value );
321
325
}
322
326
323
- void pwmout_period (pwmout_t * obj , float seconds ) {
327
+ void pwmout_period (pwmout_t * obj , float seconds )
328
+ {
324
329
pwmout_period_us (obj , seconds * 1000000.0f );
325
330
}
326
331
327
- void pwmout_period_ms (pwmout_t * obj , int ms ) {
332
+ void pwmout_period_ms (pwmout_t * obj , int ms )
333
+ {
328
334
pwmout_period_us (obj , ms * 1000 );
329
335
}
330
336
331
337
#ifdef FUNC_MOTOR_CTL_PWM
332
- static void set_duty_again (__IO uint16_t * p_pwmpbfr , uint16_t last_cycle , uint16_t new_cycle ){
338
+ static void set_duty_again (__IO uint16_t * p_pwmpbfr , uint16_t last_cycle , uint16_t new_cycle )
339
+ {
333
340
uint16_t wk_pwmpbfr ;
334
341
float value ;
335
342
uint16_t v ;
@@ -342,7 +349,8 @@ static void set_duty_again(__IO uint16_t *p_pwmpbfr, uint16_t last_cycle, uint16
342
349
#endif
343
350
344
351
#ifdef FUMC_MTU2_PWM
345
- static void set_mtu2_duty_again (__IO uint16_t * p_pwmpbfr , uint16_t last_cycle , uint16_t new_cycle ){
352
+ static void set_mtu2_duty_again (__IO uint16_t * p_pwmpbfr , uint16_t last_cycle , uint16_t new_cycle )
353
+ {
346
354
uint16_t wk_pwmpbfr ;
347
355
float value ;
348
356
@@ -353,7 +361,8 @@ static void set_mtu2_duty_again(__IO uint16_t *p_pwmpbfr, uint16_t last_cycle, u
353
361
#endif
354
362
355
363
// Set the PWM period, keeping the duty cycle the same.
356
- void pwmout_period_us (pwmout_t * obj , int us ) {
364
+ void pwmout_period_us (pwmout_t * obj , int us )
365
+ {
357
366
uint32_t pclk_base ;
358
367
uint32_t wk_cycle ;
359
368
uint32_t wk_cks = 0 ;
@@ -365,7 +374,7 @@ void pwmout_period_us(pwmout_t* obj, int us) {
365
374
int max_us = 0 ;
366
375
367
376
/* PWM by MTU2 */
368
- st_mtu2_ctrl_t * p_mtu2_ctl = & mtu2_ctl [(int )(obj -> pwm - MTU2_PWM_OFFSET )];
377
+ st_mtu2_ctrl_t * p_mtu2_ctl = & mtu2_ctl [(int )(obj -> pwm - MTU2_PWM_OFFSET )];
369
378
uint8_t tmp_tcr_up ;
370
379
uint8_t tmp_tstr_st ;
371
380
@@ -387,10 +396,10 @@ void pwmout_period_us(pwmout_t* obj, int us) {
387
396
wk_cycle_mtu2 = (uint64_t )pclk_base * us ;
388
397
while (wk_cycle_mtu2 >= 65535000000 ) {
389
398
if ((obj -> ch == 1 ) && (wk_cks == 3 )) {
390
- wk_cks += 2 ;
399
+ wk_cks += 2 ;
391
400
} else if ((obj -> ch == 2 ) && (wk_cks == 3 )) {
392
401
wk_cycle_mtu2 >>= 2 ;
393
- wk_cks += 3 ;
402
+ wk_cks += 3 ;
394
403
}
395
404
wk_cycle_mtu2 >>= 2 ;
396
405
wk_cks ++ ;
@@ -494,15 +503,44 @@ void pwmout_period_us(pwmout_t* obj, int us) {
494
503
}
495
504
}
496
505
497
- void pwmout_pulsewidth (pwmout_t * obj , float seconds ) {
506
+ int pwmout_read_period_us (pwmout_t * obj )
507
+ {
508
+ uint32_t wk_cycle ;
509
+ float value ;
510
+
511
+ if (obj -> pwm >= MTU2_PWM_OFFSET ) {
512
+ #ifdef FUMC_MTU2_PWM
513
+ /* PWM by MTU2 */
514
+ st_mtu2_ctrl_t * p_mtu2_ctl = & mtu2_ctl [(int )(obj -> pwm - MTU2_PWM_OFFSET )];
515
+
516
+ wk_cycle = (uint32_t ) * p_mtu2_ctl -> period1 ;
517
+ #endif
518
+ } else {
519
+ #ifdef FUNC_MOTOR_CTL_PWM
520
+ /* PWM */
521
+ if (obj -> ch == 2 ) {
522
+ wk_cycle = PWMPWCYR_2 & 0x03ff ;
523
+ } else {
524
+ wk_cycle = PWMPWCYR_1 & 0x03ff ;
525
+ }
526
+ #endif
527
+ }
528
+
529
+ return wk_cycle ;
530
+ }
531
+
532
+ void pwmout_pulsewidth (pwmout_t * obj , float seconds )
533
+ {
498
534
pwmout_pulsewidth_us (obj , seconds * 1000000.0f );
499
535
}
500
536
501
- void pwmout_pulsewidth_ms (pwmout_t * obj , int ms ) {
537
+ void pwmout_pulsewidth_ms (pwmout_t * obj , int ms )
538
+ {
502
539
pwmout_pulsewidth_us (obj , ms * 1000 );
503
540
}
504
541
505
- void pwmout_pulsewidth_us (pwmout_t * obj , int us ) {
542
+ void pwmout_pulsewidth_us (pwmout_t * obj , int us )
543
+ {
506
544
float value = 0 ;
507
545
508
546
if (obj -> pwm >= MTU2_PWM_OFFSET ) {
@@ -529,6 +567,23 @@ void pwmout_pulsewidth_us(pwmout_t* obj, int us) {
529
567
pwmout_write (obj , value );
530
568
}
531
569
570
+ int pwmout_read_pulsewidth_us (pwmout_t * obj {
571
+ uint32_t wk_pulse = 0 ;
572
+
573
+ if (obj -> pwm >= MTU2_PWM_OFFSET )
574
+ {
575
+ #ifdef FUMC_MTU2_PWM
576
+ /* PWM by MTU2 */
577
+
578
+ st_mtu2_ctrl_t * p_mtu2_ctl = & mtu2_ctl [(int )(obj -> pwm - MTU2_PWM_OFFSET )];
579
+
580
+ wk_pulse = (uint32_t ) * p_mtu2_ctl -> pulse1 ;
581
+ #endif
582
+ }
583
+
584
+ return wk_pulse ;
585
+ }
586
+
532
587
const PinMap * pwmout_pinmap ()
533
588
{
534
589
return PinMap_PWM ;
0 commit comments