@@ -77,33 +77,37 @@ void common_hal_pulseio_pwmout_reset_ok(pulseio_pwmout_obj_t *self) {
77
77
}
78
78
}
79
79
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
+
80
105
void pwmout_reset (void ) {
81
106
for (size_t i = 0 ; i < MP_ARRAY_SIZE (pwms ); i ++ ) {
82
107
if (never_reset_pwm [i ] > 0 ) {
83
108
continue ;
84
109
}
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 );
107
111
}
108
112
}
109
113
@@ -148,9 +152,9 @@ pwmout_result_t common_hal_pulseio_pwmout_construct(pulseio_pwmout_obj_t* self,
148
152
self -> channel = CHANNELS_PER_PWM ; // out-of-range value.
149
153
bool pwm_already_in_use ;
150
154
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 ];
154
158
pwm_already_in_use = pwm -> ENABLE & SPIM_ENABLE_ENABLE_Msk ;
155
159
if (pwm_already_in_use ) {
156
160
if (variable_frequency ) {
@@ -199,6 +203,7 @@ pwmout_result_t common_hal_pulseio_pwmout_construct(pulseio_pwmout_obj_t* self,
199
203
nrf_pwm_disable (pwm );
200
204
201
205
if (!pwm_already_in_use ) {
206
+ reset_single_pwmout (pwm_index );
202
207
nrf_pwm_configure (pwm , base_clock , NRF_PWM_MODE_UP , countertop );
203
208
}
204
209
0 commit comments