@@ -53,6 +53,8 @@ static hrtim_t hrtim_timer;
53
53
static HRTIM_HandleTypeDef HrtimHandle ;
54
54
static HRTIM_CompareCfgTypeDef sConfig_compare ;
55
55
static HRTIM_TimeBaseCfgTypeDef sConfig_time_base ;
56
+
57
+ static void _pwmout_obj_period_us (pwmout_t * obj , int us );
56
58
#endif
57
59
58
60
/* Convert STM32 Cube HAL channel to LL channel */
@@ -142,9 +144,9 @@ static void _pwmout_init_direct(pwmout_t *obj, const PinMap *pinmap)
142
144
pin_function (pinmap -> pin , pinmap -> function );
143
145
pin_mode (pinmap -> pin , PullNone );
144
146
145
- obj -> period = 0 ;
146
- obj -> pulse = 0 ;
147
- obj -> prescaler = 0 ;
147
+ // Initialize obj with default values ( period 550Hz, duty 0%)
148
+ _pwmout_obj_period_us ( obj , 18000 ) ;
149
+ obj -> pulse = ( uint32_t )(( float ) obj -> period * 1.0 + 0.5 ) ;
148
150
149
151
// Initialize the HRTIM structure
150
152
HrtimHandle .Instance = HRTIM1 ;
@@ -444,6 +446,15 @@ float pwmout_read(pwmout_t *obj)
444
446
if (obj -> period > 0 ) {
445
447
value = (float )(obj -> pulse ) / (float )(obj -> period );
446
448
}
449
+
450
+ if (obj -> pwm == PWM_I ) {
451
+ if (value <= (float )0.0 ) {
452
+ value = 1.0 ;
453
+ } else if (value >= (float )1.0 ) {
454
+ value = 0.0 ;
455
+ }
456
+ }
457
+
447
458
return ((value > (float )1.0 ) ? (float )(1.0 ) : (value ));
448
459
}
449
460
@@ -464,24 +475,7 @@ void pwmout_period_us(pwmout_t *obj, int us)
464
475
if (obj -> pwm == PWM_I ) {
465
476
float dc = pwmout_read (obj );
466
477
467
- uint32_t frequency ;
468
- uint32_t clocksource = __HAL_RCC_GET_HRTIM1_SOURCE ();
469
- switch (clocksource ) {
470
- case RCC_HRTIM1CLK_TIMCLK :
471
- frequency = HAL_RCC_GetHCLKFreq ();
472
- break ;
473
- case RCC_HRTIM1CLK_CPUCLK :
474
- frequency = HAL_RCC_GetSysClockFreq ();
475
- break ;
476
- }
477
-
478
- /* conversion from us to clock tick */
479
- obj -> period = us * (frequency / 1000000 ) / 4 ;
480
- obj -> prescaler = HRTIM_PRESCALERRATIO_DIV4 ;
481
-
482
- if (obj -> period > 0xFFDFU ) {
483
- obj -> period = 0xFFDFU ;
484
- }
478
+ _pwmout_obj_period_us (obj , us );
485
479
486
480
sConfig_time_base .Mode = HRTIM_MODE_CONTINUOUS ;
487
481
sConfig_time_base .Period = obj -> period ;
@@ -602,4 +596,27 @@ const PinMap *pwmout_pinmap()
602
596
return PinMap_PWM ;
603
597
}
604
598
599
+ #if defined(HRTIM1 )
600
+ void _pwmout_obj_period_us (pwmout_t * obj , int us ) {
601
+ uint32_t frequency ;
602
+ uint32_t clocksource = __HAL_RCC_GET_HRTIM1_SOURCE ();
603
+ switch (clocksource ) {
604
+ case RCC_HRTIM1CLK_TIMCLK :
605
+ frequency = HAL_RCC_GetHCLKFreq ();
606
+ break ;
607
+ case RCC_HRTIM1CLK_CPUCLK :
608
+ frequency = HAL_RCC_GetSysClockFreq ();
609
+ break ;
610
+ }
611
+
612
+ /* conversion from us to clock tick */
613
+ obj -> period = us * (frequency / 1000000 ) / 4 ;
614
+ obj -> prescaler = HRTIM_PRESCALERRATIO_DIV4 ;
615
+
616
+ if (obj -> period > 0xFFDFU ) {
617
+ obj -> period = 0xFFDFU ;
618
+ }
619
+ }
620
+ #endif
621
+
605
622
#endif
0 commit comments