255 lines
6.8 KiB
C
255 lines
6.8 KiB
C
|
/************************************************************************************************/
|
|||
|
/**
|
|||
|
* @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 */
|
|||
|
/**
|
|||
|
* @}
|
|||
|
*/
|
|||
|
|
|||
|
/**
|
|||
|
* @}
|
|||
|
*/
|