实验任务:
一. 了解串口协议和RS-232标准,以及RS232电平与TTL电平的区别;了解"USB/TTL转232"模块(以CH340芯片模块为例)的工作原理。
二. 安装 stm32CubeMX,配合Keil,使用HAL库(或标准库)方式,设置USART1 波特率为115200,1位停止位,无校验位,完成下列任务:
1)STM32系统给上位机(win10)连续发送“hello windows!”。win10采用“串口助手”工具接收。
2)在完成以上任务基础,继续扩展功能:当上位机给stm32发送一个字符“#”后,stm32暂停发送“hello windows!”;发送一个字符“*”后,stm32继续发送;
三. 在没有示波器条件下,可以使用Keil的软件仿真逻辑分析仪功能观察串口输出波形,并分析时序状态正确与否,计算波特率实际为多少。
一、介绍
串口通讯协议和RS-232
1.串口通讯协议
串口通信协议是串口通讯时共同遵循的协议。串口通信是指串口按位(bit)发送和接收字节。尽管比特字节(byte)的串行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。
2.RS-232标准
RS-232标准是一种串行通讯标准,它定义了串行传输的电气和机械规范,其中最重要的特征是使用单个连接线来传输数据。串行通信使用一个传输线来传输一个二进制位,该线使用的电压范围为±15V。信号使用差分信号极性来确定二进制位的值,即高电平表示二进制1,低电平表示二进制0。
RS232电平与TTL电平的区别
RS-232电平和TTL电平在电压范围存在差异:
RS-232标准中,逻辑1为-3~-15V的电压,逻辑0为3~15V的电压。
TTL电平标准中,输出低电平要小于0.8V,高电平要大于2.4V;输入时,低于1.2V就认为是0,高于2.0V就认为是1。
USB/TTL转232模块(CH340芯片为例)
当USB转串口设备插入没有串口的计算机或其他USB主机时,USB主机会对设备进行复位,然后开始USB枚举过程。在枚举过程中,USB主机将获取设备描述符、配置描述符、接口描述符等。这些描述符中会包含USB设备的厂商ID、设备ID和Class类别等信息。操作系统会根据这些信息为设备匹配相应的USB设备驱动。之后,通过USB接口,可以实现计算机与串口设备的通讯。
二、STM32CubeMX配置生成
新建项目
1.配置RCC
选择High Speed Clock(HSE)为Crystal/Ceramic Resonator
2.配置SYS
在Debug中选择Serial Wire
3.配置USART
配置Mode为Asynchronous
4.配置NVIC
配置勾选USART1 global interrupt
5.生成项目文件
Keil5仿真
1.打开main.c
2.在main.c中添加如下定义
char data[] = "\nHello windows!\n";
3.在int main(void)主函数中,添加
HAL_UART_Transmit(&huart1, (uint8_t *)data, 15, 0xFFFF);
HAL_Delay(1000);
HAL_UART_Transmit函数介绍:
void HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
在这个示例中:
huart
是一个指向UART_HandleTypeDef
结构的指针,它包含了UART设备的相关信息。pData
是要发送的数据的指针。这个数据通常以字节数组的形式提供。Size
是要发送的数据的大小,以字节为单位。
这个函数将通过UART接口发送指定大小的数据。具体的数据格式和波特率等参数通常需要在调用此函数之前通过其他HAL UART库函数进行设置。
4.烧录
5.串口调试
6.扩展功能
6.1在main.c中添加如下定义
char data[] = "\nHello windows!\n";
int flag=0;
char c;
6.2编写回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
//当输入的指令为0时,改变flag
if(c=='0'){
flag=0;
HAL_UART_Transmit(&huart1, (uint8_t *)data, 15,0xFFFF);
}
//当输入的指令为1时,改变flag
else if(c=='1'){
flag=1;
HAL_UART_Transmit(&huart1, (uint8_t *)data, 15,0xFFFF);
}
//当输入不存在指令时,改变flag
else {
flag=0;
HAL_UART_Transmit(&huart1, (uint8_t *)&data, 15,0xFFFF);
}
//重新设置中断
HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);
}
6.3修改int main(void)主函数如下
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
if(flag==1)
{
HAL_UART_Transmit(&huart1, (uint8_t *)data, 15, 0xFFFF);
HAL_Delay(1000);
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
6.4烧录后串口调试
串口调试
三、STM32波形观察
魔术棒环境设置
仿真逻辑分析仪
(1)点击Start/Stop Debug Session
(2)选择逻辑观察仪和引脚
选择引脚进行观察
已知:1位停止位,无校验位
1字符包含 1(起始位)+8(数据位)+0(校验位)+1(停止位)=10bit
1帧为0.00009s。1秒有11111.1111帧
计算得到实际波特率约为111111波特,与115200波特比较得误差率约为3%
总结
在学习STM32的串口通信时,首先需要理解一些基本概念,如串口、串行通信、波特率、数据位、停止位、校验位等。这些概念是理解串口通信的基础。STM32的串口通信需要使用硬件接口,如USART、UART等。这需要了解这些接口的特性和差异,以便在选择和使用时做出正确的选择。串口通信需要遵循一定的协议和标准。这需要学习常见的协议串口协议和标准,并学会了如何根据需要选择和使用。在本次实验中,通过对代码的编写和调试,实现了对STM32串口通信的操作,学会了如何发送和接收数据,如何处理错误和异常。