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库驱动。
|
||
* 实现USART初始化、波特率配置、clock配置等功能API。
|
||
*
|
||
**************************************************************************************************
|
||
* @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初始化
|
||
* @param usartx USART外设
|
||
* @param usart_init_param USART初始化结构体
|
||
* @retval std_status_t 返回初始化配置结果
|
||
*/
|
||
std_status_t std_usart_init(USART_t *usartx,std_usart_init_t *usart_init_param)
|
||
{
|
||
/* 设置USART字长 */
|
||
std_usart_set_word_length(usartx,usart_init_param->wordlength);
|
||
|
||
/* 设置USART停止位 */
|
||
std_usart_set_stopbits(usartx,usart_init_param->stopbits);
|
||
|
||
/* 设置USART过采样,如果配置为8倍过采样可以达到最大通信速率 */
|
||
std_usart_set_over_sample(usartx,usart_init_param->over_sample);
|
||
|
||
/* 设置USART通信模式(单发送、单接收、发送/接收)*/
|
||
std_usart_set_transfer_direction(usartx,usart_init_param->direction);
|
||
|
||
/* 设置奇偶校验 */
|
||
std_usart_set_parity(usartx,usart_init_param->parity);
|
||
|
||
/* 设置硬件流控 */
|
||
std_usart_set_hardflow_control(usartx,usart_init_param->hardware_flow);
|
||
|
||
/* 设置波特率 */
|
||
if(std_usart_baudrate_config(usartx,usart_init_param->baudrate)!=STD_OK)
|
||
{
|
||
return STD_ERR;
|
||
}
|
||
|
||
return STD_OK;
|
||
|
||
}
|
||
|
||
|
||
/**
|
||
* @brief USART去初始化
|
||
* @param usartx USART外设
|
||
* @retval std_status_t 返回去初始化结果
|
||
*/
|
||
void std_usart_deinit(USART_t *usartx)
|
||
{
|
||
std_usart_disable(usartx);
|
||
|
||
/* USART 的RCC时钟复位 */
|
||
if(usartx == USART1)
|
||
{
|
||
/* 复位USART1 */
|
||
std_rcc_apb2_reset(RCC_PERIPH_RESET_USART1);
|
||
/* 关闭USART1时钟 */
|
||
std_rcc_apb2_clk_disable(RCC_PERIPH_CLK_USART1);
|
||
}
|
||
else if(usartx == UART2)
|
||
{
|
||
/* 复位UART2 */
|
||
std_rcc_apb1_reset(RCC_PERIPH_RESET_UART2);
|
||
/* 关闭UART2时钟 */
|
||
std_rcc_apb1_clk_disable(RCC_PERIPH_CLK_UART2);
|
||
}
|
||
else if(usartx == UART3)
|
||
{
|
||
/* 复位UART3 */
|
||
std_rcc_apb1_reset(RCC_PERIPH_RESET_UART3);
|
||
/* 关闭UART3时钟 */
|
||
std_rcc_apb1_clk_disable(RCC_PERIPH_CLK_UART3);
|
||
}
|
||
else if(usartx == UART4)
|
||
{
|
||
/* 复位UART4 */
|
||
std_rcc_apb1_reset(RCC_PERIPH_RESET_UART4);
|
||
/* 关闭UART4时钟 */
|
||
std_rcc_apb1_clk_disable(RCC_PERIPH_CLK_UART4);
|
||
}
|
||
else
|
||
{
|
||
/* 暂无操作 */
|
||
}
|
||
}
|
||
|
||
|
||
/**
|
||
* @brief USART结构体初始化
|
||
* @param usart_init_struct USART结构体
|
||
* @retval 无
|
||
*/
|
||
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同步时钟初始化
|
||
* @param usartx USART外设
|
||
* @param usart_sync_clk_init_param USART同步时钟结构体
|
||
* @retval 无
|
||
*/
|
||
void std_usart_sync_clk_init(USART_t *usartx, std_usart_sync_clk_init_t *usart_sync_clk_init_param)
|
||
{
|
||
/* 配置CK引脚时钟输出 */
|
||
if( USART_CLOCK_ENABLE == usart_sync_clk_init_param->sync_clk)
|
||
{
|
||
std_usart_clk_enable(usartx);
|
||
}
|
||
else
|
||
{
|
||
std_usart_clk_disable(usartx);
|
||
}
|
||
|
||
/* 设置同步时钟相位 */
|
||
std_usart_set_sync_clk_phase(usartx,usart_sync_clk_init_param->sync_clock_phase);
|
||
|
||
/* 设置同步时钟极性 */
|
||
std_usart_set_sync_clk_polarity(usartx,usart_sync_clk_init_param->sync_clock_polarity);
|
||
|
||
}
|
||
|
||
/**
|
||
* @brief USART同步时钟结构体初始化
|
||
* @param usart_sync_clk_struct USART同步时钟结构体
|
||
* @retval 无
|
||
*/
|
||
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 设置USART波特率
|
||
* @param usartx USART外设
|
||
* @param baudrate 波特率
|
||
* @retval std_status_t 返回波特率设置结果
|
||
*/
|
||
std_status_t std_usart_baudrate_config(USART_t *usartx, uint32_t baudrate)
|
||
{
|
||
uint32_t pclk;
|
||
uint32_t over_sample;
|
||
uint32_t brr_value;
|
||
|
||
/* 获取USART时钟频率 */
|
||
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;
|
||
}
|
||
|
||
/* 获取过采样配置 */
|
||
over_sample=std_usart_get_over_sample(usartx);
|
||
|
||
/* 波特率计算 */
|
||
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取值范围[0x10,0xFFFF], 必须大于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 */
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
|