@@ -478,10 +478,10 @@ static inline void sm_config_set_sideset(pio_sm_config *c, uint bit_count, bool
478478 * \sa sm_config_set_clkdiv()
479479 */
480480static inline void sm_config_set_clkdiv_int_frac8 (pio_sm_config * c , uint32_t div_int , uint8_t div_frac8 ) {
481- static_assert (PIO_SM0_CLKDIV_INT_MSB - PIO_SM0_CLKDIV_INT_LSB == 15 , "" );
481+ static_assert (REG_FIELD_WIDTH ( PIO_SM0_CLKDIV_INT ) == 16 , "" );
482482 invalid_params_if (HARDWARE_PIO , div_int >> 16 );
483483 invalid_params_if (HARDWARE_PIO , div_int == 0 && div_frac8 != 0 );
484- static_assert (PIO_SM0_CLKDIV_FRAC_MSB - PIO_SM0_CLKDIV_FRAC_LSB == 7 , "" );
484+ static_assert (REG_FIELD_WIDTH ( PIO_SM0_CLKDIV_FRAC ) == 8 , "" );
485485 c -> clkdiv =
486486 (((uint )div_frac8 ) << PIO_SM0_CLKDIV_FRAC_LSB ) |
487487 (((uint )div_int ) << PIO_SM0_CLKDIV_INT_LSB );
@@ -494,17 +494,18 @@ static inline void sm_config_set_clkdiv_int_frac(pio_sm_config *c, uint16_t div_
494494
495495static inline void pio_calculate_clkdiv8_from_float (float div , uint32_t * div_int , uint8_t * div_frac8 ) {
496496 valid_params_if (HARDWARE_PIO , div >= 1 && div <= 65536 );
497+ const int frac_bit_count = REG_FIELD_WIDTH (PIO_SM0_CLKDIV_FRAC );
497498#if PICO_PIO_CLKDIV_ROUND_NEAREST
498- div += 0.5f / (1 << ( PIO_SM0_CLKDIV_FRAC_MSB + 1 - PIO_SM0_CLKDIV_FRAC_LSB ) ); // round to the nearest 1/256
499+ div += 0.5f / (1 << frac_bit_count ); // round to the nearest 1/256
499500#endif
500501 * div_int = (uint16_t )div ;
501502 // not a strictly necessary check, but if this changes, then this method should
502503 // probably no longer be used in favor of one with a larger fraction
503- static_assert (PIO_SM0_CLKDIV_FRAC_MSB - PIO_SM0_CLKDIV_FRAC_LSB == 7 , "" );
504+ static_assert (REG_FIELD_WIDTH ( PIO_SM0_CLKDIV_FRAC ) == 8 , "" );
504505 if (* div_int == 0 ) {
505506 * div_frac8 = 0 ;
506507 } else {
507- * div_frac8 = (uint8_t )((div - (float )* div_int ) * (1u << 8u ));
508+ * div_frac8 = (uint8_t )((div - (float )* div_int ) * (1u << frac_bit_count ));
508509 }
509510}
510511
@@ -1675,10 +1676,10 @@ void pio_sm_drain_tx_fifo(PIO pio, uint sm);
16751676static inline void pio_sm_set_clkdiv_int_frac8 (PIO pio , uint sm , uint32_t div_int , uint8_t div_frac8 ) {
16761677 check_pio_param (pio );
16771678 check_sm_param (sm );
1678- static_assert (PIO_SM0_CLKDIV_INT_MSB - PIO_SM0_CLKDIV_INT_LSB == 15 , "" );
1679+ static_assert (REG_FIELD_WIDTH ( PIO_SM0_CLKDIV_INT ) == 16 , "" );
16791680 invalid_params_if (HARDWARE_PIO , div_int >> 16 );
16801681 invalid_params_if (HARDWARE_PIO , div_int == 0 && div_frac8 != 0 );
1681- static_assert (PIO_SM0_CLKDIV_FRAC_MSB - PIO_SM0_CLKDIV_FRAC_LSB == 7 , "" );
1682+ static_assert (REG_FIELD_WIDTH ( PIO_SM0_CLKDIV_FRAC ) == 8 , "" );
16821683 pio -> sm [sm ].clkdiv =
16831684 (((uint )div_frac8 ) << PIO_SM0_CLKDIV_FRAC_LSB ) |
16841685 (((uint )div_int ) << PIO_SM0_CLKDIV_INT_LSB );
0 commit comments