/** **************************************************************************************** * @brief All GPIO interrupt callback **************************************************************************************** */ void gpio_interrupt_callback(enum gpio_pin pin) { switch(pin) { case BUTTON1_PIN: //Button 1 is used to enter adv mode. usr_button1_cb(); break; case BUTTON2_PIN: //Button 2 is used to control buzzer off usr_button2_cb(); break; #if (defined(QN_TEST_CTRL_PIN)) case QN_TEST_CTRL_PIN: //When test controll pin is changed to low level, this function will reboot system. gpio_disable_interrupt(QN_TEST_CTRL_PIN); syscon_SetCRSS(QN_SYSCON, SYSCON_MASK_REBOOT_SYS); break; #endif default: break; } }
/** **************************************************************************************** * @brief All GPIO interrupt callback **************************************************************************************** */ void gpio_interrupt_callback(enum gpio_pin pin) { switch(pin) { case BUTTON1_PIN: //Button 1 is used to enter adv mode. usr_button1_cb(); break; #if (defined(QN_TEST_CTRL_PIN)) case QN_TEST_CTRL_PIN: //When test controll pin is changed to low level, this function will reboot system. gpio_disable_interrupt(QN_TEST_CTRL_PIN); syscon_SetCRSS(QN_SYSCON, SYSCON_MASK_REBOOT_SYS); break; #endif case ACCEL_INT_PIN: accel_int_handler(); break; default: //QPRINTF("GPIO INT DETECTED but not dealt with!!!\r\n"); break; } }
/** **************************************************************************************** * @brief Setup the microcontroller system. * * Initialize the system clock and pins. ***************************************************************************************** */ void SystemInit(void) { /* ************************** * Sub module clock setting ************************** */ syscon_SetIvrefX32WithMask(QN_SYSCON, SYSCON_MASK_DVDD12_SW_EN, MASK_ENABLE); syscon_set_sysclk_src(CLK_XTAL, __XTAL); #if __XTAL == XTAL_32MHz calibration_init(XTAL_32M); #else calibration_init(XTAL_16M); #endif ref_pll_calibration(); clk32k_enable(__32K_TYPE); #if QN_32K_RCO rco_calibration(); #endif // Reset SPI1 module(since the default register value was changed in bootloader) syscon_SetCRSS(QN_SYSCON, SYSCON_MASK_USART1_RST); syscon_SetCRSC(QN_SYSCON, SYSCON_MASK_USART1_RST); /* Disable all peripheral clock, will be enabled in the driver initilization. The next function performs the equivalent effect of a collection of these functions. timer_clock_off(QN_TIMER0); timer_clock_off(QN_TIMER1); timer_clock_off(QN_TIMER2); timer_clock_off(QN_TIMER3); uart_clock_off(QN_UART0); uart_clock_off(QN_UART1); spi_clock_off(QN_SPI0); spi_clock_off(QN_SPI1); flash_clock_off(); gpio_clock_off(); adc_clock_off(); dma_clock_off(); pwm_clock_off(); */ syscon_SetCRSS(QN_SYSCON, SYSCON_MASK_GATING_TIMER0 | SYSCON_MASK_GATING_TIMER1 | SYSCON_MASK_GATING_TIMER2 | SYSCON_MASK_GATING_TIMER3 | SYSCON_MASK_GATING_UART0 | SYSCON_MASK_GATING_UART1 | SYSCON_MASK_GATING_SPI0 | SYSCON_MASK_GATING_SPI1 | SYSCON_MASK_GATING_SPI_AHB | SYSCON_MASK_GATING_GPIO | SYSCON_MASK_GATING_ADC | SYSCON_MASK_GATING_DMA | SYSCON_MASK_GATING_PWM); // calibration changed system clock setting // Configure sytem clock. syscon_set_sysclk_src(CLK_XTAL, __XTAL); syscon_set_ahb_clk(__AHB_CLK); syscon_set_apb_clk(__APB_CLK); syscon_set_ble_clk(__BLE_CLK); syscon_set_timer_clk(__TIMER_CLK); syscon_set_usart_clk((uint32_t)QN_UART0, __USART_CLK); syscon_set_usart_clk((uint32_t)QN_UART1, __USART_CLK); /* ************************** * IO configuration ************************** */ SystemIOCfg(); /* ************************** * Peripheral setting ************************** */ }
/** **************************************************************************************** * @brief Setup the microcontroller system. * * Initialize the system clock and pins. ***************************************************************************************** */ void SystemInit(void) { /* ************************** * Sub module clock setting ************************** */ // Reset SPI1 module(since the default register value was changed in bootloader) syscon_SetCRSS(QN_SYSCON, SYSCON_MASK_USART1_RST); syscon_SetCRSC(QN_SYSCON, SYSCON_MASK_USART1_RST); /* Disable all peripheral clock, will be enabled in the driver initilization. The next function performs the equivalent effect of a collection of these functions. timer_clock_off(QN_TIMER0); timer_clock_off(QN_TIMER1); timer_clock_off(QN_TIMER2); timer_clock_off(QN_TIMER3); uart_clock_off(QN_UART0); uart_clock_off(QN_UART1); spi_clock_off(QN_SPI0); spi_clock_off(QN_SPI1); flash_clock_off(); gpio_clock_off(); adc_clock_off(); dma_clock_off(); pwm_clock_off(); */ syscon_SetCRSS(QN_SYSCON, SYSCON_MASK_GATING_TIMER0 | SYSCON_MASK_GATING_TIMER1 | SYSCON_MASK_GATING_TIMER2 | SYSCON_MASK_GATING_TIMER3 | SYSCON_MASK_GATING_UART0 | SYSCON_MASK_GATING_UART1 | SYSCON_MASK_GATING_SPI0 | SYSCON_MASK_GATING_SPI1 | SYSCON_MASK_GATING_SPI_AHB | SYSCON_MASK_GATING_GPIO | SYSCON_MASK_GATING_ADC | SYSCON_MASK_GATING_DMA | SYSCON_MASK_GATING_PWM); // Configure sytem clock. syscon_set_sysclk_src(CLK_XTAL, __XTAL); syscon_set_ahb_clk(__AHB_CLK); syscon_set_ble_clk(__BLE_CLK); syscon_set_apb_clk(__APB_CLK); syscon_set_timer_clk(__TIMER_CLK); syscon_set_usart_clk((uint32_t)QN_UART0, __USART_CLK); syscon_set_usart_clk((uint32_t)QN_UART1, __USART_CLK); clk32k_enable(__32K_TYPE); /* ************************** * IO configuration ************************** */ SystemIOCfg(); /* ************************** * Peripheral setting ************************** */ // GPIO initialization for led, button & test control pin. gpio_init(gpio_interrupt_callback); // LED led_init(); // Test controll pin is input to check work mode #if (defined(QN_TEST_CTRL_PIN)) gpio_pull_set(QN_TEST_CTRL_PIN, GPIO_PULL_UP); gpio_set_direction_field(QN_TEST_CTRL_PIN, (uint32_t)GPIO_INPUT); #if (defined(CFG_HCI_UART)) // Initialize HCI UART port uart_init(QN_HCI_PORT, USARTx_CLK(0), UART_9600); uart_tx_enable(QN_HCI_PORT, MASK_ENABLE); uart_rx_enable(QN_HCI_PORT, MASK_ENABLE); #elif (defined(CFG_HCI_SPI)) // Initialize HCI SPI port spi_init(QN_HCI_PORT, SPI_BITRATE(1000000), SPI_8BIT, SPI_SLAVE_MOD); gpio_set_direction_field(CFG_HCI_SPI_WR_CTRL_PIN, (uint32_t)GPIO_OUTPUT); gpio_write_pin(CFG_HCI_SPI_WR_CTRL_PIN, GPIO_HIGH); #endif #endif // Button button_init(); #if (QN_DBG_PRINT) uart_init(QN_DEBUG_UART, USARTx_CLK(0), UART_9600); uart_tx_enable(QN_DEBUG_UART, MASK_ENABLE); uart_rx_enable(QN_DEBUG_UART, MASK_ENABLE); #endif }
/** **************************************************************************************** * @brief Enter low power mode * @param[in] en enabled peripheral at low power mode * @description * This function is used to set MCU entering into low power mode. ***************************************************************************************** */ void enter_low_power_mode(uint32_t en) { PGCR1_restore = syscon_GetPGCR1(QN_SYSCON); syscon_SetPGCR2WithMask(QN_SYSCON, SYSCON_MASK_PD_STATE|SYSCON_MASK_PMUENABLE, MASK_DISABLE); low_power_mode_en = 1; // set system clock to 32K syscon_set_sysclk_src(CLK_LOW_32K, __32K_TYPE); syscon_SetCMDCRWithMask(QN_SYSCON, SYSCON_MASK_AHB_DIV_BYPASS|SYSCON_MASK_APB_DIV_BYPASS, MASK_ENABLE); uint32_t mask; // power off all not needed modules mask = SYSCON_MASK_DIS_OSC | SYSCON_MASK_DIS_BG | SYSCON_MASK_DIS_V2I | SYSCON_MASK_DIS_BUCK | SYSCON_MASK_DIS_VREG_A | SYSCON_MASK_DIS_VREG_D | SYSCON_MASK_DIS_XTAL #if QN_32K_RCO == TRUE | SYSCON_MASK_DIS_XTAL32 #endif | SYSCON_MASK_DIS_REF_PLL | SYSCON_MASK_DIS_LO_VCO | SYSCON_MASK_DIS_LO_PLL | SYSCON_MASK_DIS_PA | SYSCON_MASK_DIS_LNA | SYSCON_MASK_DIS_LNA_PKDET | SYSCON_MASK_DIS_MIXER | SYSCON_MASK_DIS_PPF_PKDET | SYSCON_MASK_DIS_PPF | SYSCON_MASK_DIS_RX_PKDET | SYSCON_MASK_DIS_RX_ADC | SYSCON_MASK_DIS_SAR_ADC #if (QN_32K_RCO == FALSE) | SYSCON_MASK_DIS_RCO #endif | SYSCON_MASK_DIS_MEM7 | SYSCON_MASK_DIS_MEM6 | SYSCON_MASK_DIS_MEM5 | SYSCON_MASK_DIS_MEM4 | SYSCON_MASK_DIS_MEM3 | SYSCON_MASK_DIS_MEM2 | SYSCON_MASK_DIS_MEM1 | SYSCON_MASK_DIS_SAR_BUF ; syscon_SetPGCR1WithMask(QN_SYSCON, mask&(~QN_MEM_RETENTION), MASK_ENABLE); #if 0 // gating all not needed modules mask = SYSCON_MASK_GATING_TIMER3 | SYSCON_MASK_GATING_TIMER2 #if QN_32K_RCO == FALSE | SYSCON_MASK_GATING_TIMER1 #endif | SYSCON_MASK_GATING_TIMER0 | SYSCON_MASK_GATING_UART1 | SYSCON_MASK_GATING_UART0 | SYSCON_MASK_GATING_SPI1 | SYSCON_MASK_GATING_SPI0 //| SYSCON_MASK_GATING_32K_CLK | SYSCON_MASK_GATING_SPI_AHB //| SYSCON_MASK_GATING_GPIO | SYSCON_MASK_GATING_ADC | SYSCON_MASK_GATING_DMA //| SYSCON_MASK_GATING_BLE_AHB | SYSCON_MASK_GATING_PWM ; syscon_SetCRSS(QN_SYSCON, mask&(~en)); #endif // set PMU to 0.8V, b1 should set PMU after OSC disabled syscon_SetPGCR2WithMask(QN_SYSCON, SYSCON_MASK_DVDD12_PMU_SET, MASK_ENABLE); }
void HardFault_Handler(void) { // Reboot system syscon_SetCRSS(QN_SYSCON, SYSCON_MASK_REBOOT_SYS); }