STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!

目录

  • 一、stm32串口通信
    • 1.1 串口通信协议
    • 1.2 通信接口
    • 1.3 串口通信分类
    • 1.4 STM32串行通信的通信方式
    • 1.5 STM32串行通信
    • 1.6 功能引脚
    • 1.7 数据寄存器
    • 2.1 RS-232通信协议
    • 2.2 RS-232串口简介
    • 3.1 USB转串口CH341接线
  • 二、STM32的USART串口通信
    • 1.1 题目要求
    • 1.2 器件准备
    • 1.3 USB转TTL与C8T6相连
    • 1.4 CH341驱动安装
  • 三、用寄存器地址实现stm32串口通信
  • 四、 用HAL库的方式
    • 4.1 创建工程,配置参数
    • 4.2 代码编写
    • 4.3 烧录编译
  • 五、总结
  • 六、参考链接

一、stm32串口通信

1.1 串口通信协议

  • 串口是显控设备与信号处理板之间通信的主要接口,也是显控设备与其他设备、设备与设备之间的协议数据帧通信传输的重要接口。 [2] 串口通信指串口按位(bit)发送和接收字节。尽管比特字节(byte)的串行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。串口通信协议是指规定了数据包的内容,内容包含了起始位、主体数据、校验位及停止位,双方需要约定一致的数据包格式才能正常收发数据的有关规范。串口通信协议是基于串口使得通信双方能够相互沟通信息的一种约定,其定义了双方遵循的协议数据帧格式和其传输方式。 [2] 在串口通信中,常用的协议包括RS-232、RS-422和RS-485。

1.2 通信接口

在这里插入图片描述

1.3 串口通信分类

STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!_第1张图片

