STM32的USART串口通讯程序

寄存器与固态库

基于寄存器与基于固件库的stm32 LED流水灯例子的编程方式差异比较:

1、基于寄存器方式的开发特点:
(1)具体参数更直观;
(2)程序运行占用资源少。
(3)寄存器更贴近底层,对外设的工作原理和运行机理会有更深的理解
(4)寄存器版式直接对内部寄存器进行操作,需要我们对寄存器非常熟悉
它的缺陷也不可忽视,如下:
(1)开发速度慢;
(2)程序可读性差;
(3) 维护复杂。
上述缺陷直接影响了开发效率,程序维护成本,交流成本。通常情况下,只有在频繁调用的中断服务函数时利用直接配置寄存器的方式。
2、基于固态库方式开发,也就是直接调用库函数,特点就是:
(1)外设交流方便;
(2)查错简单,易于理解,资料多;
(3)对主控制器STM32上手简单。
(4) 库函数–是用ST提供的库函数开发,有函数的集合,不需要与寄存器直接打教导,提供用户函数调用的API

一、了解串口通信及准备工作

1.串口通信简介

串行通讯是指设备之间通过少量数据信号线,地线以及控制信号线,按数据位形式一位一位地传输数据的通讯方式。

分类
单工:数据传输只支持数据在一个方向上传输。
半双工:允许数据在两个方向上传输。但同一时刻只允许数据在一个方向上传输,它实际上是一种能够切换方向的单工通信,不需要独立的接收端和发送端,两者可以合并使用一个端口。
全双工:允许数据同时在两个方向上传输。因此全双工通信是两个单工通信方式的结合,需要独立的接收端和发送端。

2.STM32 的 USART 简介

通用同步异步收发器(Universal Synchronous Asynchronous Receiver and Transmitter)是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换。有别于 USART 还有一个UART(Universal Asynchronous Receiver and Transmitter),它是在 USART 基础上裁剪掉了同步通信功能,只有异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输
出,我们平时用的串口通信基本都是 UART。
功能框图:
在这里插入图片描述

说明:
任何USART双向通信至少需要两个引脚:接收数据输入(RX)和发送数据输出(TX)。
RX:接收数据串行输入。通过过采样技术来区别数据和噪音,从而恢复数据。
TX:发送数据串行输出。当发送器被禁止时,输出引脚恢复到它的I/O端口配置。当发送器被激活且不发送数据时,TX引脚处于高电平。在单线和智能卡模式里,此I/O口被同时用于数据的发送和接收。
SCLK:发送器时钟输出。此引脚输出用于同步传输的时钟, (在Start位和Stop位上没有时钟脉冲,软件可选地,可以在最后一个数据位送出一个时钟脉冲)。数据可以在RX上同步被接收。这可以用来控制带有移位寄存器的外部设备(例如LCD驱动器)。时钟相位和极性都是软件可编程的。在智能卡模式里,CK可以为智能卡提供时钟。

在IrDA模式里需要下列引脚:
IrDA_RDI: IrDA模式下的数据输入。
IrDA_TDO: IrDA模式下的数据输出。

在硬件流控模式里需要下列引脚:
nCTS: 清除发送,若是高电平,在当前数据传输结束时阻断下一次的数据发送。
nRTS: 发送请求,若是低电平,表明USART准备好接收数据

STM32F103VET6 系统控制器有三个 USART 和两个 UART,UART(通用异步收发器)只是异步传输功能,所以没有 SCLK、nCTS 和 nRTS 功能引脚。

3.实验环境

开发板:野火指南者(STM32F103)
STM32库版本:STM32F10x_StdPeriph_Lib_V3.5.0
IDE:KEIL5
使用到的串口:USART1

二、USART串口实验

1.实验要求

  • 设置波特率为115200,1位停止位,无校验位。
  • STM32给上位机(win10)连续发送hello Windows Cyan!,上位机接收程序使用“串口调试助手“。
  • 当上位机给stm32发送Stop,stm32后,stm32停止发送。

2.实验原理

  • 串口接收
    由于前面已经配置好了stm32的串口1中断,因此当上位机给stm32发送数据时就会触发该中断进入中断处理函数USART1_IRQHandler()接收数据并保存到接受数据缓冲区。
  • 串口发送
    当串口接收完数据并存储到接受数据缓冲区后,主程序就将该缓冲区中的数据按位放到发送数据缓冲区中并发送出去,由上位机的串口调试助手显示stm32发送出来的数据。

3.实验代码

  • 对部分程序进行修改
    修改stm32f10x_it.c文件的串口中断服务函数:
int i=0;
uint8_t ucTemp[50];
void DEBUG_USART_IRQHandler(void)
{
	if(USART_GetITStatus(DEBUG_USARTx,USART_IT_RXNE)!=RESET)
	{
		ucTemp[i] = USART_ReceiveData(USART1);	
	}
  if(ucTemp[i] == '!')
	{
		if(ucTemp[i-1] == '2'&&ucTemp[i-2] == '3'&&ucTemp[i-3] == 'm'&&ucTemp[i-4] == 't'&&ucTemp[i-5] == 's'&&ucTemp[i-6] == ' ')
			if(ucTemp[i-7] == 'p'&&ucTemp[i-8] == 'o'&&ucTemp[i-9] == 't'&&ucTemp[i-10] == 's')
			{
				printf("收到!");
        while(1);
			}
	}
	i++;
}

main.c修改如下:

#include "stm32f10x.h"
#include "bsp_usart.h"


void delay(uint32_t count)
{
	while(count--);
}
int main(void)
{	
  USART_Config();
  while(1)
	{	
		printf("hello Windows Cyan!\n");
		delay(5000000);
	}	
}

4.程序烧录

野火STM32F103指南者开发板资料
提取码:pmf1

  • 用USB线把STM32开发板与电脑连接,STM32端连接的 ‘usb转串口’这个接口,打开STM32开关,可以看到红色的小灯亮起。

  • 开发板上有黄色的跳帽,是相当于导线的作用,此处要求BOOT0和BOOT1接地,RXD接A9,TXD接A10,开发板买来默认就是这样接的,不需要改动。

  • 下载、安装CH340驱动
    在这里插入图片描述

在这里插入图片描述

  • 下载野火调试助手并解压打开
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 使用KEIL5打开图示路径中工程文件
    在这里插入图片描述
  • 根据之前实验代码进行修改

在这里插入图片描述

  • 生成hex文件
    在这里插入图片描述

  • 单片机与电脑通过USB转串口相连
    在这里插入图片描述

  • 烧录程序
    在这里插入图片描述
    选择端口:COM3,并按序操作
    在这里插入图片描述

5.结果演示

  • 在野火多功能调试助手中打开串口
  • 最终结果如下
    在这里插入图片描述

参考资料:
《零死角玩转 STM32F103—指南者》
《STM32F10X-中文参考手册》USART 章节
STM32串口通信USART学习笔记

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值