@@ -116,6 +116,19 @@ void timer_init(uint8_t pwmChoice)
116
116
timer -> TASKS_START = 0x01 ;
117
117
}
118
118
119
+ static void timer_free ()
120
+ {
121
+ NRF_TIMER_Type * timer = Timers [0 ];
122
+ for (uint8_t i = 1 ; i < NO_PWMS ; i ++ ){
123
+ if (PWM_taken [i ]){
124
+ break ;
125
+ }
126
+ if ((i == NO_PWMS - 1 ) && (!PWM_taken [i ]))
127
+ timer -> TASKS_STOP = 0x01 ;
128
+ }
129
+ }
130
+
131
+
119
132
/** @brief Function for initializing the GPIO Tasks/Events peripheral.
120
133
*/
121
134
void gpiote_init (PinName pin , uint8_t channel_number )
@@ -154,6 +167,14 @@ void gpiote_init(PinName pin, uint8_t channel_number)
154
167
__NOP ();
155
168
}
156
169
170
+ static void gpiote_free (PinName pin ,uint8_t channel_number )
171
+ {
172
+ NRF_GPIOTE -> TASKS_OUT [channel_number ] = 0 ;
173
+ NRF_GPIOTE -> CONFIG [channel_number ] = 0 ;
174
+ NRF_GPIO -> PIN_CNF [pin ] = (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos );
175
+
176
+ }
177
+
157
178
/** @brief Function for initializing the Programmable Peripheral Interconnect peripheral.
158
179
*/
159
180
static void ppi_init (uint8_t pwm )
@@ -173,6 +194,16 @@ static void ppi_init(uint8_t pwm)
173
194
(1 << (channel_number + 1 ));
174
195
}
175
196
197
+ static void ppi_free (uint8_t pwm )
198
+ {
199
+ //using ppi channels 0-7 (only 0-7 are available)
200
+ uint8_t channel_number = 2 * pwm ;
201
+
202
+ // Disable PPI channels.
203
+ NRF_PPI -> CHEN &= (~(1 << channel_number ))
204
+ & (~(1 << (channel_number + 1 )));
205
+ }
206
+
176
207
void setModulation (pwmout_t * obj , uint8_t toggle , uint8_t high )
177
208
{
178
209
if (high ) {
@@ -239,11 +270,13 @@ void pwmout_init(pwmout_t *obj, PinName pin)
239
270
pwmout_write (obj , 0 );
240
271
}
241
272
242
- void pwmout_free (pwmout_t * obj )
243
- {
273
+ void pwmout_free (pwmout_t * obj ) {
244
274
MBED_ASSERT (obj -> pwm != (PWMName )NC );
245
- PWM_taken [obj -> pwm ] = 0 ;
246
275
pwmout_write (obj , 0 );
276
+ PWM_taken [obj -> pwm ] = 0 ;
277
+ timer_free ();
278
+ ppi_free (obj -> pwm );
279
+ gpiote_free (obj -> pin ,obj -> pwm );
247
280
}
248
281
249
282
void pwmout_write (pwmout_t * obj , float value )
0 commit comments