CIU32_L051_M307R/Peripheral/CIU32L051_Lib/Source/ciu32l051_std_usart.c

255 lines
6.3 KiB
C
Raw Normal View History

/************************************************************************************************/
/**
* @file ciu32L051_std_usart.c
* @author MCU Ecosystem Development Team
* @brief USART STD<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* ʵ<EFBFBD><EFBFBD>USART<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>á<EFBFBD>clock<EFBFBD><EFBFBD><EFBFBD>õȹ<EFBFBD><EFBFBD><EFBFBD>API<EFBFBD><EFBFBD>
*
**************************************************************************************************
* @attention
* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
*
**************************************************************************************************
*/
/************************************************************************************************/
/**
* @addtogroup CIU32L051_STD_Driver
* @{
*/
/**
* @addtogroup USART
* @{
*
*/
/************************************************************************************************/
/*------------------------------------------includes--------------------------------------------*/
#include "ciu32L051_std.h"
#ifdef STD_USART_PERIPHERAL_USED
/*-------------------------------------------functions------------------------------------------*/
/************************************************************************************************/
/**
* @addtogroup USART_External_Functions
* @{
*
*/
/************************************************************************************************/
/**
* @brief USART<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
* @param usartx USART<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param usart_init_param USART<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @retval std_status_t <EFBFBD><EFBFBD><EFBFBD>س<EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ý<EFBFBD><EFBFBD><EFBFBD>
*/
std_status_t std_usart_init(USART_t *usartx,std_usart_init_t *usart_init_param)
{
/* <20><><EFBFBD><EFBFBD>USART<52>ֳ<EFBFBD> */
std_usart_set_word_length(usartx,usart_init_param->wordlength);
/* <20><><EFBFBD><EFBFBD>USARTֹͣλ */
std_usart_set_stopbits(usartx,usart_init_param->stopbits);
/* <20><><EFBFBD><EFBFBD>USART<52><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ8<CEAA><38><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դﵽ<D4B4><EFB5BD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
std_usart_set_over_sample(usartx,usart_init_param->over_sample);
/* <20><><EFBFBD><EFBFBD>USARTͨ<54><CDA8>ģʽ(<28><><EFBFBD><EFBFBD><EFBFBD>͡<EFBFBD><CDA1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ա<EFBFBD><D5A1><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD>)*/
std_usart_set_transfer_direction(usartx,usart_init_param->direction);
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>żУ<C5BC><D0A3> */
std_usart_set_parity(usartx,usart_init_param->parity);
/* <20><><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
std_usart_set_hardflow_control(usartx,usart_init_param->hardware_flow);
/* <20><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD> */
if(std_usart_baudrate_config(usartx,usart_init_param->baudrate)!=STD_OK)
{
return STD_ERR;
}
return STD_OK;
}
/**
* @brief USARTȥ<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
* @param usartx USART<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @retval std_status_t <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void std_usart_deinit(USART_t *usartx)
{
std_usart_disable(usartx);
/* USART <20><>RCCʱ<43>Ӹ<EFBFBD>λ */
if(usartx == USART1)
{
/* <20><>λUSART1 */
std_rcc_apb2_reset(RCC_PERIPH_RESET_USART1);
/* <20>ر<EFBFBD>USART1ʱ<31><CAB1> */
std_rcc_apb2_clk_disable(RCC_PERIPH_CLK_USART1);
}
else if(usartx == UART2)
{
/* <20><>λUART2 */
std_rcc_apb1_reset(RCC_PERIPH_RESET_UART2);
/* <20>ر<EFBFBD>UART2ʱ<32><CAB1> */
std_rcc_apb1_clk_disable(RCC_PERIPH_CLK_UART2);
}
else if(usartx == UART3)
{
/* <20><>λUART3 */
std_rcc_apb1_reset(RCC_PERIPH_RESET_UART3);
/* <20>ر<EFBFBD>UART3ʱ<33><CAB1> */
std_rcc_apb1_clk_disable(RCC_PERIPH_CLK_UART3);
}
else if(usartx == UART4)
{
/* <20><>λUART4 */
std_rcc_apb1_reset(RCC_PERIPH_RESET_UART4);
/* <20>ر<EFBFBD>UART4ʱ<34><CAB1> */
std_rcc_apb1_clk_disable(RCC_PERIPH_CLK_UART4);
}
else
{
/* <20><><EFBFBD>޲<EFBFBD><DEB2><EFBFBD> */
}
}
/**
* @brief USART<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
* @param usart_init_struct USART<EFBFBD><EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
void std_usart_struct_init(std_usart_init_t *usart_init_struct)
{
usart_init_struct->baudrate = 115200;
usart_init_struct->over_sample = USART_OVERSAMPLE_16;
usart_init_struct->wordlength = USART_WORDLENGTH_8BITS;
usart_init_struct->stopbits = USART_STOPBITS_1;
usart_init_struct->direction = USART_DIRECTION_SEND_RECEIVE;
usart_init_struct->parity = USART_PARITY_NONE;
usart_init_struct->hardware_flow = USART_FLOWCONTROL_NONE;
}
/**
* @brief USARTͬ<EFBFBD><EFBFBD>ʱ<EFBFBD>ӳ<EFBFBD>ʼ<EFBFBD><EFBFBD>
* @param usartx USART<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param usart_sync_clk_init_param USARTͬ<EFBFBD><EFBFBD>ʱ<EFBFBD>ӽ<EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
void std_usart_sync_clk_init(USART_t *usartx, std_usart_sync_clk_init_t *usart_sync_clk_init_param)
{
/* <20><><EFBFBD><EFBFBD>CK<43><4B><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
if( USART_CLOCK_ENABLE == usart_sync_clk_init_param->sync_clk)
{
std_usart_clk_enable(usartx);
}
else
{
std_usart_clk_disable(usartx);
}
/* <20><><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>λ */
std_usart_set_sync_clk_phase(usartx,usart_sync_clk_init_param->sync_clock_phase);
/* <20><><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC>ʱ<EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD> */
std_usart_set_sync_clk_polarity(usartx,usart_sync_clk_init_param->sync_clock_polarity);
}
/**
* @brief USARTͬ<EFBFBD><EFBFBD>ʱ<EFBFBD>ӽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
* @param usart_sync_clk_struct USARTͬ<EFBFBD><EFBFBD>ʱ<EFBFBD>ӽ<EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
void std_usart_sync_clk_struct_init(std_usart_sync_clk_init_t *usart_sync_clk_struct)
{
usart_sync_clk_struct->sync_clk = USART_CLOCK_ENABLE;
usart_sync_clk_struct->sync_clock_polarity = USART_SYNC_POLARITY_LOW;
usart_sync_clk_struct->sync_clock_phase = USART_SYNC_PHASE_1EDGE;
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>USART<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param usartx USART<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param baudrate <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @retval std_status_t <EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ý<EFBFBD><EFBFBD><EFBFBD>
*/
std_status_t std_usart_baudrate_config(USART_t *usartx, uint32_t baudrate)
{
uint32_t pclk;
uint32_t over_sample;
uint32_t brr_value;
/* <20><>ȡUSARTʱ<54><CAB1>Ƶ<EFBFBD><C6B5> */
if(usartx == USART1)
{
pclk = std_rcc_get_pclk2freq();
}
else if((usartx == UART2) | (usartx == UART3) | (usartx == UART4))
{
pclk = std_rcc_get_pclk1freq();
}
else
{
return STD_ERR;
}
/* <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
over_sample=std_usart_get_over_sample(usartx);
/* <20><><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD> */
if(over_sample == USART_OVERSAMPLE_8)
{
brr_value = ((((pclk)<<1U) + ((baudrate)>>1U)) / (baudrate));
}
else if(over_sample == USART_OVERSAMPLE_16)
{
brr_value = (((pclk)+((baudrate)>>1U))/(baudrate));
}
else
{
return STD_ERR;
}
/* BRRȡֵ<C8A1><D6B5>Χ[0x10,0xFFFF], <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0x10(0d16) */
if ((brr_value >= USART_BRR_MIN) && (brr_value <= USART_BRR_MAX))
{
usartx->BRR = (uint32_t)brr_value;
return STD_OK;
}
else
{
return STD_ERR;
}
}
/**
* @}
*/
#endif /* STD_USART_PERIPHERAL_USED */
/**
* @}
*/
/**
* @}
*/