QTimer3 works but QTimer1 doesn't

xenington

Well-known member
Hi Everyone

Can someone please tell me why this code works on pin 15 of a T4.1 (sounds a buzzer):

Code:
long buzzerThreshold = 48000;                                // threshold tone frequency
uint16_t buzzerDutyOnTime = buzzerThreshold / 4;            // default volume duty cycle 1:3 on time = 25%
uint16_t buzzerDutyOffTime = (buzzerThreshold / 4) * 3;    // default volume duty cycle 1:3 off time = 75%

void setup() {
  CCM_CCGR6 |= CCM_CCGR6_QTIMER3(CCM_CCGR_ON);  // enable QTIMER3 clock p.1091
  IOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B1_03 = 0x01;        // set mux mode pin 15 to QTIMER3_TIMER3 p.495
  TMR3_ENBL = 0;                                        // disable timer for setup p.3008
  TMR3_LOAD3 = 0;                                     // intitial/reset value p.2998
  TMR3_CNTR3 = 0;                                     // reset counter to 0 p.2999
  TMR3_SCTRL3 = 0x01;                             // TMR_SCTRL_OEN (output enable) p.3002 p.3024
  TMR3_CSCTRL3 = 0x06;                          // TMR_CSCTRL_CL2(1) | TMR_CSCTRL_CL1(2) p.3004
  TMR3_COMP23 = buzzerDutyOnTime;     // pulse width ON time in ticks p.2998 p.3009
  TMR3_CMPLD23 = buzzerDutyOnTime;    // ON time preload value p.3003 p.3009
  TMR3_COMP13 = buzzerDutyOffTime;     // pulse width OFF time in ticks p.2997 p.3009
  TMR3_CMPLD13 = buzzerDutyOffTime;   // OFF time preload value p.3003 p.3009
  TMR3_CTRL3 = 0x3024;                           // TMR_CTRL_CM(1)| TMR_CTRL_PCS(13) | TMR_CTRL_LENGTH | TMR_CTRL_OUTMODE(4) p.2999
                                                                   // prescaler 1 = 3024, prescaler 32 = 3A24
  TMR3_ENBL = 0x08;                                 // enable timer / buzzer p.3008
}

void loop() {}

But this code does not work on pin 12?

Code:
long buzzerThreshold = 48000;                                 // threshold tone frequency
uint16_t buzzerDutyOnTime = buzzerThreshold / 4;             // default volume duty cycle 1:3 on time = 25%
uint16_t buzzerDutyOffTime = (buzzerThreshold / 4) * 3;     // default volume duty cycle 1:3 off time = 75%

void setup() {
  CCM_CCGR6 |= CCM_CCGR6_QTIMER1(CCM_CCGR_ON);     // enable QTIMER1 clock p.1091
  IOMUXC_SW_MUX_CTL_PAD_GPIO_B0_01 = 0x01;                  // set mux mode pin 12 to QTIMER1_TIMER1 p.509
  TMR1_ENBL = 0;                                   // disable timer for setup p.3008
  TMR1_LOAD1 = 0;                                // intitial/reset value p.2998
  TMR1_CNTR1 = 0;                                // reset counter to 0 p.2999
  TMR1_SCTRL1 = 0x01;                        // TMR_SCTRL_OEN (output enable) p.3002 p.3023
  TMR1_CSCTRL1 = 0x06;                         // TMR_CSCTRL_CL2(1) | TMR_CSCTRL_CL1(2) p.3004
  TMR1_COMP21 = buzzerDutyOnTime;     // pulse width ON time in ticks p.2998 p.3009
  TMR1_CMPLD21 = buzzerDutyOnTime;    // ON time preload value p.3003 p.3009
  TMR1_COMP11 = buzzerDutyOffTime;     // pulse width OFF time in ticks p.2997 p.3009
  TMR1_CMPLD11 = buzzerDutyOffTime;   // OFF time preload value p.3003 p.3009
  TMR1_CTRL1 = 0x3024;                          // TMR_CTRL_CM(1)| TMR_CTRL_PCS(13) | TMR_CTRL_LENGTH | TMR_CTRL_OUTMODE(4) p.2999
                                                                   // prescaler 1 = 3024, prescaler 32 = 3A24
  TMR1_ENBL = 0x08;                              // enable timer / buzzer p.3008 (enable when required)
}

void loop() {}

It's bound to be something obvious. Thank you for your help.
 
There are four quad timers each consisting of four timer channels (hence the "quad" name). In the first code you're using timer 3 channel 3, in the second code you are using timer 1 channel 1 but set TMR1_ENBL to 8 which turns on channel 3.
 
Back
Top