/* * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2018-12-21 zylx first version */ #include "board.h" FL_ErrorStatus FL_UART_GPIO_Init(UART_Type *UARTx) { FL_ErrorStatus status = FL_FAIL; FL_GPIO_InitTypeDef GPIO_InitStruct; if(UARTx == UART0) { GPIO_InitStruct.pin = FL_GPIO_PIN_13; GPIO_InitStruct.mode = FL_GPIO_MODE_DIGITAL; GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL; GPIO_InitStruct.pull = FL_DISABLE; GPIO_InitStruct.remapPin = FL_DISABLE; status = FL_GPIO_Init( GPIOA, &GPIO_InitStruct ); GPIO_InitStruct.pin = FL_GPIO_PIN_14; GPIO_InitStruct.mode = FL_GPIO_MODE_DIGITAL; GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL; GPIO_InitStruct.pull = FL_DISABLE; GPIO_InitStruct.remapPin = FL_DISABLE; status = FL_GPIO_Init( GPIOA, &GPIO_InitStruct ); } else if(UARTx == UART1) { GPIO_InitStruct.pin = FL_GPIO_PIN_13; GPIO_InitStruct.mode = FL_GPIO_MODE_DIGITAL; GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL; GPIO_InitStruct.pull = FL_DISABLE; GPIO_InitStruct.remapPin = FL_DISABLE; status = FL_GPIO_Init( GPIOB, &GPIO_InitStruct ); GPIO_InitStruct.pin = FL_GPIO_PIN_14; GPIO_InitStruct.mode = FL_GPIO_MODE_DIGITAL; GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL; GPIO_InitStruct.pull = FL_DISABLE; GPIO_InitStruct.remapPin = FL_DISABLE; status = FL_GPIO_Init( GPIOB, &GPIO_InitStruct ); } else if(UARTx == UART4) { GPIO_InitStruct.pin = FL_GPIO_PIN_0; GPIO_InitStruct.mode = FL_GPIO_MODE_DIGITAL; GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL; GPIO_InitStruct.pull = FL_DISABLE; GPIO_InitStruct.remapPin = FL_DISABLE; status = FL_GPIO_Init( GPIOA, &GPIO_InitStruct ); GPIO_InitStruct.pin = FL_GPIO_PIN_1; GPIO_InitStruct.mode = FL_GPIO_MODE_DIGITAL; GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL; GPIO_InitStruct.pull = FL_DISABLE; GPIO_InitStruct.remapPin = FL_DISABLE; status = FL_GPIO_Init( GPIOA, &GPIO_InitStruct ); } return status; } static void RCC_PLL_ConfigDomain_SYS(uint32_t Source, uint32_t PLL_R, uint32_t PLL_DB, uint32_t PLL_O) { MODIFY_REG(RCC->PLLCR, RCC_PLLCR_DB_Msk | RCC_PLLCR_REFPRSC_Msk | RCC_PLLCR_OSEL_Msk | RCC_PLLCR_INSEL_Msk, (PLL_DB << RCC_PLLCR_DB_Pos) | PLL_R | PLL_O | Source); } static void RCHFInit(uint32_t clock) { switch(clock) { case FL_RCC_RCHF_FREQUENCY_8MHZ: FL_RCC_RCHF_WriteTrimValue(RCHF8M_TRIM); break; case FL_RCC_RCHF_FREQUENCY_16MHZ: FL_RCC_RCHF_WriteTrimValue(RCHF16M_TRIM); break; case FL_RCC_RCHF_FREQUENCY_24MHZ: FL_RCC_RCHF_WriteTrimValue(RCHF24M_TRIM); break; default: FL_RCC_RCHF_WriteTrimValue(RCHF8M_TRIM); break; } FL_RCC_RCHF_SetFrequency(clock); } void SelRCHFToPLL(uint32_t rchf, uint32_t clock) { uint32_t div = FL_RCC_PLL_PSC_DIV8; if(clock > 64) { return; } RCHFInit(rchf); switch(rchf) { case FL_RCC_RCHF_FREQUENCY_16MHZ: div = FL_RCC_PLL_PSC_DIV16; break; case FL_RCC_RCHF_FREQUENCY_24MHZ: div = FL_RCC_PLL_PSC_DIV24; break; default: break; } if(clock <= 24) { FL_FLASH_SetReadWait(FLASH, FL_FLASH_READ_WAIT_0CYCLE); } else if((clock > 24) && (clock <= 48)) { FL_FLASH_SetReadWait(FLASH, FL_FLASH_READ_WAIT_1CYCLE); } else { FL_FLASH_SetReadWait(FLASH, FL_FLASH_READ_WAIT_1CYCLE); } RCC_PLL_ConfigDomain_SYS(FL_RCC_PLL_CLK_SOURCE_RCHF, div, clock, FL_RCC_PLL_OUTPUT_X1); FL_RCC_PLL_Enable(); while(FL_RCC_IsActiveFlag_PLLReady() != FL_SET); FL_RCC_SetAHBPrescaler(FL_RCC_AHBCLK_PSC_DIV1); FL_RCC_SetAPB1Prescaler(FL_RCC_APB1CLK_PSC_DIV1); FL_RCC_SetAPB2Prescaler(FL_RCC_APB2CLK_PSC_DIV1); FL_RCC_SetSystemClockSource(FL_RCC_SYSTEM_CLK_SOURCE_PLL); }