📄 stm32f10x_usart.c
字号:
/******************** (C) COPYRIGHT 2008 STMicroelectronics ********************
* 文件名称: stm32f10x_usart.c
* 程序作者: MCD Application Team
* 程序版本: V2.0.2
* 编制日期: 07/11/2008
* 功能描述: 这个文件提供了所有USART的固件函数
* 本文汉化: 孙可 2008.08.15
********************************************************************************
* 目前的固件的目的是为客户提供关于他们的产品的编码信息以便于节省他们时间。
* 结果, 意法半导体将不会为此承担任何直接,间接或相应的损害赔偿方面的任何索赔要求,
* 例如固件或使用所作的客户编码中他涉嫌包含与他们的相关产品的信息。
*******************************************************************************/
/* 包涵的文件 ------------------------------------------------------------------*/
#include "stm32f10x_usart.h"
#include "stm32f10x_rcc.h"
/* 自用类型 -----------------------------------------------------------*/
/* 自用定义 ------------------------------------------------------------*/
/* USART UE Mask */
#define CR1_UE_Set ((u16)0x2000) /* USART Enable Mask */
#define CR1_UE_Reset ((u16)0xDFFF) /* USART Disable Mask */
/* USART WakeUp Method */
#define CR1_WAKE_Mask ((u16)0xF7FF) /* USART WakeUp Method Mask */
/* USART RWU Mask */
#define CR1_RWU_Set ((u16)0x0002) /* USART mute mode Enable Mask */
#define CR1_RWU_Reset ((u16)0xFFFD) /* USART mute mode Enable Mask */
#define CR1_SBK_Set ((u16)0x0001) /* USART Break Character send Mask */
#define CR1_CLEAR_Mask ((u16)0xE9F3) /* USART CR1 Mask */
#define CR2_Address_Mask ((u16)0xFFF0) /* USART address Mask */
/* USART LIN Mask */
#define CR2_LINEN_Set ((u16)0x4000) /* USART LIN Enable Mask */
#define CR2_LINEN_Reset ((u16)0xBFFF) /* USART LIN Disable Mask */
/* USART LIN Break detection */
#define CR2_LBDL_Mask ((u16)0xFFDF) /* USART LIN Break detection Mask */
#define CR2_STOP_CLEAR_Mask ((u16)0xCFFF) /* USART CR2 STOP Bits Mask */
#define CR2_CLOCK_CLEAR_Mask ((u16)0xF0FF) /* USART CR2 Clock Mask */
/* USART SC Mask */
#define CR3_SCEN_Set ((u16)0x0020) /* USART SC Enable Mask */
#define CR3_SCEN_Reset ((u16)0xFFDF) /* USART SC Disable Mask */
/* USART SC NACK Mask */
#define CR3_NACK_Set ((u16)0x0010) /* USART SC NACK Enable Mask */
#define CR3_NACK_Reset ((u16)0xFFEF) /* USART SC NACK Disable Mask */
/* USART Half-Duplex Mask */
#define CR3_HDSEL_Set ((u16)0x0008) /* USART Half-Duplex Enable Mask */
#define CR3_HDSEL_Reset ((u16)0xFFF7) /* USART Half-Duplex Disable Mask */
/* USART IrDA Mask */
#define CR3_IRLP_Mask ((u16)0xFFFB) /* USART IrDA LowPower mode Mask */
#define CR3_CLEAR_Mask ((u16)0xFCFF) /* USART CR3 Mask */
/* USART IrDA Mask */
#define CR3_IREN_Set ((u16)0x0002) /* USART IrDA Enable Mask */
#define CR3_IREN_Reset ((u16)0xFFFD) /* USART IrDA Disable Mask */
#define GTPR_LSB_Mask ((u16)0x00FF) /* Guard Time Register LSB Mask */
#define GTPR_MSB_Mask ((u16)0xFF00) /* Guard Time Register MSB Mask */
#define IT_Mask ((u16)0x001F) /* USART Interrupt Mask */
/* 自用宏 -------------------------------------------------------------*/
/* 自用变量 ---------------------------------------------------------*/
/* 自用函数原型 -----------------------------------------------*/
/* 自用函数 ---------------------------------------------------------*/
/*******************************************************************************
* 函数名称: USART_DeInit
* 功能描述: 重置USARTx外围寄存器为默认重置值.
* 输入参数: USARTx: 选择这个USART 或者这个UART外设.
* 这个参数可以是下面的值之一 :
* - USART1, USART2, USART3, UART4 or UART5.
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void USART_DeInit(USART_TypeDef* USARTx)
{
/* Check the parameters [检查参数]*/
assert_param(IS_USART_ALL_PERIPH(USARTx));
switch (*(u32*)&USARTx)
{
case USART1_BASE:
RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, DISABLE);
break;
case USART2_BASE:
RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, ENABLE);
RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, DISABLE);
break;
case USART3_BASE:
RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, ENABLE);
RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, DISABLE);
break;
case UART4_BASE:
RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4, ENABLE);
RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4, DISABLE);
break;
case UART5_BASE:
RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART5, ENABLE);
RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART5, DISABLE);
break;
default:
break;
}
}
/*******************************************************************************
* 函数名称: USART_Init
* 功能描述: 根据USART_InitStruct中的指定的参数初始化USARTx外围设备 .
* 输入参数: (1)USARTx: 选择这个USART 或者这个UART外设.
* 这个参数可以是下面的值之一 :
* - USART1, USART2, USART3, UART4 or UART5.
* (2)USART_InitStruct:指向包含特定的USART外围设备配置信息的USART_InitTypeDef结构体..
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct)
{
u32 tmpreg = 0x00, apbclock = 0x00;
u32 integerdivider = 0x00;
u32 fractionaldivider = 0x00;
u32 usartxbase = 0;
RCC_ClocksTypeDef RCC_ClocksStatus;
/* Check the parameters [检查参数]*/
assert_param(IS_USART_ALL_PERIPH(USARTx));
assert_param(IS_USART_BAUDRATE(USART_InitStruct->USART_BaudRate));
assert_param(IS_USART_WORD_LENGTH(USART_InitStruct->USART_WordLength));
assert_param(IS_USART_STOPBITS(USART_InitStruct->USART_StopBits));
assert_param(IS_USART_PARITY(USART_InitStruct->USART_Parity));
assert_param(IS_USART_MODE(USART_InitStruct->USART_Mode));
assert_param(IS_USART_HARDWARE_FLOW_CONTROL(USART_InitStruct->USART_HardwareFlowControl));
/* The hardware flow control is available only for USART1, USART2 and USART3 [这个硬件流控制只能用于USART1,USART2和USART3]*/
assert_param(IS_USART_PERIPH_HFC(USARTx, USART_InitStruct->USART_HardwareFlowControl));
usartxbase = (*(u32*)&USARTx);
/*---------------------------- USART CR2 Configuration [USART CR2配置]*/
tmpreg = USARTx->CR2;
/* Clear STOP[13:12] bits [清除STOP[13:12]位]*/
tmpreg &= CR2_STOP_CLEAR_Mask;
/* Configure the USART Stop Bits, Clock, CPOL, CPHA and LastBit [配置USART STOP位,Clock, CPOL, CPHA 和 LastBit]*/
/* Set STOP[13:12] bits according to USART_StopBits value [依照USART_StopBits的值设置STOP[13:12]位]*/
tmpreg |= (u32)USART_InitStruct->USART_StopBits;
/* Write to USART CR2 [写USART CR2]*/
USARTx->CR2 = (u16)tmpreg;
/*---------------------------- USART CR1 Configuration [USART CR1配置]--------*/
tmpreg = USARTx->CR1;
/* Clear M, PCE, PS, TE and RE bits [清M, PCE, PS, TE和RE位]*/
tmpreg &= CR1_CLEAR_Mask;
/* Configure the USART Word Length, Parity and mode [配置USART的字长,奇偶校验和模式] */
/* Set the M bits according to USART_WordLength value [依照USART_WordLength值设置M位]*/
/* Set PCE and PS bits according to USART_Parity value [依照USART_Parity值设置PCE和PS位]*/
/* Set TE and RE bits according to USART_Mode value [依照USART_Mode值设置TE和RE位]*/
tmpreg |= (u32)USART_InitStruct->USART_WordLength | USART_InitStruct->USART_Parity |
USART_InitStruct->USART_Mode;
/* Write to USART CR1 [写USART CR1]*/
USARTx->CR1 = (u16)tmpreg;
/*---------------------------- USART CR3 Configuration [USART CR3配置]--------*/
tmpreg = USARTx->CR3;
/* Clear CTSE and RTSE bits [清CTSE 和 RTSE位]*/
tmpreg &= CR3_CLEAR_Mask;
/* Configure the USART HFC [配置USART HFC]----------------------------------*/
/* Set CTSE and RTSE bits according to USART_HardwareFlowControl value [依照USART_HardwareFlowControl值设置CTSE和RTSE位]*/
tmpreg |= USART_InitStruct->USART_HardwareFlowControl;
/* Write to USART CR3 [写USART CR3]*/
USARTx->CR3 = (u16)tmpreg;
/*---------------------------- USART BRR Configuration [USART BRR配置]--------*/
/* Configure the USART Baud Rate [配置USART 波特率]-------------------*/
RCC_GetClocksFreq(&RCC_ClocksStatus);
if (usartxbase == USART1_BASE)
{
apbclock = RCC_ClocksStatus.PCLK2_Frequency;
}
else
{
apbclock = RCC_ClocksStatus.PCLK1_Frequency;
}
/* Determine the integer part [确定整数部分]*/
integerdivider = ((0x19 * apbclock) / (0x04 * (USART_InitStruct->USART_BaudRate)));
tmpreg = (integerdivider / 0x64) << 0x04;
/* Determine the fractional part [确定小数部分]*/
fractionaldivider = integerdivider - (0x64 * (tmpreg >> 0x04));
tmpreg |= ((((fractionaldivider * 0x10) + 0x32) / 0x64)) & ((u8)0x0F);
/* Write to USART BRR [写USART BRR]*/
USARTx->BRR = (u16)tmpreg;
}
/*******************************************************************************
* 函数名称: USART_StructInit
* 功能描述: 用默认值填充每一个USART_InitStruct成员.
* 输入参数: USART_InitStruct: 指向会被初始化的USART_InitTypeDef结构体.
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void USART_StructInit(USART_InitTypeDef* USART_InitStruct)
{
/* USART_InitStruct members default value [USART_InitStruct结构成员的默认值]*/
USART_InitStruct->USART_BaudRate = 9600;
USART_InitStruct->USART_WordLength = USART_WordLength_8b;
USART_InitStruct->USART_StopBits = USART_StopBits_1;
USART_InitStruct->USART_Parity = USART_Parity_No ;
USART_InitStruct->USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_InitStruct->USART_HardwareFlowControl = USART_HardwareFlowControl_None;
}
/*******************************************************************************
* 函数名称: USART_ClockInit
* 功能描述: 依照USART_ClockInitStruct指定参数初始化 USARTx 外围设备时钟 .
* 输入参数: (1)USARTx: x可以是 1, 2, 3 来选择USART外设.
* 注意:智能卡模式不能使用 UART4 和 UART5.
* (2)USART_ClockInitStruct: USART_ClockInitTypeDef的结构指针包含USART设备的配置信息。
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void USART_ClockInit(USART_TypeDef* USARTx, USART_ClockInitTypeDef* USART_ClockInitStruct)
{
u32 tmpreg = 0x00;
/* Check the parameters [检查参数]*/
assert_param(IS_USART_123_PERIPH(USARTx));
assert_param(IS_USART_CLOCK(USART_ClockInitStruct->USART_Clock));
assert_param(IS_USART_CPOL(USART_ClockInitStruct->USART_CPOL));
assert_param(IS_USART_CPHA(USART_ClockInitStruct->USART_CPHA));
assert_param(IS_USART_LASTBIT(USART_ClockInitStruct->USART_LastBit));
/*---------------------------- USART CR2 Configuration [USART CR2配置]--------*/
tmpreg = USARTx->CR2;
/* Clear CLKEN, CPOL, CPHA and LBCL bits [清CLKEN,CPOL,CPHA和LBCL位]*/
tmpreg &= CR2_CLOCK_CLEAR_Mask;
/* Configure the USART Clock, CPOL, CPHA and LastBit [配置USART STOP位,Clock, CPOL, CPHA 和 LastBit]*/
/* Set CLKEN bit according to USART_Clock value [依照USART_Clock值设置CLKEN位]*/
/* Set CPOL bit according to USART_CPOL value [依照USART_CPOL值设置CPOL位]*/
/* Set CPHA bit according to USART_CPHA value [依照USART_CPHA值设置CPHA位]*/
/* Set LBCL bit according to USART_LastBit value [依照USART_LastBit值设置LBCL位]*/
tmpreg |= (u32)USART_ClockInitStruct->USART_Clock | USART_ClockInitStruct->USART_CPOL |
USART_ClockInitStruct->USART_CPHA | USART_ClockInitStruct->USART_LastBit;
/* Write to USART CR2 [写USART CR2]*/
USARTx->CR2 = (u16)tmpreg;
}
/*******************************************************************************
* 函数名称: USART_ClockStructInit
* 功能描述: 用默认值填充每一个USART_ClockInitStruct的成员.
* 输入参数: - USART_ClockInitStruct: 将要初始化指向USART_ClockInitTypeDef结构的指针.
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void USART_ClockStructInit(USART_ClockInitTypeDef* USART_ClockInitStruct)
{
/* USART_ClockInitStruct members default value [USART_ClockInitStruct成员默认值]*/
USART_ClockInitStruct->USART_Clock = USART_Clock_Disable;
USART_ClockInitStruct->USART_CPOL = USART_CPOL_Low;
USART_ClockInitStruct->USART_CPHA = USART_CPHA_1Edge;
USART_ClockInitStruct->USART_LastBit = USART_LastBit_Disable;
}
/*******************************************************************************
* 函数名称: USART_Cmd
* 功能描述: E使能或禁用特定的USART外围设备.
* 输入参数: (1)USARTx: 选择 USART 或者 UART的外围设备.
* 这个参数可以是下面的值之一 :
* - USART1, USART2, USART3, UART4 or UART5.
* (2)Newstate:USARTx外围设备的新状态.这个参数能够取:ENABLE或者DISABLE
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState)
{
/* Check the parameters [检查参数]*/
assert_param(IS_USART_ALL_PERIPH(USARTx));
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
{
/* Enable the selected USART by setting the UE bit in the CR1 register [置位CR1寄存器中的UE位,来使能选择的USART]*/
USARTx->CR1 |= CR1_UE_Set;
}
else
{
/* Disable the selected USART by clearing the UE bit in the CR1 register [清零CR1寄存器中的UE位,来禁止选择的USART]*/
USARTx->CR1 &= CR1_UE_Reset;
}
}
/*******************************************************************************
* 函数名称: USART_ITConfig
* 功能描述: 使能或禁用特定的USART中断.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -