CIU32_L051_M307R/Peripheral/CIU32L051_Lib/Source/ciu32l051_std_lpuart.c

255 lines
6.8 KiB
C
Raw Normal View History

/************************************************************************************************/
/**
* @file ciu32L051_std_lpuart.c
* @author MCU Ecosystem Development Team
* @brief LPUART STD<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* ʵ<EFBFBD><EFBFBD>LPUART<EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>API<EFBFBD><EFBFBD>
*
**************************************************************************************************
* @attention
* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
*
**************************************************************************************************
*/
/************************************************************************************************/
/**
* @addtogroup CIU32L051_STD_Driver
* @{
*/
/**
* @addtogroup LPUART
* @{
*
*/
/************************************************************************************************/
/*------------------------------------------includes--------------------------------------------*/
#include "ciu32L051_std.h"
#ifdef STD_LPUART_PERIPHERAL_USED
/*-------------------------------------------functions------------------------------------------*/
/************************************************************************************************/
/**
* @addtogroup LPUART_External_Functions
* @{
*
*/
/************************************************************************************************/
/**
* @brief LPUART <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
* @param lpuartx LPUART<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param lpuart_init_param <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @retval std_status_t <EFBFBD><EFBFBD><EFBFBD><EFBFBD>APIִ<EFBFBD>н<EFBFBD><EFBFBD><EFBFBD>
*/
std_status_t std_lpuart_init(LPUART_t *lpuartx, std_lpuart_init_t *lpuart_init_param)
{
uint32_t direction = 0U;
/* <20><><EFBFBD><EFBFBD>LPUART */
std_lpuart_disable(lpuartx);
/* <20><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD> */
std_lpuart_set_word_length(lpuartx,lpuart_init_param->wordlength);
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>żУ<C5BC><D0A3> */
std_lpuart_set_parity(lpuartx,lpuart_init_param->parity);
/* <20><><EFBFBD><EFBFBD>ֹͣλ */
std_lpuart_set_stopbits(lpuartx,lpuart_init_param->stopbits);
/* <20><><EFBFBD><EFBFBD>Ԥ<EFBFBD><D4A4>Ƶ */
std_lpuart_set_kclk_prescaler(lpuartx,lpuart_init_param->prescaler);
/* <20><><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
std_lpuart_set_hardflow_control(lpuartx,lpuart_init_param->hardware_flow);
/* <20><><EFBFBD><EFBFBD>ͨ<EFBFBD>Ų<EFBFBD><C5B2><EFBFBD><EFBFBD><EFBFBD> */
if (STD_OK != (std_lpuart_set_baudrate(lpuartx,lpuart_init_param->baudrate)))
{
return STD_ERR;
}
/* <20><><EFBFBD><EFBFBD>ͨ<EFBFBD>ŷ<EFBFBD><C5B7><EFBFBD> */
std_lpuart_set_transfer_direction(lpuartx,lpuart_init_param->direction);
direction = std_lpuart_get_transfer_direction(lpuartx);
/* ʹ<><CAB9>LPUART */
std_lpuart_enable(lpuartx);
/* <20><>ʹ<EFBFBD>ܷ<EFBFBD><DCB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>TEACK<43><4B>־<EFBFBD><D6BE>1 */
if (LPUART_DIRECTION_SEND == (direction & LPUART_DIRECTION_SEND))
{
while (!std_lpuart_get_flag(lpuartx, LPUART_FLAG_TEACK))
{
}
}
/* <20><>ʹ<EFBFBD>ܽ<EFBFBD><DCBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>REACK<43><4B>־<EFBFBD><D6BE>1 */
if (LPUART_DIRECTION_RECEIVE == (direction & LPUART_DIRECTION_RECEIVE))
{
while (!std_lpuart_get_flag(lpuartx, LPUART_FLAG_REACK))
{
}
}
return STD_OK;
}
/**
* @brief LPUART ȥ<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
* @param lpuartx LPUART<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
void std_lpuart_deinit(LPUART_t *lpuartx)
{
std_lpuart_disable(lpuartx);
if(lpuartx == LPUART1)
{
/* <20><>λLPUART1 */
std_rcc_apb1_reset(RCC_PERIPH_RESET_LPUART1);
/* <20>ر<EFBFBD>LPUART1ʱ<31><CAB1> */
std_rcc_apb1_clk_disable(RCC_PERIPH_CLK_LPUART1);
}
else if(lpuartx == LPUART2)
{
/* <20><>λLPUART2 */
std_rcc_apb1_reset(RCC_PERIPH_RESET_LPUART2);
/* <20>ر<EFBFBD>LPUART2ʱ<32><CAB1> */
std_rcc_apb1_clk_disable(RCC_PERIPH_CLK_LPUART2);
}
else
{
/* <20><><EFBFBD>޲<EFBFBD><DEB2><EFBFBD> */
}
}
/**
* @brief LPUART <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>BRR<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param lpuartx LPUART<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param baudrate LPUART<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @retval std_status_t <EFBFBD><EFBFBD><EFBFBD><EFBFBD>APIִ<EFBFBD>н<EFBFBD><EFBFBD><EFBFBD>
*/
std_status_t std_lpuart_set_baudrate(LPUART_t *lpuartx, uint32_t baudrate)
{
uint32_t kclk_source = 0;
uint32_t kclk_frequency = 0;
uint32_t prescaler_temp = 0;
uint32_t brr_temp = 0;
/* <20><>ȡLPUART<52><54>ǰ<EFBFBD><C7B0>ʱ<EFBFBD><CAB1>Դ */
if (lpuartx == LPUART1)
{
kclk_source = std_rcc_get_lpuart1clk_source();
/* <20><>ȡLPUART<52><54>ǰ<EFBFBD><C7B0>ʱ<EFBFBD><CAB1>ԴƵ<D4B4><C6B5> */
switch (kclk_source)
{
case RCC_LPUART1_ASYNC_CLK_SRC_PCLK1:
{
kclk_frequency = std_rcc_get_pclk1freq();
}break;
case RCC_LPUART1_ASYNC_CLK_SRC_SYSCLK:
{
kclk_frequency = std_rcc_get_sysclkfreq();
}break;
case RCC_LPUART1_ASYNC_CLK_SRC_RCH:
{
kclk_frequency = RCH_VALUE;
}break;
case RCC_LPUART1_ASYNC_CLK_SRC_LXTAL:
{
kclk_frequency = LXTAL_VALUE;
}break;
default:
{
kclk_frequency = 0;
}break;
}
}
else if (lpuartx == LPUART2)
{
kclk_source = std_rcc_get_lpuart2clk_source();
/* <20><>ȡLPUART<52><54>ǰ<EFBFBD><C7B0>ʱ<EFBFBD><CAB1>ԴƵ<D4B4><C6B5> */
switch (kclk_source)
{
case RCC_LPUART2_ASYNC_CLK_SRC_PCLK1:
{
kclk_frequency = std_rcc_get_pclk1freq();
}break;
case RCC_LPUART2_ASYNC_CLK_SRC_SYSCLK:
{
kclk_frequency = std_rcc_get_sysclkfreq();
}break;
case RCC_LPUART2_ASYNC_CLK_SRC_RCH:
{
kclk_frequency = RCH_VALUE;
}break;
case RCC_LPUART2_ASYNC_CLK_SRC_LXTAL:
{
kclk_frequency = LXTAL_VALUE;
}break;
default:
{
kclk_frequency = 0;
}break;
}
}
else
{
/* <20><><EFBFBD>޲<EFBFBD><DEB2><EFBFBD> */
}
/* <20><>ȡLPUART Ԥ<><D4A4>Ƶ<EFBFBD><C6B5><EFBFBD>ķ<EFBFBD>Ƶֵ */
prescaler_temp = std_lpuart_get_kclk_prescaler(lpuartx);
/* <20><><EFBFBD><EFBFBD>LPUART BRR<52><52><EFBFBD><EFBFBD> */
brr_temp = (uint32_t)(((((uint64_t)kclk_frequency/(uint64_t)prescaler_temp)<<8) + (baudrate>>1))/(baudrate));
/* <20>ж<EFBFBD>BRR<52><52><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>Χ<EFBFBD><CEA7> */
if ((brr_temp>=LPUART_BRR_MIN) &&(brr_temp<=LPUART_BRR_MAX))
{
MODIFY_REG(lpuartx->BRR,USART_BRR_LPUART, brr_temp);
return STD_OK;
}
else
{
return STD_ERR;
}
}
/**
* @brief LPUART <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
* @param lpuart_init_struct LPUART<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
void std_lpuart_struct_init(std_lpuart_init_t *lpuart_init_struct)
{
lpuart_init_struct->prescaler = LPUART_PRESCALER_DIV1;
lpuart_init_struct->baudrate = 9600;
lpuart_init_struct->wordlength = LPUART_WORDLENGTH_8BITS;
lpuart_init_struct->hardware_flow = LPUART_FLOWCONTROL_NONE;
lpuart_init_struct->parity = LPUART_PARITY_NONE;
lpuart_init_struct->stopbits = LPUART_STOPBITS_1;
lpuart_init_struct->direction =LPUART_DIRECTION_SEND_RECEIVE;
}
/**
* @}
*/
#endif /* STD_LPUART_PERIPHERAL_USED */
/**
* @}
*/
/**
* @}
*/