【HAL库 串口通信 keil逻辑仿真根据波形计算波特率】

一、了解串口协议和RS-232标准,RS232电平与TTL电平的区别"USB/TTL转232"模块(以CH340芯片模块为例)的工作原理

1、什么是串口协议

串口通信指两个或两个以上的设备使用串口按位(bit)发送和接收字节。可以在使用一根线发送数据的同时用另一根线接收数据。 串口通信协议就是串口通讯时共同遵循的协议。 协议的内容是每一个bit 所代表的意义

常用串口通信协议:

  • RS-232(ANSI/EIA-232标准) 只支持 点对点, 最大距离 50英尺。最大速度为128000bit/s, 距离越远 速度越慢。 支持全双工(发送同时也可接收)。
  • RS-422(EIA RS-422-AStandard),支持点对多一条平衡总线上连接最多10个接收器 将传输速率提高到10Mbps,传输距离延长到4000英尺(约1219米),所以在100kbps速率以内,传输距离最大。支持全双工(发送同时也可接收)。
  • RS-485(EIA-485标准)是RS-422的改进, 支持多对多(2线连接),从10个增加到32个,可以用超过4000英尺的线进行串行通行。速率最大10Mbps。支持全双工(发送同时也可接收)。2线连接时 是半双工状态。

2、RS232电平与TTL电平的区别

我用STLink,Debug设置为SerialWire
在这里插入图片描述

3、什么是TTL电平、RS232电平?它们有什么区别呢?

(一)、TTL电平标准

输出 L: <0.8V ; H:>2.4V。

输入 L: <1.2V ; H:>2.0V

TTL器件输出低电平要小于0.8V,高电平要大于2.4V。输入,低于1.2V就认为是0,高于2.0就认为是1。于是TTL电平的输入低电平的噪声容限就只有(0.8-0)/2=0.4V,高电平的噪声容限为(5-2.4)/2=1.3V。

(二)、RS232标准

在TXD和RXD数据线上:
  (1)逻辑1为-3~-15V的电压
  (2)逻辑0为3~15V的电压
在RTS、CTS、DSR、DTR和DCD等控制线上:
  (1)信号有效(ON状态)为3~15V的电压
  (2)信号无效(OFF状态)为-3~-15V的电压
这是由通信协议RS-232规定的。
RS-232:标准串口,最常用的一种串行通讯接口。有三种类型(A,B和C),它们分别采用不同的电压来表示on和off。最被广泛使用的是RS-232C,它将mark(on)比特的电压定义为-3V到-12V之间,而将space(off)的电压定义到+3V到+12V之间。传送距离最大为约15米,最高速率为20kb/s。RS-232是为点对点(即只用一对收、发设备)通讯而设计的,其驱动器负载为3~7kΩ。所以RS-232适合本地设备之间的通信。

4、解“USB/TTL转232“模块

CH340 是一个USB 总线的转接芯片,实现USB 转串口、USB 转IrDA 红外或者USB 转打印口。为了增加串口通讯的远距离传输及抗干扰能力,RS-232标准使用-15V 表示逻辑 1, +15V 表示逻辑 0。常常会使用 MH340芯片对 USB/TTL与RS-232电平的信号进行转换。
在这里插入图片描述

二、操作流程

1、RCC设置为外部晶振

#

2、HAL库配置时钟树初始化系统时钟

  • 内部8MHz高速RC振荡器(8MHz HSI RC)
  • 外部4-16MHz高速石英晶体振荡器即晶振(HSE OSC),一般接8MHz
  • 两个高速晶振用来提供系统时钟如AHB、APB2、APB1
  • 外部32.768KHz低速晶振,一般给RTC提供时钟
  • 内部40KHz低速RC振荡器,给看门狗提供时钟

在这里插入图片描述

标准库中用SystemInit函数初始化流程
1、首先启动内部8MHz时钟HSI RC ,作为系统时钟,暂时以内部8MHz时钟运行
2、然后再启动外部时钟HSE OSC,进入PLL锁相环进行倍频,8MHz倍频九倍,得到72MHz
3、等到锁相环输出稳定后,选择锁相环输出为系统时钟,此时8MHz切换为72MHz
tip:如果外部时钟出问题了,系统时钟可能会慢10倍

3、串口设置

在这里插入图片描述
波特率默认115200

4、配置NVIC

NVIC的全称是Nested vectoredinterrupt controller,即嵌套向量中断控制器。用于管理中断
在这里插入图片描述

在这里插入图片描述

5、设置IDE

在这里插入图片描述

三、实验现象

发送"#“停止发送
在这里插入图片描述
发送”*"停止发送
在这里插入图片描述

代码

\\主循环中根据标志位发送或者停止发送
int main(void)
{

  HAL_Init();

  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  //HAL_UART_Transmit(&huart1, (uint8_t *)&message, strlen(message),0xFFFF); 
  HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);
  
	while (1)
  {
	 

	  if(flag==0){
			//发送信息
			HAL_UART_Transmit(&huart1, (uint8_t *)&message, strlen(message),0xFFFF); 
			
			//延时
			HAL_Delay(1000);
		}

  }
  /* USER CODE END 3 */
}
//中断回调函数中根据收到的数据改变标志位
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{

	//当输入的指令为0时,发送提示并改变flag
	if(c=='*'){
		flag=0;
		HAL_UART_Transmit(&huart1, (uint8_t *)&tips2, strlen(tips2),0xFFFF); 
	}
	
	//当输入的指令为1时,发送提示并改变flag
	else if(c=='#'){
		flag=1;
		HAL_UART_Transmit(&huart1, (uint8_t *)&tips1, strlen(tips1),0xFFFF); 
	}
	
	//当输入不存在指令时,发送提示并改变flag
	else {
		flag=0;
		HAL_UART_Transmit(&huart1, (uint8_t *)&tips, strlen(tips),0xFFFF); 
	}

	//重新设置中断
		HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);  
}

四、观察串口波形,计算波特率

波特率,又叫传码率。它被定义为单位时间(每秒)传输码元的数目,单位是波特。

对于UART协议而言,他的码元是一位二进制数。那么波特率对于UART协议而言也可以描述成每秒传输的二进制数的位数。这样如果发送数据方与接收数据方能够约定相同的波特率,就能解决上文中提到的异步通信带来的同步问题。 作者:重回桃花源 https://www.bilibili.com/read/cv15890678/ 出处:bilibili

在这里插入图片描述
在这里插入图片描述
不知道为啥看不到数据位,但是我们可以把十位一起算

换算单位
86.375*(110^-6)
算出一位数据的时间一位起始位,八位数据位,一位停止位
86.375
(1*10^-6)/10

算出波特率,一秒内传输码元的数量
在这里插入图片描述

https://blog.csdn.net/adas323/article/details/126671787
https://blog.csdn.net/azs0504/article/details/119831945
https://blog.csdn.net/qq_52062938/article/details/130494097
https://blog.csdn.net/qq_45945548/article/details/121720676
https://blog.csdn.net/qq_45945548/article/details/121720676
https://www.bilibili.com/read/cv15890678/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值