/* * 1. AT command and log: UART3 * 2. HCI interface: UART0, GPIO_PMU, handled by host.c. * 3. Display: DMA1, SPIx8_0, GPIO (for cs) * 4. Touchpad: I2C3 * 5. PSRAM: OSPI * 6. external Flash: DMA0, SPIx8_1 * 7. DSP: IPC, RPMSG * 8. DSP XIP Flash: QSPI1 * 9. Sensors: handled by 1010 * 10. System clock, XIP Flash: handled by sleep procedure */ #include "fr30xx.h" #include "driver_display.h" #include "driver_touchpad.h" #include "driver_psram.h" #include "IC_W25Qxx.h" #include "ext_flash.h" #include "app_config.h" #include "app_hw.h" PARALLEL_HandTypeDef hparallel; struct hw_gpio_state_t { uint16_t PortA_PullEN; uint16_t PortB_PullEN; uint16_t PortC_PullEN; uint16_t PortD_PullEN; uint16_t PortA_PullSelect; uint16_t PortB_PullSelect; uint16_t PortC_PullSelect; uint16_t PortD_PullSelect; uint32_t PortA_PullResCfg; uint32_t PortB_PullResCfg; uint32_t PortC_PullResCfg; uint32_t PortD_PullResCfg; uint32_t PortA_DriveCfg; uint32_t PortB_DriveCfg; uint32_t PortC_DriveCfg; uint32_t PortD_DriveCfg; uint32_t PortA_L_FuncMux; uint32_t PortA_H_FuncMux; uint32_t PortB_L_FuncMux; uint32_t PortB_H_FuncMux; uint32_t PortC_L_FuncMux; uint32_t PortC_H_FuncMux; uint32_t PortD_L_FuncMux; uint32_t PortD_H_FuncMux; uint32_t QSPI_PullSelect; uint32_t QSPI_PullEN; uint32_t OSPI_PullSelect; uint32_t OSPI_PullEN; uint16_t GPIOA_OutputEN; uint16_t GPIOA_OUT_DATA; uint16_t GPIOA_EXTI_EN; uint16_t GPIOA_EXTI_INT_EN; uint32_t GPIOA_EXTI_TYPE; uint16_t GPIOB_OutputEN; uint16_t GPIOB_OUT_DATA; uint16_t GPIOB_EXTI_EN; uint16_t GPIOB_EXTI_INT_EN; uint32_t GPIOB_EXTI_TYPE; uint16_t GPIOC_OutputEN; uint16_t GPIOC_OUT_DATA; uint16_t GPIOC_EXTI_EN; uint16_t GPIOC_EXTI_INT_EN; uint32_t GPIOC_EXTI_TYPE; uint16_t GPIOD_OutputEN; uint16_t GPIOD_OUT_DATA; uint16_t GPIOD_EXTI_EN; uint16_t GPIOD_EXTI_INT_EN; uint32_t GPIOD_EXTI_TYPE; }; static struct hw_gpio_state_t gpio_state; UART_HandleTypeDef uart_log_handle; DMA_HandleTypeDef dma_display_handle; SPI_HandleTypeDef spi_display_handle; I2C_HandleTypeDef i2c_touchpad_handle; SPI_HandleTypeDef spi_flash_handle; DMA_HandleTypeDef dma_flash_handle; void app_at_rx_done(struct __UART_HandleTypeDef *handle); void display_cs_set(void) { gpio_write_pin(GPIOC, GPIO_PIN_5, GPIO_PIN_SET); } void display_cs_clear(void) { gpio_write_pin(GPIOC, GPIO_PIN_5, GPIO_PIN_CLEAR); } #if BOARD_SEL == BOARD_EVB_FR5090 void display_reset_set(void) { gpio_write_pin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET); } void display_reset_clear(void) { gpio_write_pin(GPIOB, GPIO_PIN_14, GPIO_PIN_CLEAR); } void display_vci_set(void) { gpio_write_pin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET); } void display_vci_clear(void) { gpio_write_pin(GPIOB, GPIO_PIN_13, GPIO_PIN_CLEAR); } bool display_te_status(void) { return 1; } #elif BOARD_SEL == BOARD_EVB_FR3092E void display_reset_set(void) { gpio_write_pin(GPIOB, GPIO_PIN_11, GPIO_PIN_SET);//2014.1.16 by hsp //extern void btdm_host_send_vendor_cmd(uint8_t type, uint8_t length, void *data); //uint8_t cmd = GPIO_PIN_7; //bit7 = BT_PA7 bit6 = BT_PA6 bit5 = BT_PA5 bit4 = BT_PA4 //btdm_host_send_vendor_cmd(0x18, 1, &cmd); } void display_reset_clear(void) { gpio_write_pin(GPIOB, GPIO_PIN_11, GPIO_PIN_CLEAR);//2014.1.16 by hsp //extern void btdm_host_send_vendor_cmd(uint8_t type, uint8_t length, void *data); //uint8_t cmd = GPIO_PIN_7; //bit7 = BT_PA7 bit6 = BT_PA6 bit5 = BT_PA5 bit4 = BT_PA4 //btdm_host_send_vendor_cmd(0x18, 1, &cmd); } void display_vci_set(void) { gpio_write_pin(GPIOC, GPIO_PIN_15, GPIO_PIN_SET); } void display_vci_clear(void) { gpio_write_pin(GPIOC, GPIO_PIN_15, GPIO_PIN_CLEAR); } bool display_te_status(void) { return gpio_read_pin(GPIOC, GPIO_PIN_7); } #elif BOARD_SEL == BOARD_EVB_FR3092E_CM void display_reset_set(void) { gpio_write_pin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET); } void display_reset_clear(void) { gpio_write_pin(GPIOB, GPIO_PIN_14, GPIO_PIN_CLEAR); } void display_vci_set(void) { gpio_write_pin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET); } void display_vci_clear(void) { gpio_write_pin(GPIOB, GPIO_PIN_13, GPIO_PIN_CLEAR); } bool display_te_status(void) { return gpio_read_pin(GPIOB, GPIO_PIN_15); } #elif BOARD_SEL == BOARD_EVB_FR3092E void display_reset_set(void) { gpio_write_pin(GPIOC, GPIO_PIN_6, GPIO_PIN_SET); } void display_reset_clear(void) { gpio_write_pin(GPIOC, GPIO_PIN_6, GPIO_PIN_CLEAR); } void display_vci_set(void) { gpio_write_pin(GPIOC, GPIO_PIN_15, GPIO_PIN_SET); } void display_vci_clear(void) { gpio_write_pin(GPIOC, GPIO_PIN_15, GPIO_PIN_CLEAR); } bool display_te_status(void) { return gpio_read_pin(GPIOC, GPIO_PIN_7); } #elif BOARD_SEL == BOARD_EVB_FR3092E_RGB void display_reset_set(void) { gpio_write_pin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET); } void display_reset_clear(void) { gpio_write_pin(GPIOB, GPIO_PIN_14, GPIO_PIN_CLEAR); } void display_vci_set(void) { gpio_write_pin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET); } void display_vci_clear(void) { gpio_write_pin(GPIOB, GPIO_PIN_13, GPIO_PIN_CLEAR); } bool display_te_status(void) { return gpio_read_pin(GPIOB, GPIO_PIN_15); } #else #error "choose correct board" #endif void display_delay_ms(uint32_t counter) { system_delay_us(counter * 1000); } #if BOARD_SEL == BOARD_EVB_FR5090 void touchpad_reset_set(void) { gpio_write_pin(GPIOC, GPIO_PIN_15, GPIO_PIN_SET); } void touchpad_reset_clear(void) { gpio_write_pin(GPIOC, GPIO_PIN_15, GPIO_PIN_CLEAR); } #elif BOARD_SEL == BOARD_EVB_FR3092E #if 1 //DISPLAY_TYPE_ICNA3310 void touchpad_reset_set(void) { gpio_write_pin(GPIOB, GPIO_PIN_15, GPIO_PIN_SET); } void touchpad_reset_clear(void) { gpio_write_pin(GPIOB, GPIO_PIN_15, GPIO_PIN_CLEAR); } #else void touchpad_reset_set(void) { gpio_write_pin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET); } void touchpad_reset_clear(void) { gpio_write_pin(GPIOA, GPIO_PIN_6, GPIO_PIN_CLEAR); } #endif #elif BOARD_SEL == BOARD_EVB_FR3092E_CM void touchpad_reset_set(void) { gpio_write_pin(GPIOC, GPIO_PIN_15, GPIO_PIN_SET); } void touchpad_reset_clear(void) { gpio_write_pin(GPIOC, GPIO_PIN_15, GPIO_PIN_CLEAR); } #elif BOARD_SEL == BOARD_EVB_FR3092E_RGB void touchpad_reset_set(void) { //gpio_write_pin(GPIOC, GPIO_PIN_15, GPIO_PIN_SET); } void touchpad_reset_clear(void) { //gpio_write_pin(GPIOC, GPIO_PIN_15, GPIO_PIN_CLEAR); } #else #error "choose correct board" #endif void touchpad_delay_ms(uint32_t counter) { system_delay_us(counter * 1000); } __RAM_CODE void hw_log_init(bool wake_up) { if (wake_up == false) { GPIO_InitTypeDef gpio_config; /* ========================================================== */ /* ========= Uart LOG configuration ========= */ /* ========================================================== */ /* configure PB4 and PB5 to UART3 function */ gpio_config.Pin = GPIO_PIN_4 | GPIO_PIN_5; gpio_config.Mode = GPIO_MODE_AF_PP; gpio_config.Pull = GPIO_PULLUP; gpio_config.Alternate = GPIO_FUNCTION_1; gpio_init(GPIOB, &gpio_config); __SYSTEM_UART3_CLK_ENABLE(); /* UART3: used for Log and AT command */ uart_log_handle.UARTx = UART3; uart_log_handle.Init.BaudRate = 921600; uart_log_handle.Init.DataLength = UART_DATA_LENGTH_8BIT; uart_log_handle.Init.StopBits = UART_STOPBITS_1; uart_log_handle.Init.Parity = UART_PARITY_NONE; uart_log_handle.Init.FIFO_Mode = UART_FIFO_ENABLE; uart_log_handle.TxCpltCallback = NULL; uart_log_handle.RxCpltCallback = app_at_rx_done; uart_init(&uart_log_handle); NVIC_EnableIRQ(UART3_IRQn); } else { __SYSTEM_UART3_CLK_ENABLE(); uart_init(&uart_log_handle); __UART_INT_RX_ENABLE(uart_log_handle.UARTx); NVIC_EnableIRQ(UART3_IRQn); } } __RAM_CODE void hw_display_init(bool wake_up) { if (wake_up == false) { GPIO_InitTypeDef gpio_config; #if 0 /* ========================================================== */ /* ========= Display interface configuration ========= */ /* ========================================================== */ /* config DMA1 for display */ __SYSTEM_DMA1_CLK_ENABLE(); dma_display_handle.DMAx = DMA1; dma_display_handle.Channel = DMA_Channel0; dma_display_handle.Init.Data_Flow = DMA_M2P_DMAC; dma_display_handle.Init.Request_ID = 2; system_dmac_request_id_config(SPIMX8_0_TX, DMA1_REQUEST_ID_2); dma_display_handle.Init.Source_Master_Sel = DMA_AHB_MASTER_3; dma_display_handle.Init.Desination_Master_Sel = DMA_AHB_MASTER_2; dma_display_handle.Init.Source_Inc = DMA_ADDR_INC_INC; dma_display_handle.Init.Desination_Inc = DMA_ADDR_INC_NO_CHANGE; dma_display_handle.Init.Source_Width = DMA_TRANSFER_WIDTH_32; dma_display_handle.Init.Desination_Width = DMA_TRANSFER_WIDTH_32; dma_display_handle.Init.Source_Burst_Len = DMA_BURST_LEN_4; dma_display_handle.Init.Desination_Burst_Len = DMA_BURST_LEN_4; dma_init(&dma_display_handle); NVIC_EnableIRQ(DMA1_IRQn); __SYSTEM_GPIOB_CLK_ENABLE(); __SYSTEM_GPIOC_CLK_ENABLE(); /* configure C0, C1, C2, C3, C4 to SPIx8_0 function */ gpio_config.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4; gpio_config.Mode = GPIO_MODE_AF_PP; gpio_config.Pull = GPIO_PULLUP; gpio_config.Alternate = GPIO_FUNCTION_5; gpio_init(GPIOC, &gpio_config); /* configure C5 to CS function */ gpio_config.Pin = GPIO_PIN_5; gpio_config.Mode = GPIO_MODE_OUTPUT_PP; gpio_config.Pull = GPIO_PULLUP; gpio_config.Alternate = GPIO_FUNCTION_0; gpio_init(GPIOC, &gpio_config); #endif __SYSTEM_PARALLEL_CLK_ENABLE(); __SYSTEM_PARALLEL_CLK_SELECT_SPLL(); __SYSTEM_GPIOA_CLK_ENABLE(); __SYSTEM_GPIOB_CLK_ENABLE(); __SYSTEM_GPIOC_CLK_ENABLE(); __SYSTEM_GPIOD_CLK_ENABLE(); __SYSTEM_DMA0_CLK_ENABLE(); __SYSTEM_DMA1_CLK_ENABLE(); static GPIO_InitTypeDef GPIO_Handle; GPIO_Handle.Alternate = GPIO_FUNCTION_8; GPIO_Handle.Mode = GPIO_MODE_AF_PP; GPIO_Handle.Pin = 0xffff;//0xffff; //DB0-DB7 GPIO_Handle.Pull = GPIO_PULLUP; gpio_init(GPIOC, &GPIO_Handle); GPIO_Handle.Alternate = GPIO_FUNCTION_8;// csx wrx rdx dcx PB12-PB15 GPIO_Handle.Mode = GPIO_MODE_AF_PP; GPIO_Handle.Pin = GPIO_PIN_12|GPIO_PIN_14|GPIO_PIN_13|GPIO_PIN_15;; GPIO_Handle.Pull = GPIO_PULLUP; gpio_init(GPIOB, &GPIO_Handle); /* PARALLEL Init */ hparallel.PARALLELx = PARALLEL0; //hparallel.Init.DataBusSelect = DATA_BUS_8_BIT; hparallel.Init.DataBusSelect = DATA_BUS_16_BIT; hparallel.Init.ParallelMode = MODE_8080; hparallel.PARALLELx->DATA_CFG.DATA_TRANS_SEQ_0 = 0; hparallel.PARALLELx->DATA_CFG.DATA_TRANS_SEQ_1 = 1; hparallel.PARALLELx->DATA_CFG.DATA_TRANS_SEQ_2 = 2; hparallel.PARALLELx->DATA_CFG.DATA_TRANS_SEQ_3 = 3; //16bit // hparallel.PARALLELx->DATA_CFG.DATA_TRANS_SEQ_0 = 3; // hparallel.PARALLELx->DATA_CFG.DATA_TRANS_SEQ_1 = 2; // hparallel.PARALLELx->DATA_CFG.DATA_TRANS_SEQ_2 = 1; // hparallel.PARALLELx->DATA_CFG.DATA_TRANS_SEQ_3 = 0; //8bit swap hparallel.PARALLELx->CRM.WRITE_CLK_CFG = 1; hparallel.PARALLELx->CRM.READ_CLK_CFG = 1; hparallel.Init.ReadClock = RDCLK_DIV_4; hparallel.Init.WriteClock = WDCLK_DIV_8; parallel_init(&hparallel); __PARALLEL_CS_SET(hparallel.PARALLELx); //__PARALLEL_CS_RELEASE(hparallel.PARALLELx); /* DMA Init */ #if 1 system_dmac_request_id_config(PARALLEL_INTERFACE,DMA1_REQUEST_ID_2); dma_display_handle.DMAx = DMA1; dma_display_handle.Channel = DMA_Channel1; dma_display_handle.Init.Data_Flow = DMA_M2P_DMAC; dma_display_handle.Init.Request_ID = DMA1_REQUEST_ID_2; dma_display_handle.Init.Source_Master_Sel = DMA_AHB_MASTER_3; dma_display_handle.Init.Desination_Master_Sel = DMA_AHB_MASTER_2; dma_display_handle.Init.Source_Inc = DMA_ADDR_INC_INC; dma_display_handle.Init.Desination_Inc = DMA_ADDR_INC_NO_CHANGE; dma_display_handle.Init.Source_Width = DMA_TRANSFER_WIDTH_32; dma_display_handle.Init.Desination_Width = DMA_TRANSFER_WIDTH_32; dma_display_handle.Init.Source_Burst_Len = DMA_BURST_LEN_16; dma_display_handle.Init.Desination_Burst_Len = DMA_BURST_LEN_16; dma_init(&dma_display_handle); NVIC_ClearPendingIRQ(DMA1_IRQn); NVIC_EnableIRQ(DMA1_IRQn); #else system_dmac_request_id_config(PARALLEL_INTERFACE,DMA0_REQUEST_ID_3); dma_display_handle.DMAx = DMA0; dma_display_handle.Channel = DMA_Channel2; dma_display_handle.Init.Data_Flow = DMA_M2P_DMAC; dma_display_handle.Init.Request_ID = DMA0_REQUEST_ID_3; dma_display_handle.Init.Source_Master_Sel = DMA_AHB_MASTER_3; dma_display_handle.Init.Desination_Master_Sel = DMA_AHB_MASTER_1; dma_display_handle.Init.Source_Inc = DMA_ADDR_INC_INC; dma_display_handle.Init.Desination_Inc = DMA_ADDR_INC_NO_CHANGE; dma_display_handle.Init.Source_Width = DMA_TRANSFER_WIDTH_32; dma_display_handle.Init.Desination_Width = DMA_TRANSFER_WIDTH_32; dma_display_handle.Init.Source_Burst_Len = DMA_BURST_LEN_16; dma_display_handle.Init.Desination_Burst_Len = DMA_BURST_LEN_16; dma_init(&dma_display_handle); NVIC_ClearPendingIRQ(DMA0_IRQn); NVIC_EnableIRQ(DMA0_IRQn); #endif #if BOARD_SEL == BOARD_EVB_FR5090 /* configure B13, PB14 to VCCI function, RESET function */ gpio_config.Pin = GPIO_PIN_13 | GPIO_PIN_14; gpio_config.Mode = GPIO_MODE_OUTPUT_PP; gpio_config.Pull = GPIO_PULLUP; gpio_config.Alternate = GPIO_FUNCTION_0; gpio_init(GPIOB, &gpio_config); #elif BOARD_SEL == BOARD_EVB_FR3092E #if 0 /* configure PC15, PC6 to VCCI function, RESET function n*/ gpio_config.Pin = GPIO_PIN_6 | GPIO_PIN_15; gpio_config.Mode = GPIO_MODE_OUTPUT_PP; gpio_config.Pull = GPIO_PULLUP; gpio_config.Alternate = GPIO_FUNCTION_0; gpio_init(GPIOC, &gpio_config); /* configure GPIO_PC7 to TE functio(interrupt pin) */ gpio_config.Pin = GPIO_PIN_7; gpio_config.Mode = GPIO_MODE_INPUT; gpio_config.Alternate = GPIO_FUNCTION_0; gpio_config.Pull = GPIO_PULLDOWN; gpio_init(GPIOC, &gpio_config); #endif #elif BOARD_SEL == BOARD_EVB_FR3092E_CM /* configure B13, PB14 to VCCI function, RESET function */ gpio_config.Pin = GPIO_PIN_13 | GPIO_PIN_14; gpio_config.Mode = GPIO_MODE_OUTPUT_PP; gpio_config.Pull = GPIO_PULLUP; gpio_config.Alternate = GPIO_FUNCTION_0; gpio_init(GPIOB, &gpio_config); /* configure GPIO_PB15 to TE functio(interrupt pin) */ gpio_config.Pin = GPIO_PIN_15; gpio_config.Mode = GPIO_MODE_INPUT; gpio_config.Alternate = GPIO_FUNCTION_0; gpio_config.Pull = GPIO_PULLDOWN; gpio_init(GPIOB, &gpio_config); #elif BOARD_SEL == BOARD_EVB_FR3092E_RGB /* configure PC15, PC6 to VCCI function, RESET function n*/ gpio_config.Pin = GPIO_PIN_6 | GPIO_PIN_15; gpio_config.Mode = GPIO_MODE_OUTPUT_PP; gpio_config.Pull = GPIO_PULLUP; gpio_config.Alternate = GPIO_FUNCTION_0; gpio_init(GPIOC, &gpio_config); /* configure GPIO_PC7 to TE functio(interrupt pin) */ gpio_config.Pin = GPIO_PIN_7; gpio_config.Mode = GPIO_MODE_INPUT; gpio_config.Alternate = GPIO_FUNCTION_0; gpio_config.Pull = GPIO_PULLDOWN; gpio_init(GPIOC, &gpio_config); #else #error "choose correct board" #endif #if 0 __SYSTEM_SPI_MASTER0_X8_CLK_ENABLE(); spi_display_handle.SPIx = SPIMX8_0; spi_display_handle.Init.Work_Mode = SPI_WORK_MODE_0; spi_display_handle.Init.Frame_Size = SPI_FRAME_SIZE_8BIT; #if BOARD_SEL == BOARD_EVB_FR5090 spi_display_handle.Init.BaudRate_Prescaler = 2; #elif BOARD_SEL == BOARD_EVB_FR3092E spi_display_handle.Init.BaudRate_Prescaler = 4; #elif BOARD_SEL == BOARD_EVB_FR3092E_CM spi_display_handle.Init.BaudRate_Prescaler = 4; #elif BOARD_SEL == BOARD_EVB_FR3092E_RGB spi_display_handle.Init.BaudRate_Prescaler = 4; #else #error "choose correct board" #endif spi_display_handle.Init.TxFIFOEmpty_Threshold = 20; spi_display_handle.Init.RxFIFOFull_Threshold = 0; spi_master_init(&spi_display_handle); display_cs_set(); display_init(); #endif gpio_config.Pin = GPIO_PIN_11|GPIO_PIN_3; gpio_config.Mode = GPIO_MODE_OUTPUT_PP; gpio_config.Pull = GPIO_PULLUP; gpio_config.Alternate = GPIO_FUNCTION_0; gpio_init(GPIOB, &gpio_config); display_reset_set(); system_delay_us(10000); display_reset_clear(); system_delay_us(20000); display_reset_set(); system_delay_us(50000); display_init(); } else { // __SYSTEM_DMA1_CLK_ENABLE(); // system_dmac_request_id_config(SPIMX8_0_TX, DMA1_REQUEST_ID_2); // dma_init(&dma_display_handle); // NVIC_EnableIRQ(DMA1_IRQn); // // __SYSTEM_GPIOB_CLK_ENABLE(); // __SYSTEM_GPIOC_CLK_ENABLE(); // __SYSTEM_SPI_MASTER0_X8_CLK_ENABLE(); // spi_display_handle.Init.Frame_Size = SPI_FRAME_SIZE_8BIT; // spi_master_init(&spi_display_handle); } } __RAM_CODE void hw_touchpad_init(bool wake_up) { if (wake_up == false) { GPIO_InitTypeDef gpio_config; /* ========================================================== */ /* ========= TP configuration ========= */ /* ========================================================== */ __SYSTEM_GPIOC_CLK_ENABLE(); #if BOARD_SEL == BOARD_EVB_FR5090 /* configure GPIO_PC6 and GPIO_PC7 to I2C3 mode */ gpio_config.Pin = GPIO_PIN_6|GPIO_PIN_7; gpio_config.Mode = GPIO_MODE_AF_PP; gpio_config.Pull = GPIO_PULLUP; gpio_config.Alternate = GPIO_FUNCTION_3; gpio_init(GPIOC, &gpio_config); /* configure GPIO_PC15 to reset pin */ gpio_config.Pin = GPIO_PIN_15; gpio_config.Mode = GPIO_MODE_OUTPUT_PP; gpio_config.Alternate = GPIO_FUNCTION_0; gpio_init(GPIOC, &gpio_config); /* configure GPIO_PC14 to interrupt pin */ gpio_config.Pin = GPIO_PIN_14; gpio_config.Mode = GPIO_MODE_EXTI_IT_FALLING; gpio_config.Alternate = GPIO_FUNCTION_0; gpio_config.Pull = GPIO_PULLUP; gpio_init(GPIOC, &gpio_config); #elif BOARD_SEL == BOARD_EVB_FR3092E #if 1 //DISPLAY_TYPE_ICNA3310 /* configure GPIO_PB12 and GPIO_PB13 to I2C2 mode */ gpio_config.Pin = GPIO_PIN_12|GPIO_PIN_13; gpio_config.Mode = GPIO_MODE_AF_PP; gpio_config.Pull = GPIO_PULLUP; gpio_config.Alternate = GPIO_FUNCTION_3; gpio_init(GPIOB, &gpio_config); /* configure GPIO_PB15 to reset pin */ gpio_config.Pin = GPIO_PIN_15; gpio_config.Mode = GPIO_MODE_OUTPUT_PP; gpio_config.Alternate = GPIO_FUNCTION_0; gpio_init(GPIOB, &gpio_config); /* configure GPIO_PB14 to interrupt pin */ gpio_config.Pin = GPIO_PIN_14; gpio_config.Mode = GPIO_MODE_EXTI_IT_FALLING; gpio_config.Alternate = GPIO_FUNCTION_0; gpio_config.Pull = GPIO_PULLUP; gpio_init(GPIOB, &gpio_config); exti_interrupt_enable(GPIOB,EXTI_LINE_14); exti_clear_LineStatus(GPIOB,EXTI_LINE_14); NVIC_EnableIRQ(GPIOB_IRQn); #else /* configure GPIO_PA4 and GPIO_PA5 to I2C2 mode */ gpio_config.Pin = GPIO_PIN_4|GPIO_PIN_5; gpio_config.Mode = GPIO_MODE_AF_PP; gpio_config.Pull = GPIO_PULLUP; gpio_config.Alternate = GPIO_FUNCTION_3; gpio_init(GPIOA, &gpio_config); __SYSTEM_GPIOA_CLK_ENABLE(); /* configure GPIO_PA6 to reset pin */ gpio_config.Pin = GPIO_PIN_6; gpio_config.Mode = GPIO_MODE_OUTPUT_PP; gpio_config.Alternate = GPIO_FUNCTION_0; gpio_init(GPIOA, &gpio_config); __SYSTEM_GPIOB_CLK_ENABLE(); /* configure GPIO_PB14 to interrupt pin */ gpio_config.Pin = GPIO_PIN_14; gpio_config.Mode = GPIO_MODE_EXTI_IT_FALLING; gpio_config.Alternate = GPIO_FUNCTION_0; gpio_config.Pull = GPIO_PULLUP; gpio_init(GPIOB, &gpio_config); #endif #elif BOARD_SEL == BOARD_EVB_FR3092E_CM /* configure GPIO_PC6 and GPIO_PC7 to I2C3 mode */ gpio_config.Pin = GPIO_PIN_6|GPIO_PIN_7; gpio_config.Mode = GPIO_MODE_AF_PP; gpio_config.Pull = GPIO_PULLUP; gpio_config.Alternate = GPIO_FUNCTION_3; gpio_init(GPIOC, &gpio_config); /* configure GPIO_PC15 to reset pin */ gpio_config.Pin = GPIO_PIN_15; gpio_config.Mode = GPIO_MODE_OUTPUT_PP; gpio_config.Alternate = GPIO_FUNCTION_0; gpio_init(GPIOC, &gpio_config); /* configure GPIO_PC14 to interrupt pin */ gpio_config.Pin = GPIO_PIN_14; gpio_config.Mode = GPIO_MODE_EXTI_IT_FALLING; gpio_config.Alternate = GPIO_FUNCTION_0; gpio_config.Pull = GPIO_PULLUP; gpio_init(GPIOC, &gpio_config); #elif BOARD_SEL == BOARD_EVB_FR3092E_RGB #else #error "choose correct board" #endif /* I2C Init */ #if BOARD_SEL == BOARD_EVB_FR5090 __SYSTEM_I2C3_CLK_ENABLE(); i2c_touchpad_handle.I2Cx = I2C3; i2c_touchpad_handle.Init.I2C_Mode = I2C_MODE_MASTER_7BIT; i2c_touchpad_handle.Init.SCL_HCNT = 220; i2c_touchpad_handle.Init.SCL_LCNT = 230; #elif BOARD_SEL == BOARD_EVB_FR3092E __SYSTEM_I2C2_CLK_ENABLE(); i2c_touchpad_handle.I2Cx = I2C2; i2c_touchpad_handle.Init.I2C_Mode = I2C_MODE_MASTER_7BIT; i2c_touchpad_handle.Init.SCL_HCNT = 220; i2c_touchpad_handle.Init.SCL_LCNT = 230; #elif BOARD_SEL == BOARD_EVB_FR3092E_CM __SYSTEM_I2C3_CLK_ENABLE(); i2c_touchpad_handle.I2Cx = I2C3; i2c_touchpad_handle.Init.I2C_Mode = I2C_MODE_MASTER_7BIT; i2c_touchpad_handle.Init.SCL_HCNT = 90; i2c_touchpad_handle.Init.SCL_LCNT = 90; #elif BOARD_SEL == BOARD_EVB_FR3092E_RGB #else #error "choose correct board" #endif i2c_init(&i2c_touchpad_handle); __TOUCHPAD_RESET_SET(); touchpad_init(); } else { __SYSTEM_GPIOC_CLK_ENABLE(); #if BOARD_SEL == BOARD_EVB_FR3092E __SYSTEM_I2C2_CLK_ENABLE(); #else __SYSTEM_I2C3_CLK_ENABLE(); #endif i2c_init(&i2c_touchpad_handle); } } __RAM_CODE void hw_psram_init(bool wake_up) { uint32_t reg_value; __SYSTEM_OSPI_CLK_SELECT_AUPLL(); __SYSTEM_OSPI_CLK_ENABLE(); __SYSTEM_AHBC_CLK_ENABLE(); __CACHE_FLUSH(CACHE); __CACHE_WR_MODE_SET(CACHE, CACHE_WR_WRITE_THROUGH); __CACHE_ADDR_RANGEx_BANK_SET(CACHE, 0, 0 >> 16); __CACHE_ADDR_RANGEx_MASK_SET(CACHE, 0, 0x001F); __CACHE_ADDR_RANGEx_POL_SET(CACHE, 0, CACHE_POL_CACHABLE); __CACHE_ADDR_RANGEx_ENABLE(CACHE, 0); __CACHE_ENABLE(CACHE); if (wake_up == false) { /* setup PSRAM OSPI RESET pin */ SYSTEM->OspiPadConfig.OSPI_FuncMux |= 0x00300000; SYSTEM->OspiOutEN &= (~(1<<10)); SYSTEM->OspiData |= (1<<10); system_delay_us(200); // tPU > 150us SYSTEM->OspiData &= (~(1<<10)); system_delay_us(10); // tRP > 1us SYSTEM->OspiData |= (1<<10); system_delay_us(600); // tDPDp > 500us system_delay_us(300); // tHSPU > 1ms, from power up to fully access } /* configure OSPI pad to OSPI 4-line mode function */ reg_value = SYSTEM->OspiPadConfig.OSPI_FuncMux; reg_value &= 0xfcf00ffc; reg_value |= 0x01055001; SYSTEM->OspiPadConfig.OSPI_FuncMux = reg_value; psram_init(wake_up == false); } __RAM_CODE void hw_external_flash_init(bool wake_up) { if (wake_up == false) { GPIO_InitTypeDef gpio_config; #if(SPI_FLASH_GPIO_SEL==1) /* ========================================================== */ /* config GPIO for external flash */ gpio_config.Pin = GPIO_PIN_8 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13; gpio_config.Mode = GPIO_MODE_AF_PP; gpio_config.Pull = GPIO_PULLUP; gpio_config.Alternate = GPIO_FUNCTION_7; gpio_init(GPIOC, &gpio_config); /* CS of external flash is controllerd by software */ __SYSTEM_GPIOC_CLK_ENABLE(); gpio_config.Pin = GPIO_PIN_9; gpio_config.Mode = GPIO_MODE_OUTPUT_PP; gpio_config.Pull = GPIO_PULLUP; gpio_config.Alternate = GPIO_FUNCTION_0; gpio_init(GPIOC, &gpio_config); /* config DMA0 for external flash */ __SYSTEM_DMA0_CLK_ENABLE(); dma_flash_handle.DMAx = DMA0; dma_flash_handle.Channel = DMA_Channel0; dma_flash_handle.Init.Data_Flow = DMA_P2M_DMAC; dma_flash_handle.Init.Request_ID = 2; system_dmac_request_id_config(SPIMX8_1_RX, DMA0_REQUEST_ID_2); dma_flash_handle.Init.Source_Master_Sel = DMA_AHB_MASTER_1; dma_flash_handle.Init.Desination_Master_Sel = DMA_AHB_MASTER_4; dma_flash_handle.Init.Source_Inc = DMA_ADDR_INC_NO_CHANGE; dma_flash_handle.Init.Desination_Inc = DMA_ADDR_INC_INC; dma_flash_handle.Init.Source_Width = DMA_TRANSFER_WIDTH_32; dma_flash_handle.Init.Desination_Width = DMA_TRANSFER_WIDTH_32; dma_flash_handle.Init.Source_Burst_Len = DMA_BURST_LEN_4; dma_flash_handle.Init.Desination_Burst_Len = DMA_BURST_LEN_4; dma_init(&dma_flash_handle); /* Initial SPIx8_1 for extern flash */ __SYSTEM_SPI_MASTER1_X8_CLK_ENABLE(); spi_flash_handle.SPIx = SPIMX8_1; spi_flash_handle.Init.Work_Mode = SPI_WORK_MODE_3; spi_flash_handle.Init.Frame_Size = SPI_FRAME_SIZE_8BIT; spi_flash_handle.Init.BaudRate_Prescaler = 2; spi_flash_handle.Init.TxFIFOEmpty_Threshold = 20; spi_flash_handle.Init.RxFIFOFull_Threshold = 4; spi_master_init(&spi_flash_handle); __SPI_RX_SAMPLE_DLY(spi_flash_handle.SPIx, 2); __SPI_CS_Release(); IC_W25Qxx_QuadConfig(true); NVIC_EnableIRQ(DMA0_IRQn); NVIC_EnableIRQ(SPIMX8_1_IRQn); #elif(SPI_FLASH_GPIO_SEL==2) __SYSTEM_GPIOB_CLK_ENABLE(); /* ========= External Flash interface configuration ======== */ /* config GPIO for external flash */ gpio_config.Pin = GPIO_PIN_0 | GPIO_PIN_2 | GPIO_PIN_3 ; gpio_config.Mode = GPIO_MODE_AF_PP; gpio_config.Pull = GPIO_PULLUP; gpio_config.Alternate = GPIO_FUNCTION_7; gpio_init(GPIOB, &gpio_config); /* CS of external flash is controllerd by software */ gpio_config.Pin = GPIO_PIN_1; gpio_config.Mode = GPIO_MODE_OUTPUT_PP; gpio_config.Pull = GPIO_PULLUP; gpio_config.Alternate = GPIO_FUNCTION_0; gpio_init(GPIOB, &gpio_config); /* config DMA1 for external flash */ __SYSTEM_DMA1_CLK_ENABLE(); dma_flash_handle.DMAx = DMA1; dma_flash_handle.Channel = DMA_Channel0; dma_flash_handle.Init.Data_Flow = DMA_P2M_DMAC; dma_flash_handle.Init.Request_ID = 2; system_dmac_request_id_config(SPIMX8_0_RX, DMA0_REQUEST_ID_2); dma_flash_handle.Init.Source_Master_Sel = DMA_AHB_MASTER_1; dma_flash_handle.Init.Desination_Master_Sel = DMA_AHB_MASTER_4; dma_flash_handle.Init.Source_Inc = DMA_ADDR_INC_NO_CHANGE; dma_flash_handle.Init.Desination_Inc = DMA_ADDR_INC_INC; dma_flash_handle.Init.Source_Width = DMA_TRANSFER_WIDTH_32; dma_flash_handle.Init.Desination_Width = DMA_TRANSFER_WIDTH_32; dma_flash_handle.Init.Source_Burst_Len = DMA_BURST_LEN_4; dma_flash_handle.Init.Desination_Burst_Len = DMA_BURST_LEN_4; dma_init(&dma_flash_handle); /* Initial SPIx8_0 for extern flash */ __SYSTEM_SPI_MASTER0_X8_CLK_ENABLE(); spi_flash_handle.SPIx = SPIMX8_0; spi_flash_handle.Init.Work_Mode = SPI_WORK_MODE_3; spi_flash_handle.Init.Frame_Size = SPI_FRAME_SIZE_8BIT; spi_flash_handle.Init.BaudRate_Prescaler = 2; spi_flash_handle.Init.TxFIFOEmpty_Threshold = 20; spi_flash_handle.Init.RxFIFOFull_Threshold = 4; spi_master_init(&spi_flash_handle); __SPI_RX_SAMPLE_DLY(spi_flash_handle.SPIx, 2); __SPI_CS_Release(); IC_W25Qxx_QuadConfig(true); NVIC_EnableIRQ(DMA1_IRQn); NVIC_EnableIRQ(SPIMX8_0_IRQn); #endif } else { #if(SPI_FLASH_GPIO_SEL==1) __SYSTEM_GPIOC_CLK_ENABLE(); __SYSTEM_DMA0_CLK_ENABLE(); system_dmac_request_id_config(SPIMX8_1_RX, DMA0_REQUEST_ID_2); dma_init(&dma_flash_handle); __SYSTEM_SPI_MASTER1_X8_CLK_ENABLE(); spi_master_init(&spi_flash_handle); __SPI_RX_SAMPLE_DLY(spi_flash_handle.SPIx, 2); NVIC_EnableIRQ(DMA0_IRQn); NVIC_EnableIRQ(SPIMX8_1_IRQn); #elif(SPI_FLASH_GPIO_SEL==2) __SYSTEM_GPIOB_CLK_ENABLE(); __SYSTEM_DMA1_CLK_ENABLE(); system_dmac_request_id_config(SPIMX8_0_RX, DMA1_REQUEST_ID_2); dma_init(&dma_flash_handle); __SYSTEM_SPI_MASTER0_X8_CLK_ENABLE(); spi_master_init(&spi_flash_handle); __SPI_RX_SAMPLE_DLY(spi_flash_handle.SPIx, 2); NVIC_EnableIRQ(DMA1_IRQn); NVIC_EnableIRQ(SPIMX8_0_IRQn); #endif } } __RAM_CODE void hw_dsp_xip_flash_init(bool wake_up) { uint32_t reg_value; /* init QSPI1 for DSP XIP flash */ __SYSTEM_QSPI1_CLK_SELECT_AUPLL(); __SYSTEM_QSPI1_CLK_ENABLE(); /* configure OSPI pad to DSP XIP flash function */ reg_value = SYSTEM->OspiPadConfig.OSPI_FuncMux; reg_value &= 0xc3fff033; reg_value |= 0x14000544; SYSTEM->OspiPadConfig.OSPI_FuncMux = reg_value; /* power on DSP flash */ ool_write(0xfc, ool_read(0xfc) | 0x01); /* configure DSP XIP controller */ flash_enable_quad(QSPI1); flash_init_controller(QSPI1, FLASH_RD_TYPE_QUAD_FAST, FLASH_WR_TYPE_SINGLE); flash_set_baudrate(QSPI1, QSPI_BAUDRATE_DIV_4); } __RAM_CODE void hw_dsp_restore(void) { } __RAM_CODE __attribute__((noinline)) static void rise_qspi_clock(void) { __SYSTEM_QSPI0_CLK_SELECT_AUPLL(); __QSPI_DELAY_CS_START_SET(QSPI0, 4); __QSPI_DELAY_CS_END_SET(QSPI0, 4); __QSPI_DELAY_CS_DESSERT_SET(QSPI0, 8); __QSPI_READ_CAPTURE_DELAY_SET(QSPI0, 3); // FLASH_ID_PUYA_P25Q32: 4 when div is 2 // FLASH_ID_XMC_XM25LU32: 3 when div is 2 // FLASH_ID_GIANTEC_GT25Q16A: 1 when div is 4 // FLASH_ID_GIANTEC_GT25Q16A: 4 when div is 2 system_delay_us(1000); } __RAM_CODE void hw_xip_flash_init(bool wake_up) { // init internal flash __SYSTEM_PFC_CLK_ENABLE(); __SYSTEM_QSPI0_CLK_ENABLE(); __SYSTEM_APB_CLK_ENABLE(); __SYSTEM_APB1_CLK_ENABLE(); system_cache_enable(true); flash_enable_quad(QSPI0); SYSTEM->QspiPadConfig.QSPI_FuncMux = 0x00000500; flash_init_controller(QSPI0, FLASH_RD_TYPE_QUAD_FAST, FLASH_WR_TYPE_SINGLE); if (wake_up == false) { flash_set_IO_DRV(QSPI0, 3); } flash_set_baudrate(QSPI0, QSPI_BAUDRATE_DIV_2); rise_qspi_clock(); } __RAM_CODE void hw_gpio_save(void) { gpio_state.PortA_PullEN = SYSTEM->PortA_PullEN; gpio_state.PortB_PullEN = SYSTEM->PortB_PullEN; gpio_state.PortC_PullEN = SYSTEM->PortC_PullEN; gpio_state.PortD_PullEN = SYSTEM->PortD_PullEN; gpio_state.PortA_PullSelect = SYSTEM->PortA_PullSelect; gpio_state.PortB_PullSelect = SYSTEM->PortB_PullSelect; gpio_state.PortC_PullSelect = SYSTEM->PortC_PullSelect; gpio_state.PortD_PullSelect = SYSTEM->PortD_PullSelect; gpio_state.PortA_PullResCfg = SYSTEM->PortA_PullResCfg; gpio_state.PortB_PullResCfg = SYSTEM->PortB_PullResCfg; gpio_state.PortC_PullResCfg = SYSTEM->PortC_PullResCfg; gpio_state.PortD_PullResCfg = SYSTEM->PortD_PullResCfg; gpio_state.PortA_DriveCfg = SYSTEM->PortA_DriveCfg; gpio_state.PortB_DriveCfg = SYSTEM->PortB_DriveCfg; gpio_state.PortC_DriveCfg = SYSTEM->PortC_DriveCfg; gpio_state.PortD_DriveCfg = SYSTEM->PortD_DriveCfg; gpio_state.PortA_L_FuncMux = SYSTEM->PortA_L_FuncMux; gpio_state.PortA_H_FuncMux = SYSTEM->PortA_H_FuncMux; gpio_state.PortB_L_FuncMux = SYSTEM->PortB_L_FuncMux; gpio_state.PortB_H_FuncMux = SYSTEM->PortB_H_FuncMux; gpio_state.PortC_L_FuncMux = SYSTEM->PortC_L_FuncMux; gpio_state.PortC_H_FuncMux = SYSTEM->PortC_H_FuncMux; gpio_state.PortD_L_FuncMux = SYSTEM->PortD_L_FuncMux; gpio_state.PortD_H_FuncMux = SYSTEM->PortD_H_FuncMux; gpio_state.QSPI_PullSelect = SYSTEM->QspiPadConfig.QSPI_PullSelect; gpio_state.QSPI_PullEN = SYSTEM->QspiPadConfig.QSPI_PullEN; gpio_state.OSPI_PullSelect = SYSTEM->OspiPadConfig.OSPI_PullSelect; gpio_state.OSPI_PullEN = SYSTEM->OspiPadConfig.OSPI_PullEN; __SYSTEM_GPIOA_CLK_ENABLE(); __SYSTEM_GPIOB_CLK_ENABLE(); __SYSTEM_GPIOC_CLK_ENABLE(); __SYSTEM_GPIOD_CLK_ENABLE(); gpio_state.GPIOA_OutputEN = GPIOA->GPIO_OutputEN; gpio_state.GPIOA_OUT_DATA = GPIOA->GPIO_OUT_DATA; gpio_state.GPIOA_EXTI_EN = GPIOA->EXTI_EN; gpio_state.GPIOA_EXTI_INT_EN= GPIOA->EXTI_INT_EN; gpio_state.GPIOA_EXTI_TYPE = GPIOA->EXTI_TYPE; gpio_state.GPIOB_OutputEN = GPIOB->GPIO_OutputEN; gpio_state.GPIOB_OUT_DATA = GPIOB->GPIO_OUT_DATA; gpio_state.GPIOB_EXTI_EN = GPIOB->EXTI_EN; gpio_state.GPIOB_EXTI_INT_EN= GPIOB->EXTI_INT_EN; gpio_state.GPIOB_EXTI_TYPE = GPIOB->EXTI_TYPE; gpio_state.GPIOC_OutputEN = GPIOC->GPIO_OutputEN; gpio_state.GPIOC_OUT_DATA = GPIOC->GPIO_OUT_DATA; gpio_state.GPIOC_EXTI_EN = GPIOC->EXTI_EN; gpio_state.GPIOC_EXTI_INT_EN= GPIOC->EXTI_INT_EN; gpio_state.GPIOC_EXTI_TYPE = GPIOC->EXTI_TYPE; gpio_state.GPIOD_OutputEN = GPIOD->GPIO_OutputEN; gpio_state.GPIOD_OUT_DATA = GPIOD->GPIO_OUT_DATA; gpio_state.GPIOD_EXTI_EN = GPIOD->EXTI_EN; gpio_state.GPIOD_EXTI_INT_EN= GPIOD->EXTI_INT_EN; gpio_state.GPIOD_EXTI_TYPE = GPIOD->EXTI_TYPE; } __RAM_CODE void hw_gpio_restore(void) { SYSTEM->PortA_PullEN = gpio_state.PortA_PullEN; SYSTEM->PortB_PullEN = gpio_state.PortB_PullEN; SYSTEM->PortC_PullEN = gpio_state.PortC_PullEN; SYSTEM->PortD_PullEN = gpio_state.PortD_PullEN; SYSTEM->PortA_PullSelect = gpio_state.PortA_PullSelect; SYSTEM->PortB_PullSelect = gpio_state.PortB_PullSelect; SYSTEM->PortC_PullSelect = gpio_state.PortC_PullSelect; SYSTEM->PortD_PullSelect = gpio_state.PortD_PullSelect; SYSTEM->PortA_PullResCfg = gpio_state.PortA_PullResCfg; SYSTEM->PortB_PullResCfg = gpio_state.PortB_PullResCfg; SYSTEM->PortC_PullResCfg = gpio_state.PortC_PullResCfg; SYSTEM->PortD_PullResCfg = gpio_state.PortD_PullResCfg; SYSTEM->PortA_DriveCfg = gpio_state.PortA_DriveCfg; SYSTEM->PortB_DriveCfg = gpio_state.PortB_DriveCfg; SYSTEM->PortC_DriveCfg = gpio_state.PortC_DriveCfg; SYSTEM->PortD_DriveCfg = gpio_state.PortD_DriveCfg; SYSTEM->PortA_L_FuncMux = gpio_state.PortA_L_FuncMux; SYSTEM->PortA_H_FuncMux = gpio_state.PortA_H_FuncMux; SYSTEM->PortB_L_FuncMux = gpio_state.PortB_L_FuncMux; SYSTEM->PortB_H_FuncMux = gpio_state.PortB_H_FuncMux; SYSTEM->PortC_L_FuncMux = gpio_state.PortC_L_FuncMux; SYSTEM->PortC_H_FuncMux = gpio_state.PortC_H_FuncMux; SYSTEM->PortD_L_FuncMux = gpio_state.PortD_L_FuncMux; SYSTEM->PortD_H_FuncMux = gpio_state.PortD_H_FuncMux; SYSTEM->QspiPadConfig.QSPI_PullSelect = gpio_state.QSPI_PullSelect; SYSTEM->QspiPadConfig.QSPI_PullEN = gpio_state.QSPI_PullEN; SYSTEM->OspiPadConfig.OSPI_PullSelect = gpio_state.OSPI_PullSelect; SYSTEM->OspiPadConfig.OSPI_PullEN = gpio_state.OSPI_PullEN; __SYSTEM_GPIOA_CLK_ENABLE(); __SYSTEM_GPIOB_CLK_ENABLE(); __SYSTEM_GPIOC_CLK_ENABLE(); __SYSTEM_GPIOD_CLK_ENABLE(); GPIOA->GPIO_OutputEN = gpio_state.GPIOA_OutputEN; GPIOA->GPIO_OUT_DATA = gpio_state.GPIOA_OUT_DATA; GPIOA->EXTI_EN = gpio_state.GPIOA_EXTI_EN; GPIOA->EXTI_INT_EN = gpio_state.GPIOA_EXTI_INT_EN; GPIOA->EXTI_TYPE = gpio_state.GPIOA_EXTI_TYPE; GPIOB->GPIO_OutputEN = gpio_state.GPIOB_OutputEN; GPIOB->GPIO_OUT_DATA = gpio_state.GPIOB_OUT_DATA; GPIOB->EXTI_EN = gpio_state.GPIOB_EXTI_EN; GPIOB->EXTI_INT_EN = gpio_state.GPIOB_EXTI_INT_EN; GPIOB->EXTI_TYPE = gpio_state.GPIOB_EXTI_TYPE; GPIOC->GPIO_OutputEN = gpio_state.GPIOC_OutputEN; GPIOC->GPIO_OUT_DATA = gpio_state.GPIOC_OUT_DATA; GPIOC->EXTI_EN = gpio_state.GPIOC_EXTI_EN; GPIOC->EXTI_INT_EN = gpio_state.GPIOC_EXTI_INT_EN; GPIOC->EXTI_TYPE = gpio_state.GPIOC_EXTI_TYPE; GPIOD->GPIO_OutputEN = gpio_state.GPIOD_OutputEN; GPIOD->GPIO_OUT_DATA = gpio_state.GPIOD_OUT_DATA; GPIOD->EXTI_EN = gpio_state.GPIOD_EXTI_EN; GPIOD->EXTI_INT_EN = gpio_state.GPIOD_EXTI_INT_EN; GPIOD->EXTI_TYPE = gpio_state.GPIOD_EXTI_TYPE; } __RAM_CODE void hw_clock_init(void) { System_ClkConfig_t sys_clk_cfg; sys_clk_cfg.AUPLL_CFG.PLL_N = 8; sys_clk_cfg.AUPLL_CFG.PLL_M = 0; sys_clk_cfg.AUPLL_CFG.PowerEn = 1; sys_clk_cfg.SPLL_CFG.PLL_N = 8; sys_clk_cfg.SPLL_CFG.PLL_M = 0; sys_clk_cfg.SPLL_CFG.PowerEn = 1; sys_clk_cfg.MCU_Clock_Source = MCU_CLK_SEL_SPLL_CLK; sys_clk_cfg.SOC_DIV = 1; sys_clk_cfg.MCU_DIV = 1; sys_clk_cfg.APB0_DIV = 1; sys_clk_cfg.APB1_DIV = 1; sys_clk_cfg.APB2_DIV = 1; sys_clk_cfg.APB3_DIV = 1; System_AUPLL_config(&sys_clk_cfg.AUPLL_CFG, 1000); System_SPLL_config(&sys_clk_cfg.SPLL_CFG, 1000); System_MCU_clock_Config(&sys_clk_cfg); __SYSTEM_SPI_MASTER0_X8_CLK_SELECT_AUPLL(); __SYSTEM_SPI_MASTER1_X8_CLK_SELECT_AUPLL(); __SYSTEM_I2C_CLK_SELECT_SPLL(); __SYSTEM_BLEND_CLK_SELECT_SPLL(); __SYSTEM_UART_CLK_SELECT_SPLL(); }