You can set or clear a pin inside a Timer Counter interrupt Handler used to output a PWM signal, but don't set a PWM frequency much higher than 1.5 MHz because the interrupt takes some time to proceed, e.g.:
/*******************************************************************************/
/* TIOA7 Frequency = 1.5 MHz over pin 3 */
/*******************************************************************************/
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
PMC->PMC_PCER1 |= PMC_PCER1_PID34; // TC7 power ON - Timer Counter 2 channel 1 IS TC7 - See page 38
PIOC->PIO_PDR |= PIO_PDR_P28; // The pin is no more driven by GPIO
PIOC->PIO_ABSR |= PIO_PC28B_TIOA7; // Periperal type B - See page 859
TC2->TC_CHANNEL[1].TC_CMR = TC_CMR_TCCLKS_TIMER_CLOCK1 // MCK/2, clk on rising edge
| TC_CMR_WAVE // Waveform mode
| TC_CMR_WAVSEL_UP_RC // UP mode with automatic trigger on RC Compare
| TC_CMR_ACPA_CLEAR // Clear TIOA7 on RA compare match -- See page 883
| TC_CMR_ACPC_SET; // Set TIOA7 on RC compare match
TC2->TC_CHANNEL[1].TC_RC = 28; //<********************* Frequency = (Mck/128)/TC_RC Hz = 1.5 MHz
TC2->TC_CHANNEL[1].TC_RA = 14; //<******************** Duty cycle = (TC_RA/TC_RC) * 100 %
TC2->TC_CHANNEL[1].TC_IER = TC_IER_CPAS | TC_IER_CPCS; // Interrupt on RA and RC compare matchs
NVIC_EnableIRQ(TC7_IRQn);
TC2->TC_CHANNEL[1].TC_CCR = TC_CCR_SWTRG | TC_CCR_CLKEN; // Software trigger TC7 counter and enable
}
void TC7_Handler() {
static uint32_t Count;
uint32_t status = TC2->TC_CHANNEL[1].TC_SR;
if (status & TC_SR_CPCS) {
// Todo : Clear a data pin
}
else { // if (status & TC_SR_CPA
// Todo: Set a data pin
}
Count++;
if (Count == 1500000) {
Count = 0;
digitalWrite(LED_BUILTIN, ! digitalRead(LED_BUILTIN));
}
}
void loop() {
}