串口收发
调试和开发需要,以及LabVIEW的有线连接上位机设计也是需要到串口收发函数来进行数据的发送和接收
STM32串口的寄存器有那些?
寄存器 | 作用 |
---|---|
SR | 状态寄存器 |
DR | 数据寄存器 |
BRR | 波特比率寄存器 |
CR1 | 控制寄存器1 |
CR2 | 控制寄存器2 |
CR3 | 控制寄存器3 |
GTPR | 保护时间和预分频寄存器 |
stm32f10x_usart.c 库函数
void USART_DeInit(USART_TypeDef* USARTx)
将USARTx外围寄存器初始化为它们的默认重置值。
void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct)
根据指定的初始化USARTx外围设备USART_InitStruct . *参数。
void USART_StructInit(USART_InitTypeDef* USART_InitStruct)
用默认值填充每个USART_InitStruct成员。
void USART_ClockInit(USART_TypeDef* USARTx, USART_ClockInitTypeDef* USART_ClockInitStruct)
参数初始化USARTx外围时钟*在usart_clockkinitstruct中指定参数
void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState)
启用或禁用指定的USART中断。
void USART_DMACmd(USART_TypeDef* USARTx, uint16_t USART_DMAReq, FunctionalState NewState)
启用或禁用USART抯DMA接口。
void USART_SetAddress(USART_TypeDef* USARTx, uint8_t USART_Address)
设置USART节点的地址。
void USART_WakeUpConfig(USART_TypeDef* USARTx, uint16_t USART_WakeUp)
选择USART唤醒方法。
void USART_ReceiverWakeUpCmd(USART_TypeDef* USARTx, FunctionalState NewState)
确定USART是否处于唤醒模式。
void USART_LINBreakDetectLengthConfig(USART_TypeDef* USARTx, uint16_t USART_LINBreakDetectLength)
设置USART LIN Break检测长度。
void USART_LINCmd(USART_TypeDef* USARTx, FunctionalState NewState)
启用或禁用USARTx LIN模式。
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)
通过USARTx外围设备传输单个数据。
uint16_t USART_ReceiveData(USART_TypeDef* USARTx)
返回USARTx外设最近接收到的数据。
void USART_SendBreak(USART_TypeDef* USARTx)
传输返回字符
void USART_SetGuardTime(USART_TypeDef* USARTx, uint8_t USART_GuardTime)
设置指定的USART保护时间。
void USART_SetPrescaler(USART_TypeDef* USARTx, uint8_t USART_Prescaler)
设置系统时钟预调器。
void USART_SmartCardCmd(USART_TypeDef* USARTx, FunctionalState NewState)
启用或禁用USART智能卡模式。
void USART_SmartCardNACKCmd(USART_TypeDef* USARTx, FunctionalState NewState)
启用或禁用NACK传输。
void USART_HalfDuplexCmd(USART_TypeDef* USARTx, FunctionalState NewState)
启用或禁用USART半双工通信。
void USART_OverSampling8Cmd(USART_TypeDef* USARTx, FunctionalState NewState)
启用或禁用USART的8倍过采样模式。
void USART_OneBitMethodCmd(USART_TypeDef* USARTx, FunctionalState NewState)
启用或禁用USART的一位采样方法。
void USART_IrDAConfig(USART_TypeDef* USARTx, uint16_t USART_IrDAMode)
配置USART的IrDA接口。
void USART_IrDACmd(USART_TypeDef* USARTx, FunctionalState NewState)
启用或禁用USART的IrDA接口。
Usart的标志位查询和标志位获取
-
检查是否设置了指定的USART标志
-
清除USARTx的挂起标志。
-
检查指定的USART中断是否发生。
-
清除USARTx的中断挂起位。
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG)
标志位 | 含义 |
---|---|
USART_FLAG_CTS | CTS更改标志(UART4和UART5不可用) |
USART_FLAG_LBD | LIN中断检测标志 |
USART_FLAG_TXE | 发送数据寄存器空标志 |
USART_FLAG_TC | 传输完成标志 |
USART_FLAG_RXNE | 接收数据寄存器不是空标志 |
USART_FLAG_IDLE | 空闲线检测标志 |
USART_FLAG_ORE | 溢出错误标志 |
USART_FLAG_NE | 噪声错误标志 |
USART_FLAG_FE | 帧错误标志 |
USART_FLAG_PE | 奇偶校验错误标志 |
void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG)
标志位 | 含义 |
---|---|
USART_FLAG_CTS | CTS更改标志(UART4和UART5不可用) |
USART_FLAG_LBD | LIN中断检测标志 |
USART_FLAG_TC | 传输完成标志 |
USART_FLAG_RXNE | 接收数据寄存器不是空标志 |
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT)
标志位 | 含义 |
---|---|
USART_IT_CTS | CTS更改中断(UART4和UART5不可用) |
USART_IT_LBD | LIN中断检测中断 |
USART_IT_TXE | 传输数据寄存器空中断 |
USART_IT_TC | 传输完全中断 |
USART_IT_RXNE | 接收数据寄存器不是空中断 |
USART_IT_IDLE | 空闲线路检测中断 |
USART_IT_ORE | 溢出错误中断 |
USART_IT_NE | 噪音错误中断 |
USART_IT_FE | 帧错误中断 |
USART_IT_PE | 奇偶校验错误 |
void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT)
标志位 | 含义 |
---|---|
USART_IT_CTS | CTS更改中断(UART4和UART5不可用) |
USART_IT_LBD | LIN中断检测中断 |
USART_IT_TC | 传输完全中断。 |
USART_IT_RXNE | 接收数据寄存器不是空中断。 |
基于库函数的USART1 函数
usart1 发送配置
- 初始化GPIO的引脚
- 初始化NVIC中断管理器
- 初始化USART1的外设配置
- 使能中断
- 使能usart1
- printf重定向!
代码如下:
#include "usart1.h"
//Printf 重定向
struct __FILE
{
int handle;
};
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
_sys_exit(int x)
{
x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0)
;//循环发送,直到发送完毕
USART1->DR = (u8) ch;
return ch;
}
void Usart1_Init(int bode)
{
GPIO_InitTypeDef Usart1_gpio_InitStructure;
USART_InitTypeDef Usart1_usart_InitStructure;
NVIC_InitTypeDef Usart1_nvic_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);
//TX PA9;
Usart1_gpio_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
Usart1_gpio_InitStructure.GPIO_Pin = GPIO_Pin_9;
Usart1_gpio_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&Usart1_gpio_InitStructure);
//RX PA10;
Usart1_gpio_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
Usart1_gpio_InitStructure.GPIO_Pin = GPIO_Pin_10;
Usart1_gpio_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&Usart1_gpio_InitStructure);
Usart1_nvic_InitStructure.NVIC_IRQChannel = USART1_IRQn;
Usart1_nvic_InitStructure.NVIC_IRQChannelCmd = ENABLE;
Usart1_nvic_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
Usart1_nvic_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_Init(&Usart1_nvic_InitStructure);
Usart1_usart_InitStructure.USART_BaudRate = bode;
Usart1_usart_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
Usart1_usart_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
Usart1_usart_InitStructure.USART_Parity = USART_Parity_No;
Usart1_usart_InitStructure.USART_StopBits = USART_StopBits_1;
Usart1_usart_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_Init(USART1,&Usart1_usart_InitStructure);
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
USART_Cmd(USART1,ENABLE);
}
void USART1_IRQHandler(void)
{
}
Main函数调用:
Usart1_Init(115200);
printf("[KOKO]:初始化中....\n");
串口接收数据和处理数据
发送数据已经解决了,但是在实际的引用中。总会存在着调试的时候相关指令的下发,从而实现软件的控制。
在相关的代码配置中,我们已经完成了串口接收数据中断函数的配置,那么接下类就是学习如何完成在中断内实现数据的接收和存储。
void USART1_IRQHandler(void)
{
}
也是在这个代码段内实现程序中断接收处理数据。
void USART1_IRQHandler(void)
{
u8 Temp;
if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET) // 接收数据寄存器不是空 中断发生
{
Temp= USART_ReceiveData(USART1);
Usart1_rx_Data[RX_Num]=Temp;
RX_Num ++;
}
}