STM32 例程 串口实验 联系客服

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

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 外设