STM32串口通信

 

一、单片机通信方式

单片机与外部通信的方式可分为并行通信和串行通信

并行通信:数据各个位同时传输,传输速度快,但占用引脚资源多

串行通信:数据按位顺序传输,占用引脚资源少,但传输速度慢

笔者在这里主要介绍使用较多的串行通信

二、串行通信

1、通信方向

串行通信按照传送方向可分为单工、半双工以及全双工

单工:数据传输只支持在一个方向上,即数据只能从发送端传到接收端

半双工:允许数据在两个方向上传输,但每个时刻只允许一个方向传输。可理解为一个端口可以是发送端也可以是接收端,但在某一时刻数据只能从发送端传到接收端

全双工:允许数据同时在两个方向上传输。即设备上有发送端和接收端两个端口,同一时刻内可以进行两个方向上的传输

2、通信方式

串行通信的通信方式又可分为同步通信和异步通信

同步通信:带时钟同步信号传输(-SPI,IIC)

异步通信:不带时钟同步信号传输(-UART)

三、USART配置

1、GPIO配置

在这里我们用USART1的全双工通信,根据中文手册可知

USART1的TX接PA9引脚,

USART1的RX接PA10引脚

使用全双工通信方向,应将

PA9引脚的GPIO配置为推挽复用输出

将PA10引脚的GPIO配置为浮空输入

代码实现

	GPIO_InitTypeDef GPIO_InitStruct;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	GPIO_InitStruct.GPIO_Pin = USART1_GPIO_PIN_TX;//PA9
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;	
	GPIO_Init(GPIOA, &GPIO_InitStruct);
	
	GPIO_InitStruct.GPIO_Pin = USART1_GPIO_PIN_RX;//PA10
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;	
	GPIO_Init(GPIOA, &GPIO_InitStruct);	
	

2、USART1初始化

我们设置波特率为9600,硬件流控制为无,使发送和接收使能,没有奇偶校验,停止位为1,字长为8

代码实现

	USART_InitTypeDef USART1_InitStrue;
   	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
    USART1_InitStrue.USART_BaudRate = 9600;//波特率为9600
	USART1_InitStrue.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//硬件流控制为无
	USART1_InitStrue.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;//使发送和接收使能
	USART1_InitStrue.USART_Parity = USART_Parity_No;//没有奇偶校验
	USART1_InitStrue.USART_StopBits=USART_StopBits_1;//停止位为1
	USART1_InitStrue.USART_WordLength = USART_WordLength_8b;//字长为8
	USART_Init( USART1, &USART1_InitStrue);

3、开启中断并配置NVIC

代码实现

	USART_Cmd(USART1,ENABLE);
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
	NVIC_InitStructure.NVIC_IRQChannel =USART1_IRQn ;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; 
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelCmd= ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	

4、配置中断服务函数

当单片机接收到信号时产生中断,并使单片机的发送端给电脑发送单片机所接收到的信息

我们用USART_GetITStatus()函数读取单片机接收端是否接收到信号

用USART_SendData()函数读取单片机接收到的信息

void USART1_IRQHandler(void)
{
 u8 res;
 if (USART_GetITStatus(USART1,USART_IT_RXNE))
 {
  res= USART_ReceiveData(USART1);
  USART_SendData(USART1 res);
 }
}

本文参考正点原子

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XiaoRui_04

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值