![在这里插入图片描述](https://img-blog.csdnimg.cn/2dfde6bd517c49a2b8f0e892624ac244.png

1.4 STM32串行通信的通信方式

STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!_第2张图片

1.5 STM32串行通信

STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!_第3张图片

1.6 功能引脚

TX: 发送数据输出引脚。

RX: 接收数据输入引脚。

SW_RX: 数据接收引脚,只用于单线和智能卡模式,属于内部引脚,没有具体外部引 脚。

nRTS: 请求以发送(Request To Send),n表示低电平有效。如果使能 RTS流控制,当 USART 接收器准备好接收新数据时就会将 nRTS变成低电平;当接收寄存器已满时, nRTS将被设置为高电平。该引脚只适用于硬件流控制。

nCTS: 清除以发送(Clear To Send),n 表示低电平有效。如果使能 CTS流控制,发送 器在发送下一帧数据之前会检测 nCTS引脚,如果为低电平,表示可以发送数据,如果为 高电平则在发送完当前数据帧之后停止发送。该引脚只适用于硬件流控制。 SCLK:发送器时钟输出引脚。这个引脚仅适用于同步模式。

STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!_第4张图片

1.7 数据寄存器

USART 数据寄存器(USART_DR)只有低 9位有效
在这里插入图片描述

一般使用 8位数据字长。

USART_DR 包含了已发送的数据或者接收到的数据。
在这里插入图片描述

2.1 RS-232通信协议

若是芯片与PC机(或上位机)相连,除了共地之外,就不能这样直接交叉连接了。

尽管PC机和芯片都有TXD和RXD引脚,但是通常PC机(或上位机)通常使用的都是RS232接口(通常为DB9封装),因此不能直接交叉连接。

RS232接口是9针(或引脚),通常是TxD和RxD经过电平转换得到的。因此,要想使得芯片与PC机的RS232接口直接通信,需要也将芯片的输入输出端口也电平转换成rs232类型,再交叉连接。
STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!_第5张图片
经过电平转换后,芯片串口和rs232的电平标准是不一样的:

单片机的电平标准(TTL电平):+5V表示1,0V表示0;
Rs232的电平标准:+15/+13 V表示0,-15/-13表示1。
RS-232通讯协议标准串口的设备间通讯结构图如下:
STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!_第6张图片
因此,单片机串口与PC串口通信遵循下面的连接方式:
在单片机串口与上位机给出的rs232口之间,通过电平转换电路,实现TTL电平与RS232电平之间的转换。

2.2 RS-232串口简介

STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!_第7张图片
RS232接口(封装D89)
STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!_第8张图片
通信过程中只有两个脚参与通信,电路连接时,连接三个脚即可。

2脚:电脑的输入RXD
3脚:电脑的输出TXD 通过2 ,3 脚就可以实现全双工(可同时收发)的串行异步通信
5脚:接地
PC串口与单片机串口连接方式:
其中,DB91是在电脑上的 DB92是在单片机实验板上焊接着的
STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!_第9张图片
如果电脑没有rs232口,只有USB口,可以用串口转接线转出串口,在电脑上位机上需要安装驱动程序。
STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!_第10张图片
用串口通信比USB简单,因为串口通信没有协议,使用方便简单。

3.1 USB转串口CH341接线

USB转串口模块可以使用5V电压供电,需要将跳帽按下图安装。
STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!_第11张图片
USB转串口模块可以使用3.3V电压供电,需要将跳帽按下图安装。
STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!_第12张图片

可以对USB转串口模块进行测试,将USB的电压引脚用跳帽接上,然后将RXD和TXD两个引脚用跳帽或者杜邦线接上。
STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!_第13张图片

然后打开串口终端,点击“手动发送”或者“自动发送”,如果在接收区可以接收到数据,说明USB转串口模块工作正常,否则需要检查接线是否正确、电路板元器件是否损坏。

USB转串口电路板与单片机的接线图,VCC接线是为了单片机供电,USB转串口的RXD引脚与单片机的TXD引脚相连,USB转串口的TXD引脚与单片机的RXD引脚相连,两者的GND引脚直接相连。
STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!_第14张图片

二、STM32的USART串口通信

1.1 题目要求

完成一个STM32的USART串口通讯程序(查询方式即可,暂不要求采用中断方式),要求:
(1)设置波特率为115200,1位停止位,无校验位;
(2)STM32系统给上位机(win10)连续发送“hello windows!”。win10采用“串口助手”工具接收。
(3)在没有示波器条件下,可以使用Keil的软件仿真逻辑分析仪功能观察管脚的时序波形,更方便动态跟踪调试和定位代码故障点。 请用此功能观察串口输出波形,并分析其波形反映的时序状态正确与否,高低电平转换周期(LED闪烁周期)实际为多少。

1.2 器件准备

STM32F103C8T6最小核心板
USB转TTL
CH340驱动(USB串口驱动)_XP_WIN7共用
串口调试助手XCOM V2.3

1.3 USB转TTL与C8T6相连

连接示意表

STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!_第15张图片
实际连接图如下

1.4 CH341驱动安装

下载链接:
  CH340/CH341
    Windows 驱动链接:https://www.wch.cn/download/CH341SER_EXE.html/

打开网页,点击下载
STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!_第16张图片
下载好后,点击应用程序,再点击安装
STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!_第17张图片
在电脑设备管理器处查看有无com端口出现,有即可证明成功。
STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!_第18张图片

三、用寄存器地址实现stm32串口通信

建立模板要用到的SYSTEM文件及启动文件,包括点灯时需要的C8T6数据手册,以及烧录用到的FlyMcu,网盘自取。
链接:https://pan.baidu.com/s/1jxbVCa_filfR9ZRlmP6SMw
提取码:k4lv

以下步骤都在keil下操作

  • 新建工程light
  • 将startup_stm32f10x_md.s这个启动文件复制你所建的工程目录下,然后双击Source Group1添加(add))即可在新建USER和DAIMA文件和复制SYSTEM启动文件到工程目录下。
  • 点击Target 1,再点击Manage Project ltems…
    在上面对话框的中间栏,点新建(用红圈标出)按钮(也可以通过双击下面的空白处实现),新建 USER 和 SYSTEM 两个组。然后点击 Add Files 按钮,把 SYSTEM 文件夹三个子文件夹里面的:sys.c、usart.c、delay.c 加入到 SYSTEM 组中。注意:此时 USER 组下还是没有任何文件,我们只添加SYSTEM的三个。
    STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!_第19张图片
  • 点击 OK,退出该界面返回 IDE。
    此时界面如图所示

STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!_第20张图片

  • 接着,我们新建一个 test.c 文件,并保存在 USER 文件夹下。然后双击 USER 组,会弹出加载文件的对话框,此时我们在 USER 目录下选择 test.c 文件,加入到 USER 组下。
    STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!_第21张图片
  • 注意编译之前点击魔法棒,设置output生成.hex文件,路径放在OBJ文件里
  • 接着,再设置 Listings 文件路径,在图 3.2.16 的基础上,打开 Listing 选项卡→点击 Select
    Folder for Listings→找到 OBJ 文件夹→点击 OK
    注:OBJ自己是新建的文件,用于存放编译器编译时后产生的 c/汇编/链接的列表清单
    生成的.hex文件也放在里面便于寻找和后面烧录,主要是方便管理和查找。
    STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!_第22张图片
  • 加入sys、delay、usart的include路径:
  • STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!_第23张图片

在下载的SYSTEM组下,只需修改usart.c和编写写test.c文件即可。

STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!_第24张图片

在usart.c修改的代码如下

void uart_init(u32 pclk2,u32 bound)
{  	 
	float temp;
	u16 mantissa;
	u16 fraction;	   
	temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
	mantissa=temp;				 //得到整数部分
	fraction=(temp-mantissa)*16; //得到小数部分	 
    mantissa<<=4;
	mantissa+=fraction; 
	RCC->APB2ENR|=1<<2;   //使能PORTA口时钟  
	RCC->APB2ENR|=1<<14;  //使能串口时钟 
	GPIOA->CRH&=0XFFFFF00F;//IO状态设置
	GPIOA->CRH|=0X000008B0;//IO状态设置 
	RCC->APB2RSTR|=1<<14;   //复位串口1
	RCC->APB2RSTR&=~(1<<14);//停止复位	   	   
	//波特率设置
 	USART1->BRR=mantissa; // 波特率设置	 
	USART1->CR1|=0X200C;  //1位停止,无校验位.
#if EN_USART1_RX		  //如果使能了接收
	//使能接收中断 
	USART1->CR1|=1<<5;    //接收缓冲区非空中断使能	    	
	MY_NVIC_Init(3,3,USART1_IRQn,2);//组2,最低优先级 
#endif
}

在test.c中修改的代码:

#include "sys.h"
#include "usart.h"		
#include "delay.h"	 
int main(void)
{				 
	u16 t; u16 len; u16 times=0;
	Stm32_Clock_Init(9);	//系统时钟设置
	delay_init(72);	  		//延时初始化
	uart_init(72,115200); 	//串口初始化为115200
  	while(1)
	{
		if(USART_RX_STA&0x8000)
		{ 
			len=USART_RX_STA&0x3FFF;//得到此次接收到的数据长度
			printf("\r\n Hello Windows! \r\n\r\n");
			for(t=0;tDR=USART_RX_BUF[t];
				while((USART1->SR&0X40)==0);//等待发送结束
			}
			printf("\r\n\r\n");//插入换行
			USART_RX_STA=0;
		}else
		{
			times++;
			if(times%200==0)printf("Hello Windows!\r\n"); 
			delay_ms(10); 
		}
	}	 
} 



  • 编译结果

  • STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!_第25张图片
    没有报错!
    那么就可以进行烧录了。

  • 借助Flymou进行烧录

  • 百度云盘资源
    链接:https://pan.baidu.com/s/1VxMUZFOVvpAf-L_YbATMag
    提取码:fasf
    STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!_第26张图片

  • 用XCOM串口观察助手

  • 打开XCOM串口助手,弹出界面点击打开串口,即可以接收到C8T6发送的数据Hello Windows!
    STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!_第27张图片

四、 用HAL库的方式

4.1 创建工程,配置参数

打开Stm32CubeMX并创建工程

STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!_第28张图片

选择stm32F103C8开发板,开始工程

STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!_第29张图片

Mode选择异步通信(Asynchronous):

STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!_第30张图片

勾选Enabled:

STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!_第31张图片

配置项目设置(名称、位置、环境):

STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!_第32张图片

生成项目:

STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!_第33张图片

4.2 代码编写

  • Stm32CubeMX设置好后跳转到keil上
  • 在main.c中定义STM32需要给上位机发送的消息:
uint8_t hello[20]="hello windows!\n";

STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!_第34张图片

  • 在main.c中定义一个延时函数,来使设置发送的时间间隔:
void  Delay_wxc( volatile  unsigned  int  t)
{
     unsigned  int  i;
     while(t--)
         for (i=0;i<800;i++);
}

STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!_第35张图片

  • 在while循环中调用查询,并调用延时函数:
 while (1)
  {
		
			HAL_UART_Transmit(&huart1,hello,20,100000);
			Delay_wxc(3500); //这里每个人电脑不一样发送的间隔时延需要自己调整尝试
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!_第36张图片

  • 执行结果
    STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!_第37张图片

4.3 烧录编译

打开FlyMcu 选择刚刚程序编译生成的hex文件,并搜索串口并烧录

STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!_第38张图片

打开XCOM串口观察小助手

STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!_第39张图片

五、总结

keil没有成功build的话,可能是代码本身问题,也可使魔法棒里的一些设置问题。烧录没成功可能是实验操作时的一些没有注意到的小问题,一步一步的找出问题,实践出真知,都能解决的。

六、参考链接

https://blog.csdn.net/qq_43328313/article/details/106439088
https://blog.csdn.net/qq_46467126/article/details/120841504?spm=1001.2014.3001.5502

你可能感兴趣的:(stm32,单片机,windows)