159 lines
4.2 KiB
C
159 lines
4.2 KiB
C
/*
|
|
* Copyright (c) 2006-2018, RT-Thread Development Team
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*
|
|
* Change Logs:
|
|
* Date Author Notes
|
|
* 2021-08-27 Jiao 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);
|
|
}
|