Un autre exemple plus clair éventuellement (PWMH0 à 1 MHz):
/******************************************************************************/
/* PWMH0 1 MHz */
/******************************************************************************/
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
PMC->PMC_PCER1 |= PMC_PCER1_PID36; // PWM power ON
PIOC->PIO_PDR |= PIO_PDR_P3; // Set pin to a peripheral
PIOB->PIO_ABSR |= PIO_PC3B_PWMH0; // Set PWM pin peripheral type B for PWMH0 (Arduino pin 35)
PWM->PWM_CLK = PWM_CLK_PREB(0) | PWM_CLK_DIVB(2); // select Frequency : Mck/2 = 42 MHz
PWM->PWM_CH_NUM[0].PWM_CMR = PWM_CMR_CPRE_CLKB; // The period is left aligned, clock source as CLKB on channel 0
PWM->PWM_CH_NUM[0].PWM_CPRD = 42; // Set the PWM frequency 42 MHz/42 = 1 MHz
PWM->PWM_CH_NUM[0].PWM_CDTY = 20; // Set the PWM duty cycle to (CDTY/CPRD) * 100 %
PWM->PWM_IER1 = PWM_IER1_CHID0; // Interrupt on Channel 0 counter
NVIC_EnableIRQ(PWM_IRQn); // Enable interrupt
PWM->PWM_ENA = PWM_ENA_CHID0; // Enable PWM channel 0
}
void loop() {
}
void PWM_Handler() {
static uint32_t Count;
PWM->PWM_ISR1; // Clear status register
if (Count++ == 1000000) {
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); // Toggle pin every 1 Hz
Count = 0;
}
}