@@ -193,8 +193,8 @@ void analogWrite( uint32_t ulPin, uint32_t ulValue )
193
193
// uint32_t pwm_name = g_APinDescription[ulPin].ulTCChannel ;
194
194
uint8_t isTC = 0 ;
195
195
uint8_t Channelx ;
196
- Tc * TCx ;
197
- Tcc * TCCx ;
196
+ Tc * TCx = 0 ;
197
+ Tcc * TCCx = 0 ;
198
198
199
199
if ( (attr & PIN_ATTR_ANALOG ) == PIN_ATTR_ANALOG )
200
200
{
@@ -234,59 +234,45 @@ void analogWrite( uint32_t ulPin, uint32_t ulValue )
234
234
switch ( GetTCNumber ( g_APinDescription [ulPin ].ulPWMChannel ) )
235
235
{
236
236
case 0 : // TCC0
237
- //Enable GCLK for TCC0 (timer counter input clock)
238
- GCLK -> CLKCTRL .reg = (uint16_t ) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID ( GCM_TCC0_TCC1 )) ;
239
- break ;
240
-
241
237
case 1 : // TCC1
242
- //Enable GCLK for TCC1 (timer counter input clock)
238
+ // Enable GCLK for TCC0 and TCC1 (timer counter input clock)
243
239
GCLK -> CLKCTRL .reg = (uint16_t ) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID ( GCM_TCC0_TCC1 )) ;
244
- break ;
245
240
246
- case 2 : // TCC2
247
- //Enable GCLK for TCC2 (timer counter input clock)
248
- GCLK -> CLKCTRL .reg = (uint16_t ) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID ( GCM_TCC2_TC3 )) ;
241
+ while ( GCLK -> STATUS .bit .SYNCBUSY == 1 ) ;
249
242
break ;
250
243
244
+ case 2 : // TCC2
251
245
case 3 : // TC3
252
- //Enable GCLK for TC3 (timer counter input clock)
253
- GCLK -> CLKCTRL .reg = (uint16_t ) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID ( GCM_TCC2_TC3 ));
246
+ // Enable GCLK for TCC2 and TC3 (timer counter input clock)
247
+ GCLK -> CLKCTRL .reg = (uint16_t ) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID ( GCM_TCC2_TC3 )) ;
254
248
break ;
255
249
256
250
case 4 : // TC4
257
- //Enable GCLK for TC4 (timer counter input clock)
258
- GCLK -> CLKCTRL .reg = (uint16_t ) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID ( GCM_TC4_TC5 ));
259
- break ;
260
-
261
251
case 5 : // TC5
262
- //Enable GCLK for TC5 (timer counter input clock)
263
- GCLK -> CLKCTRL .reg = (uint16_t ) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID ( GCM_TC4_TC5 )) ;
252
+ // Enable GCLK for TC4 and TC5 (timer counter input clock)
253
+ GCLK -> CLKCTRL .reg = (uint16_t ) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID ( GCM_TC4_TC5 ));
264
254
break ;
265
255
266
- case 6 : // TC6
267
- //Enable GCLK for TC6 (timer counter input clock)
256
+ case 6 : // TC6 (not available on Zero)
257
+ case 7 : // TC7 (not available on Zero)
258
+ // Enable GCLK for TC6 and TC7 (timer counter input clock)
268
259
GCLK -> CLKCTRL .reg = (uint16_t ) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID ( GCM_TC6_TC7 ));
269
260
break ;
270
-
271
- case 7 : // TC7
272
- //Enable GCLK for TC7 (timer counter input clock)
273
- GCLK -> CLKCTRL .reg = (uint16_t ) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID ( GCM_TC6_TC7 )) ;
274
- break ;
275
261
}
276
262
277
263
// Set PORT
278
264
if ( isTC )
279
265
{
280
266
// -- Configure TC
281
- //DISABLE TCx
267
+ // DISABLE TCx
282
268
TCx -> COUNT8 .CTRLA .reg &=~(TC_CTRLA_ENABLE );
283
- //Set Timer counter Mode to 8 bits
269
+ // Set Timer counter Mode to 8 bits
284
270
TCx -> COUNT8 .CTRLA .reg |= TC_CTRLA_MODE_COUNT8 ;
285
- //Set TCx as normal PWM
271
+ // Set TCx as normal PWM
286
272
TCx -> COUNT8 .CTRLA .reg |= TC_CTRLA_WAVEGEN_NPWM ;
287
- //Set TCx in waveform mode Normal PWM
273
+ // Set TCx in waveform mode Normal PWM
288
274
TCx -> COUNT8 .CC [Channelx ].reg = (uint8_t ) ulValue ;
289
- //Set PER to maximum counter value (resolution : 0xFF)
275
+ // Set PER to maximum counter value (resolution : 0xFF)
290
276
TCx -> COUNT8 .PER .reg = 0xFF ;
291
277
// Enable TCx
292
278
TCx -> COUNT8 .CTRLA .reg |= TC_CTRLA_ENABLE ;
@@ -295,15 +281,15 @@ void analogWrite( uint32_t ulPin, uint32_t ulValue )
295
281
{
296
282
// -- Configure TCC
297
283
298
- //DISABLE TCCx
284
+ // DISABLE TCCx
299
285
TCCx -> CTRLA .reg &=~(TCC_CTRLA_ENABLE );
300
- //Set TCx as normal PWM
286
+ // Set TCx as normal PWM
301
287
TCCx -> WAVE .reg |= TCC_WAVE_WAVEGEN_NPWM ;
302
- //Set TCx in waveform mode Normal PWM
288
+ // Set TCx in waveform mode Normal PWM
303
289
TCCx -> CC [Channelx ].reg = (uint32_t )ulValue ;
304
- //Set PER to maximum counter value (resolution : 0xFF)
290
+ // Set PER to maximum counter value (resolution : 0xFF)
305
291
TCCx -> PER .reg = 0xFF ;
306
- //ENABLE TCCx
292
+ // ENABLE TCCx
307
293
TCCx -> CTRLA .reg |= TCC_CTRLA_ENABLE ;
308
294
}
309
295
0 commit comments