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