/** **************************************************************************************** * @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 }