STM32 例程 串口实验 联系客服

发布时间 : 星期一 文章STM32 例程 串口实验更新完毕开始阅读0da07ef59e314332396893d0

#define USART_Parity_Even ((uint16_t)0x0400) #define USART_Parity_Odd ((uint16_t)0x0600) /* USART_Mode 用于配置RE位(USART_CR1[2])和TE位(USART_CR1[3]) */ #define USART_Mode_Rx ((uint16_t)0x0004) #define USART_Mode_Tx ((uint16_t)0x0008) /* USART_HardwareFlowControl 用于配置RTSE位(USART_CR3[8])和CTSE位(USART_CR3[9]) */

#define USART_HardwareFlowControl_None ((uint16_t)0x0000) #define USART_HardwareFlowControl_RTS ((uint16_t)0x0100) #define USART_HardwareFlowControl_CTS ((uint16_t)0x0200) #define USART_HardwareFlowControl_RTS_CTS ((uint16_t)0x0300) [编辑] USART库函数

此处介绍的库函数只是一些比较常用的,详见\\stm32f10x_usart.c文件

[编辑] 函数USART_DeInit

/*-----------------------------------------------------------------------------------------------------

// 功能描述 将外设USARTx寄存器重设为缺省值 // 输入参数 USARTx:选择USART或 UART 外设 // 可以是下列值之一:

// USART1, USART2, USART3, UART4 或 UART5 // 返回值 无

-----------------------------------------------------------------------------------------------------*/

void USART_DeInit(USART_TypeDef* USARTx) { /* 检查输入参数 */ assert_param(IS_USART_ALL_PERIPH(USARTx)); if (USARTx == USART1) { /* 强制或者释放APB2外设复位 */ RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, ENABLE); RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, DISABLE); } /* 强制或者释放APB1外设复位 */ else if (USARTx == USART2) { RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, ENABLE); RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, DISABLE);

} else if (USARTx == USART3) { RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, ENABLE); RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, DISABLE); } else if (USARTx == UART4) { RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4, ENABLE); RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4, DISABLE); } else { if (USARTx == UART5) { RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART5, ENABLE); RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART5, DISABLE); } } }

[编辑] 函数USART_Init

/*-----------------------------------------------------------------------------------------------------

// 功能描述 根据USART_InitStruct中指定的参数初始化外设USARTx寄存器 // 输入参数 USARTx:选择USART或 UART 外设 // 可以是下列值之一:

// USART1, USART2, USART3, UART4 或 UART5

// 输入参数 USART_InitStruct:指向结构USART_InitTypeDef的指针,包含了外设USART的配置信息 // 返回值 无

-----------------------------------------------------------------------------------------------------*/

void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct) { uint32_t tmpreg = 0x00, apbclock = 0x00; uint32_t integerdivider = 0x00; uint32_t fractionaldivider = 0x00; uint32_t usartxbase = 0;

RCC_ClocksTypeDef RCC_ClocksStatus; /* 检查输入参数 */ 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)); /* 硬件流控制只对USART1, USART2 和 USART3 有效 */ if (USART_InitStruct->USART_HardwareFlowControl != USART_HardwareFlowControl_None) { assert_param(IS_USART_123_PERIPH(USARTx)); } usartxbase = (uint32_t)USARTx; /*---------------------------- USART CR2 配置-----------------------*/ tmpreg = USARTx->CR2; /* 清除STOP[13:12] */ tmpreg &= CR2_STOP_CLEAR_Mask; /* 配置USART 停止位,时钟,时钟极性,时钟相位和最后一位------------*/ /* 根据USART_StopBits设置STOP[13:12] */ tmpreg |= (uint32_t)USART_InitStruct->USART_StopBits; /* 写USART CR2 */ USARTx->CR2 = (uint16_t)tmpreg; /*---------------------------- USART CR1 配置-----------------------*/ tmpreg = USARTx->CR1; /* 清除M, PCE, PS, TE 和 RE */ tmpreg &= CR1_CLEAR_Mask; /* 配置USART 字长,校验和模式 ----------------------- */ /* 根据USART_WordLength设置M */ /* 根据USART_Parity设置PCE和PS */

/* 根据USART_Mode设置TE和RE */ tmpreg |= (uint32_t)USART_InitStruct->USART_WordLength | USART_InitStruct->USART_Parity |

USART_InitStruct->USART_Mode; /* 写USART CR1 */ USARTx->CR1 = (uint16_t)tmpreg; /*---------------------------- USART CR3 配置 -----------------------*/ tmpreg = USARTx->CR3; /* 清除CTSE和RTSE */ tmpreg &= CR3_CLEAR_Mask; /* 配置USART硬件流控制

-------------------------------------------------*/ /* 根据USART_HardwareFlowControl设置CTSE和RTSE */ tmpreg |= USART_InitStruct->USART_HardwareFlowControl; /* 写USART CR3 */ USARTx->CR3 = (uint16_t)tmpreg; /*---------------------------- USART BRR 配置 -----------------------*/ /* 配置USART波特率

-------------------------------------------*/ RCC_GetClocksFreq(&RCC_ClocksStatus); if (usartxbase == USART1_BASE) { apbclock = RCC_ClocksStatus.PCLK2_Frequency; } else { apbclock = RCC_ClocksStatus.PCLK1_Frequency; } /* 整数部分 */ if ((USARTx->CR1 & CR1_OVER8_Set) != 0) { /* 在过采样模式为8次采样下的整数部分的计算 */ integerdivider = ((25 * apbclock) / (2 * (USART_InitStruct->USART_BaudRate))); } else /* if ((USARTx->CR1 & CR1_OVER8_Set) == 0) */ { /*在过采样模式为16次采样下的整数部分的计算 */