in boards/STM32L475_Discovery/STM32L4xx_HAL_Driver/stm32l4xx_hal_uart.c [2021:2205]
HAL_StatusTypeDef UART_SetConfig(UART_HandleTypeDef *huart)
{
uint32_t tmpreg = 0x00000000;
UART_ClockSourceTypeDef clocksource = UART_CLOCKSOURCE_UNDEFINED;
uint16_t brrtemp = 0x0000;
uint16_t usartdiv = 0x0000;
HAL_StatusTypeDef ret = HAL_OK;
/* Check the parameters */
assert_param(IS_UART_BAUDRATE(huart->Init.BaudRate));
assert_param(IS_UART_WORD_LENGTH(huart->Init.WordLength));
if(UART_INSTANCE_LOWPOWER(huart))
{
assert_param(IS_LPUART_STOPBITS(huart->Init.StopBits));
}
else
{
assert_param(IS_UART_STOPBITS(huart->Init.StopBits));
assert_param(IS_UART_ONE_BIT_SAMPLE(huart->Init.OneBitSampling));
}
assert_param(IS_UART_PARITY(huart->Init.Parity));
assert_param(IS_UART_MODE(huart->Init.Mode));
assert_param(IS_UART_HARDWARE_FLOW_CONTROL(huart->Init.HwFlowCtl));
assert_param(IS_UART_OVERSAMPLING(huart->Init.OverSampling));
/*-------------------------- USART CR1 Configuration -----------------------*/
/* Clear M, PCE, PS, TE, RE and OVER8 bits and configure
* the UART Word Length, Parity, Mode and oversampling:
* set the M bits according to huart->Init.WordLength value
* set PCE and PS bits according to huart->Init.Parity value
* set TE and RE bits according to huart->Init.Mode value
* set OVER8 bit according to huart->Init.OverSampling value */
tmpreg = (uint32_t)huart->Init.WordLength | huart->Init.Parity | huart->Init.Mode | huart->Init.OverSampling ;
MODIFY_REG(huart->Instance->CR1, UART_CR1_FIELDS, tmpreg);
/*-------------------------- USART CR2 Configuration -----------------------*/
/* Configure the UART Stop Bits: Set STOP[13:12] bits according
* to huart->Init.StopBits value */
MODIFY_REG(huart->Instance->CR2, USART_CR2_STOP, huart->Init.StopBits);
/*-------------------------- USART CR3 Configuration -----------------------*/
/* Configure
* - UART HardWare Flow Control: set CTSE and RTSE bits according
* to huart->Init.HwFlowCtl value
* - one-bit sampling method versus three samples' majority rule according
* to huart->Init.OneBitSampling (not applicable to LPUART) */
tmpreg = (uint32_t)huart->Init.HwFlowCtl;
if (!(UART_INSTANCE_LOWPOWER(huart)))
{
tmpreg |= huart->Init.OneBitSampling;
}
MODIFY_REG(huart->Instance->CR3, (USART_CR3_RTSE | USART_CR3_CTSE | USART_CR3_ONEBIT), tmpreg);
/*-------------------------- USART BRR Configuration -----------------------*/
UART_GETCLOCKSOURCE(huart, clocksource);
/* Check LPUART instance */
if(UART_INSTANCE_LOWPOWER(huart))
{
/* Retrieve frequency clock */
tmpreg = 0;
switch (clocksource)
{
case UART_CLOCKSOURCE_PCLK1:
tmpreg = HAL_RCC_GetPCLK1Freq();
break;
case UART_CLOCKSOURCE_HSI:
tmpreg = (uint32_t) HSI_VALUE;
break;
case UART_CLOCKSOURCE_SYSCLK:
tmpreg = HAL_RCC_GetSysClockFreq();
break;
case UART_CLOCKSOURCE_LSE:
tmpreg = (uint32_t) LSE_VALUE;
break;
case UART_CLOCKSOURCE_UNDEFINED:
default:
ret = HAL_ERROR;
break;
}
/* if proper clock source reported */
if (tmpreg != 0)
{
/* ensure that Frequency clock is in the range [3 * baudrate, 4096 * baudrate] */
if ( (tmpreg < (3 * huart->Init.BaudRate) ) ||
(tmpreg > (4096 * huart->Init.BaudRate) ))
{
ret = HAL_ERROR;
}
else
{
switch (clocksource)
{
case UART_CLOCKSOURCE_PCLK1:
tmpreg = (uint32_t)(UART_DIV_LPUART(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate));
break;
case UART_CLOCKSOURCE_HSI:
tmpreg = (uint32_t)(UART_DIV_LPUART(HSI_VALUE, huart->Init.BaudRate));
break;
case UART_CLOCKSOURCE_SYSCLK:
tmpreg = (uint32_t)(UART_DIV_LPUART(HAL_RCC_GetSysClockFreq(), huart->Init.BaudRate));
break;
case UART_CLOCKSOURCE_LSE:
tmpreg = (uint32_t)(UART_DIV_LPUART(LSE_VALUE, huart->Init.BaudRate));
break;
case UART_CLOCKSOURCE_UNDEFINED:
default:
ret = HAL_ERROR;
break;
}
if ((tmpreg >= UART_LPUART_BRR_MIN) && (tmpreg <= UART_LPUART_BRR_MAX))
{
huart->Instance->BRR = tmpreg;
}
else
{
ret = HAL_ERROR;
}
} /* if ( (tmpreg < (3 * huart->Init.BaudRate) ) || (tmpreg > (4096 * huart->Init.BaudRate) )) */
} /* if (tmpreg != 0) */
}
/* Check UART Over Sampling to set Baud Rate Register */
else if (huart->Init.OverSampling == UART_OVERSAMPLING_8)
{
switch (clocksource)
{
case UART_CLOCKSOURCE_PCLK1:
usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate));
break;
case UART_CLOCKSOURCE_PCLK2:
usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate));
break;
case UART_CLOCKSOURCE_HSI:
usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HSI_VALUE, huart->Init.BaudRate));
break;
case UART_CLOCKSOURCE_SYSCLK:
usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HAL_RCC_GetSysClockFreq(), huart->Init.BaudRate));
break;
case UART_CLOCKSOURCE_LSE:
usartdiv = (uint16_t)(UART_DIV_SAMPLING8(LSE_VALUE, huart->Init.BaudRate));
break;
case UART_CLOCKSOURCE_UNDEFINED:
default:
ret = HAL_ERROR;
break;
}
brrtemp = usartdiv & 0xFFF0;
brrtemp |= (uint16_t)((usartdiv & (uint16_t)0x000F) >> 1U);
huart->Instance->BRR = brrtemp;
}
else
{
switch (clocksource)
{
case UART_CLOCKSOURCE_PCLK1:
huart->Instance->BRR = (uint16_t)(UART_DIV_SAMPLING16(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate));
break;
case UART_CLOCKSOURCE_PCLK2:
huart->Instance->BRR = (uint16_t)(UART_DIV_SAMPLING16(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate));
break;
case UART_CLOCKSOURCE_HSI:
huart->Instance->BRR = (uint16_t)(UART_DIV_SAMPLING16(HSI_VALUE, huart->Init.BaudRate));
break;
case UART_CLOCKSOURCE_SYSCLK:
huart->Instance->BRR = (uint16_t)(UART_DIV_SAMPLING16(HAL_RCC_GetSysClockFreq(), huart->Init.BaudRate));
break;
case UART_CLOCKSOURCE_LSE:
huart->Instance->BRR = (uint16_t)(UART_DIV_SAMPLING16(LSE_VALUE, huart->Init.BaudRate));
break;
case UART_CLOCKSOURCE_UNDEFINED:
default:
ret = HAL_ERROR;
break;
}
}
return ret;
}