/* Sets up the TCC module to send PWM output to the PWR LED */ void init_breathing_animation() { // Setup the pin to be used as a TCC output pin_mux(PIN_LED); pin_dir(PIN_LED, true); // Disable the TCC tcc(PWR_LED_TCC_CHAN)->CTRLA.reg = 0; // Reset the TCC tcc(PWR_LED_TCC_CHAN)->CTRLA.reg = TCC_CTRLA_SWRST; // Enable the timer timer_clock_enable(PWR_LED_TCC_CHAN); /* Set the prescalar setting to the highest division so we have more time in between interrupts to complete the math */ tcc(PWR_LED_TCC_CHAN)->CTRLA.bit.PRESCALER = TCC_CTRLA_PRESCALER_DIV1024_Val; // Set the waveform generator to generate a PWM signal // It uses polarity setting of 1 (switches from DIR to ~DIR) tcc(PWR_LED_TCC_CHAN)->WAVE.reg = TCC_WAVE_WAVEGEN_NPWM | TCC_WAVE_POL0; // Set the top count value (when a match will be hit and the waveform output flipped) tcc(PWR_LED_TCC_CHAN)->PER.reg = MAX_COUNTER; // Set the counter number, starting at 0% duty cycle tcc(PWR_LED_TCC_CHAN)->CC[PWR_LED_CC_CHAN].reg = counter; // Set the second CCB value value be dark for simplicity tcc(PWR_LED_TCC_CHAN)->CCB[PWR_LED_CC_CHAN].bit.CCB = counter; // Enable IRQ's in the NVIC NVIC_EnableIRQ(TCC1_IRQn); // Set the priority to low NVIC_SetPriority(TCC1_IRQn, 0xff); // Enable interrupts so we can modify the counter value (creates breathing effect) tcc(PWR_LED_TCC_CHAN)->INTENSET.reg = TC_INTENSET_OVF; // Wait for all the changes to finish loading? while (tcc(PWR_LED_TCC_CHAN)->SYNCBUSY.reg > 0); // Enable the TCC tcc(PWR_LED_TCC_CHAN)->CTRLA.reg = TCC_CTRLA_ENABLE; }
int main(void) { if (PM->RCAUSE.reg & (PM_RCAUSE_POR | PM_RCAUSE_BOD12 | PM_RCAUSE_BOD33)) { // On powerup, force a clean reset of the MT7620 pin_low(PIN_SOC_RST); pin_out(PIN_SOC_RST); // turn off 3.3V to SoC pin_low(PIN_SOC_PWR); pin_out(PIN_SOC_PWR); // pull 1.8V low pin_low(PIN_18_V); pin_out(PIN_18_V); clock_init_crystal(GCLK_SYSTEM, GCLK_32K); timer_clock_enable(TC_BOOT); // hold everything low boot_delay_ms(50); // power off for 50ms pin_high(PIN_SOC_PWR); boot_delay_ms(2); // 2ms until 1.8 rail comes on pin_high(PIN_18_V); boot_delay_ms(50); // 50ms before soc rst comes on } else { clock_init_crystal(GCLK_SYSTEM, GCLK_32K); } pin_mux(PIN_USB_DM); pin_mux(PIN_USB_DP); usb_init(); usb_attach(); NVIC_SetPriority(USB_IRQn, 0xff); pin_high(PIN_LED); pin_out(PIN_LED); pin_in(PIN_SOC_RST); pin_high(PIN_SOC_PWR); pin_out(PIN_SOC_PWR); pin_low(PORT_A.power); pin_out(PORT_A.power); pin_low(PORT_B.power); pin_out(PORT_B.power); pin_pull_up(PIN_BRIDGE_CS); pin_pull_up(PIN_FLASH_CS); pin_pull_up(PIN_SERIAL_TX); pin_pull_up(PIN_SERIAL_RX); dma_init(); NVIC_EnableIRQ(DMAC_IRQn); NVIC_SetPriority(DMAC_IRQn, 0xff); eic_init(); NVIC_EnableIRQ(EIC_IRQn); NVIC_SetPriority(EIC_IRQn, 0xff); evsys_init(); NVIC_EnableIRQ(EVSYS_IRQn); NVIC_SetPriority(EVSYS_IRQn, 0); adc_init(GCLK_SYSTEM, ADC_REFCTRL_REFSEL_INTVCC1); dac_init(GCLK_32K); bridge_init(); port_init(&port_a, 1, &PORT_A, GCLK_PORT_A, TCC_PORT_A, DMA_PORT_A_TX, DMA_PORT_A_RX); port_init(&port_b, 2, &PORT_B, GCLK_PORT_B, TCC_PORT_B, DMA_PORT_B_TX, DMA_PORT_B_RX); __enable_irq(); SCB->SCR |= SCB_SCR_SLEEPONEXIT_Msk; init_systick(); while (1) { __WFI(); } }