@@ -53,6 +53,8 @@ static hrtim_t hrtim_timer;
5353static HRTIM_HandleTypeDef HrtimHandle ;
5454static HRTIM_CompareCfgTypeDef sConfig_compare ;
5555static HRTIM_TimeBaseCfgTypeDef sConfig_time_base ;
56+
57+ static void _pwmout_obj_period_us (pwmout_t * obj , int us );
5658#endif
5759
5860/* Convert STM32 Cube HAL channel to LL channel */
@@ -142,9 +144,9 @@ static void _pwmout_init_direct(pwmout_t *obj, const PinMap *pinmap)
142144 pin_function (pinmap -> pin , pinmap -> function );
143145 pin_mode (pinmap -> pin , PullNone );
144146
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 ) ;
148150
149151 // Initialize the HRTIM structure
150152 HrtimHandle .Instance = HRTIM1 ;
@@ -444,6 +446,15 @@ float pwmout_read(pwmout_t *obj)
444446 if (obj -> period > 0 ) {
445447 value = (float )(obj -> pulse ) / (float )(obj -> period );
446448 }
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+
447458 return ((value > (float )1.0 ) ? (float )(1.0 ) : (value ));
448459}
449460
@@ -464,24 +475,7 @@ void pwmout_period_us(pwmout_t *obj, int us)
464475 if (obj -> pwm == PWM_I ) {
465476 float dc = pwmout_read (obj );
466477
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 );
485479
486480 sConfig_time_base .Mode = HRTIM_MODE_CONTINUOUS ;
487481 sConfig_time_base .Period = obj -> period ;
@@ -602,4 +596,27 @@ const PinMap *pwmout_pinmap()
602596 return PinMap_PWM ;
603597}
604598
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+
605622#endif
0 commit comments