integerdivider = ((25 * apbclock) / (4 * (USART_InitStruct->USART_BaudRate))); } tmpreg = (integerdivider / 100) << 4; /* 小数部分 */ fractionaldivider = integerdivider - (100 * (tmpreg >> 4)); /* Implement the fractional part in the register */ if ((USARTx->CR1 & CR1_OVER8_Set) != 0) { tmpreg |= ((((fractionaldivider * 8) + 50) / 100)) & ((uint8_t)0x07); } else /* if ((USARTx->CR1 & CR1_OVER8_Set) == 0) */ { tmpreg |= ((((fractionaldivider * 16) + 50) / 100)) & ((uint8_t)0x0F); } /* 写USART BRR */ USARTx->BRR = (uint16_t)tmpreg; }
[编辑] 函数USART_StructInit
/*-----------------------------------------------------------------------------------------------------
// 功能描述 把USART_InitStruct中的每一个参数按缺省值填入
// 输入参数 USART_InitStruct:指向结构USART_InitTypeDef的指针,待初始化
// 返回值 无
-----------------------------------------------------------------------------------------------------*/
void USART_StructInit(USART_InitTypeDef* USART_InitStruct) { /* USART_InitStruct 成员缺省值 */ USART_InitStruct->USART_BaudRate = 9600; //波特率9600 USART_InitStruct->USART_WordLength = USART_WordLength_8b; //字长8位 USART_InitStruct->USART_StopBits = USART_StopBits_1; //停止位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_Cmd
/*----------------------------------------------------------------------------------------------------- // 功能描述 使能或者失能USART外设
// 输入参数 USARTx:选择USART或 UART 外设 // 可以是下列值之一:
// USART1, USART2, USART3, UART4 或 UART5 // 输入参数 NewState:外设USARTx的新状态 // 可以是:ENABLE或DISABLE // 返回值 无
-----------------------------------------------------------------------------------------------------*/
void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState) { /* 检查输入参数 */ assert_param(IS_USART_ALL_PERIPH(USARTx)); assert_param(IS_FUNCTIONAL_STATE(NewState)); if (NewState != DISABLE) { /* 通过设置CR1中的UE使能选择的USART */ USARTx->CR1 |= CR1_UE_Set; } else { /* 通过设置CR1中的UE失能选择的USART */ USARTx->CR1 &= CR1_UE_Reset; } }
[编辑] 函数USART_ITConfig
/*-----------------------------------------------------------------------------------------------------
// 功能描述 使能或失能指定的USART中断
// 输入参数 USARTx:选择USART或 UART 外设 // 可以是下列值之一:
// USART1,USART2,USART3,UART4 或 UART5
// 输入参数 USART_IT:待使能或者失能的USART中断源 // 可以是下列值之一:
// USART_IT_CTS: CTS 变化中断(UART4 和 UART5不可用) // USART_IT_LBD: LIN 断开检测中断
// USART_IT_TXE: 发送数据寄存器空中断 // USART_IT_TC: 发送完成中断
// USART_IT_RXNE: 接收数据寄存器非空中断 // USART_IT_IDLE: 空闲帧检测中断 // USART_IT_PE: 校验错误中断
// USART_IT_ERR: 错误中断(帧错误,噪声错误,上溢错误) // 输入参数 NewState:外设USARTx的新状态 // 可以是:ENABLE或DISABLE // 返回值 无
-----------------------------------------------------------------------------------------------------*/
void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState) {
uint32_t usartreg = 0x00, itpos = 0x00, itmask = 0x00; uint32_t usartxbase = 0x00; /* 检查输入参数 */
assert_param(IS_USART_ALL_PERIPH(USARTx)); assert_param(IS_USART_CONFIG_IT(USART_IT)); assert_param(IS_FUNCTIONAL_STATE(NewState)); /* CTS中断对UART4和UART5是无效的 */ if (USART_IT == USART_IT_CTS) {
assert_param(IS_USART_123_PERIPH(USARTx)); }
usartxbase = (uint32_t)USARTx;
/* 获得USART寄存器索引 */
usartreg = (((uint8_t)USART_IT) >> 0x05);
/* 获得中断位置 */
itpos = USART_IT & IT_Mask;
itmask = (((uint32_t)0x01) << itpos);
if (usartreg == 0x01) /* The IT is in CR1 register */ {
usartxbase += 0x0C; }
else if (usartreg == 0x02) /* The IT is in CR2 register */
{
usartxbase += 0x10; }
else /* 在CR3中的中断 */ {
usartxbase += 0x14; }
if (NewState != DISABLE) {
*(__IO uint32_t*)usartxbase |= itmask; } else {
*(__IO uint32_t*)usartxbase &= ~itmask; } }
[编辑] 函数USART_SendData
/*-----------------------------------------------------------------------------------------------------
// 功能描述 通过外设USARTx发送单个数据 // 输入参数 USARTx:选择USART或 UART 外设 // 可以是下列值之一:
// USART1, USART2, USART3, UART4 或 UART5 // 输入参数 Data:待发送的数据 // 返回值 无
-----------------------------------------------------------------------------------------------------*/
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data) {
/* 检查输入参数 */
assert_param(IS_USART_ALL_PERIPH(USARTx)); assert_param(IS_USART_DATA(Data));
/* 发送数据 */
USARTx->DR = (Data & (uint16_t)0x01FF); }
[编辑] 函数USART_ReceiveData
/*-----------------------------------------------------------------------------------------------------
// 功能描述 返回USARTx最近接收到的数据 // 输入参数 USARTx:选择USART或 UART 外设