@@ -77,33 +77,37 @@ void common_hal_pulseio_pwmout_reset_ok(pulseio_pwmout_obj_t *self) {
7777 }
7878}
7979
80+ void reset_single_pwmout (uint8_t i ) {
81+ NRF_PWM_Type * pwm = pwms [i ];
82+
83+ pwm -> ENABLE = 0 ;
84+ pwm -> MODE = PWM_MODE_UPDOWN_Up ;
85+ pwm -> DECODER = PWM_DECODER_LOAD_Individual ;
86+ pwm -> LOOP = 0 ;
87+ pwm -> PRESCALER = PWM_PRESCALER_PRESCALER_DIV_1 ; // default is 500 hz
88+ pwm -> COUNTERTOP = (PWM_MAX_FREQ /500 ); // default is 500 hz
89+
90+ pwm -> SEQ [0 ].PTR = (uint32_t ) pwm_seq [i ];
91+ pwm -> SEQ [0 ].CNT = CHANNELS_PER_PWM ; // default mode is Individual --> count must be 4
92+ pwm -> SEQ [0 ].REFRESH = 0 ;
93+ pwm -> SEQ [0 ].ENDDELAY = 0 ;
94+
95+ pwm -> SEQ [1 ].PTR = 0 ;
96+ pwm -> SEQ [1 ].CNT = 0 ;
97+ pwm -> SEQ [1 ].REFRESH = 0 ;
98+ pwm -> SEQ [1 ].ENDDELAY = 0 ;
99+
100+ for (int ch = 0 ; ch < CHANNELS_PER_PWM ; ch ++ ) {
101+ pwm_seq [i ][ch ] = (1 << 15 ); // polarity = 0
102+ }
103+ }
104+
80105void pwmout_reset (void ) {
81106 for (size_t i = 0 ; i < MP_ARRAY_SIZE (pwms ); i ++ ) {
82107 if (never_reset_pwm [i ] > 0 ) {
83108 continue ;
84109 }
85- NRF_PWM_Type * pwm = pwms [i ];
86-
87- pwm -> ENABLE = 0 ;
88- pwm -> MODE = PWM_MODE_UPDOWN_Up ;
89- pwm -> DECODER = PWM_DECODER_LOAD_Individual ;
90- pwm -> LOOP = 0 ;
91- pwm -> PRESCALER = PWM_PRESCALER_PRESCALER_DIV_1 ; // default is 500 hz
92- pwm -> COUNTERTOP = (PWM_MAX_FREQ /500 ); // default is 500 hz
93-
94- pwm -> SEQ [0 ].PTR = (uint32_t ) pwm_seq [i ];
95- pwm -> SEQ [0 ].CNT = CHANNELS_PER_PWM ; // default mode is Individual --> count must be 4
96- pwm -> SEQ [0 ].REFRESH = 0 ;
97- pwm -> SEQ [0 ].ENDDELAY = 0 ;
98-
99- pwm -> SEQ [1 ].PTR = 0 ;
100- pwm -> SEQ [1 ].CNT = 0 ;
101- pwm -> SEQ [1 ].REFRESH = 0 ;
102- pwm -> SEQ [1 ].ENDDELAY = 0 ;
103-
104- for (int ch = 0 ; ch < CHANNELS_PER_PWM ; ch ++ ) {
105- pwm_seq [i ][ch ] = (1 << 15 ); // polarity = 0
106- }
110+ reset_single_pwmout (i );
107111 }
108112}
109113
@@ -148,9 +152,9 @@ pwmout_result_t common_hal_pulseio_pwmout_construct(pulseio_pwmout_obj_t* self,
148152 self -> channel = CHANNELS_PER_PWM ; // out-of-range value.
149153 bool pwm_already_in_use ;
150154 NRF_PWM_Type * pwm ;
151-
152- for (size_t i = 0 ; i < MP_ARRAY_SIZE (pwms ); i ++ ) {
153- pwm = pwms [i ];
155+ size_t pwm_index = 0 ;
156+ for (; pwm_index < MP_ARRAY_SIZE (pwms ); pwm_index ++ ) {
157+ pwm = pwms [pwm_index ];
154158 pwm_already_in_use = pwm -> ENABLE & SPIM_ENABLE_ENABLE_Msk ;
155159 if (pwm_already_in_use ) {
156160 if (variable_frequency ) {
@@ -199,6 +203,7 @@ pwmout_result_t common_hal_pulseio_pwmout_construct(pulseio_pwmout_obj_t* self,
199203 nrf_pwm_disable (pwm );
200204
201205 if (!pwm_already_in_use ) {
206+ reset_single_pwmout (pwm_index );
202207 nrf_pwm_configure (pwm , base_clock , NRF_PWM_MODE_UP , countertop );
203208 }
204209
0 commit comments