一. 了解串口协议和RS-232标准,以及RS232电平与TTL电平的区别;了解"USB/TTL转232"模块(以CH340芯片模块为例)的工作原理。
串口协议指的是计算机与外部设备之间通过串行通信进行数据传输的规约。RS-232是一种常用的串口通信标准,它定义了数据传输的电气特性和信号传输方式。
RS-232标准规定了数据传输所用的电气特性,包括传输电平范围、信号线的功能等。RS-232定义的电平是负电压代表逻辑1,正电压代表逻辑0的方式。但是现代的设备一般使用TTL(Transistor-Transistor Logic)电平,其中0V代表逻辑0,5V代表逻辑1。因此,RS-232电平与TTL电平之间存在差异。
为了在使用RS-232设备的环境中连接TTL设备,需要使用USB/TTL转232模块,以CH340芯片模块为例。这种模块将USB接口与TTL电平的串口信号转换为RS-232电平的信号,从而实现TTL设备与RS-232设备之间的连接。
USB/TTL转232模块以CH340芯片为核心,CH340芯片具备USB转串口功能,可以将电脑通过USB接口与模块连接。模块上的TTL串口信号通过CH340芯片转换为RS-232电平的信号,然后通过模块上的RS-232接口与其他RS-232设备连接。
简单来说,USB/TTL转232模块的工作原理就是将TTL电平的串口信号转换为RS-232电平的信号,实现不同电平的设备之间的串口通信。
二.安装 stm32CubeMX,配合Keil,分别尝试使用寄存器地址方式(汇编或C,不限) 和HAL库这两种方式,完成下列任务:
1)STM32系统给上位机(win10)连续发送“hello windows!”。win10采用“串口助手”工具接收。
2)在完成以上任务基础,继续扩展功能:当上位机给stm32发送一个字符“#”后,stm32暂停发送“hello windows!”;发送一个字符“*”后,stm32继续发送;
第一题
1.创建项目并配置
a.选择芯片STM32F103c8T6在这里插入图片描述
b.RCC配置:
c.USART1配置:
d.配置项目名、项目存放路径、使用编辑器、HAL库所使用的版本:
e.Code Generate配置:
2.生成代码并打开项目:
a.代码:
在main.c的while循环上面写入以下代码:
char data[] = "\nHello world!\n";
在while循环中写入以下代码:
HAL_UART_Transmit(&huart1, (uint8_t *)data, 15, 0xFFFF);
HAL_Delay(1000);
b.编译并烧录
c.打开串口调试助手调试
第二题
1.程序要点
使能 RX 和 TX 引脚 GPIO 时钟和 USART 时钟;
初始化 GPIO,并将 GPIO 复用到 USART 上;
配置 USART 参数;
配置中断控制器并使能 USART 接收中断;
使能 USART;
在 USART 接收中断服务函数实现数据接收和发送。
配置同上
2.程序要点
a.在usart.c和main.c中添加头文件
#include “stdio.h”
#include “string.h”
b.main函数外定义
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
c.设置全局变量
uint8_t aRxBuffer;
uint8_t Uart1_RxBuff[256];
uint8_t start[20] = "go stm32!";
uint8_t stop[20] = "stop stm32!";
uint8_t Uart1_Rx_Cnt = 0;
uint8_t cAlmStr[] = "溢出了\r\n";
unsigned int flag = 1;
d.设置接收中断函数
在main函数里加入
HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);
在while循环中添加
while (1)
{
if(flag == 1){
printf("Hello windows!\r\n");
}
HAL_Delay(1000);
}
重写回调函数(写在main函数外)
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if (strcmp(Uart1_RxBuff, start) == 0){
flag = 1;
printf("start....\r\n");
}
if (strcmp(Uart1_RxBuff, stop) == 0){
flag = 0;
printf("stop....\r\n");
}
if(Uart1_Rx_Cnt >= 255) //溢出判断
{
Uart1_Rx_Cnt = 0;
memset(Uart1_RxBuff,0x00,sizeof(Uart1_RxBuff));
HAL_UART_Transmit(&huart1, (uint8_t *)&cAlmStr, sizeof(cAlmStr),0xFFFF);
}
else
{
Uart1_RxBuff[Uart1_Rx_Cnt++] = aRxBuffer; //接收数据转存
if((Uart1_RxBuff[Uart1_Rx_Cnt-1] == 0x0A)&&(Uart1_RxBuff[Uart1_Rx_Cnt-2] == 0x0D)) //判断结束位
{
Uart1_Rx_Cnt = 0;
memset(Uart1_RxBuff,0x00,sizeof(Uart1_RxBuff)); //6清空数组
}
}
HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1); //再开启接收中断
}
3.线路连接
只需要完成USB转TTL模块和stm32f103c8t6的连接。
GND-G
3V3-3.3
RXD-A9
TXD-A10
4编译并烧录
5.效果
三. 在没有示波器条件下,可以使用Keil的软件仿真逻辑分析仪功能观察串口输出波形,并分析时序状态正确与否,计算波特率实际为多少。
时序正确
实际波特率为11500