【STM32】串口收发学习

串口收发

调试和开发需要,以及LabVIEW的有线连接上位机设计也是需要到串口收发函数来进行数据的发送和接收

STM32串口的寄存器有那些?

寄存器作用
SR状态寄存器
DR数据寄存器
BRR波特比率寄存器
CR1控制寄存器1
CR2控制寄存器2
CR3控制寄存器3
GTPR保护时间和预分频寄存器

USART1寄存器映像

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的标志位查询和标志位获取

  1.  检查是否设置了指定的USART标志
    
  2.  清除USARTx的挂起标志。
    
  3.  检查指定的USART中断是否发生。
    
  4.  清除USARTx的中断挂起位。
    
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG)
标志位含义
USART_FLAG_CTSCTS更改标志(UART4和UART5不可用)
USART_FLAG_LBDLIN中断检测标志
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_CTSCTS更改标志(UART4和UART5不可用)
USART_FLAG_LBDLIN中断检测标志
USART_FLAG_TC传输完成标志
USART_FLAG_RXNE接收数据寄存器不是空标志
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT)
标志位含义
USART_IT_CTSCTS更改中断(UART4和UART5不可用)
USART_IT_LBDLIN中断检测中断
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_CTSCTS更改中断(UART4和UART5不可用)
USART_IT_LBDLIN中断检测中断
USART_IT_TC传输完全中断。
USART_IT_RXNE接收数据寄存器不是空中断。

基于库函数的USART1 函数

usart1 发送配置

  1. 初始化GPIO的引脚
  2. 初始化NVIC中断管理器
  3. 初始化USART1的外设配置
  4. 使能中断
  5. 使能usart1
  6. 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  ++;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值