嵌入式-实验3
熟练掌握了STM32CubeMX引脚配置与代码生成。使用HAL库显著简化了GPIO操作过程。通过Keil仿真有效验证了代码逻辑的正确性。进一步熟悉中断配置与处理,提升系统响应效率。探索更加复杂的外设如UART、I2C以扩展应用范围。熟练掌握了STM32CubeMX引脚配置与代码生成。通过Keil仿真有效验证了代码逻辑的正确性。了解了中断的相关应用进一步熟悉中断配置与处理,提升系统响应效率。探索更加
实验三-STM32串口通信
一、了解串口协议和RS-232标准,以及RS232电平与TTL电平的区别;了解"USB/TTL转232"模块(以CH340芯片模块为例)的工作原理。
1.何为串口通信协议
串口通信指两个或两个以上的设备使用串口按位(bit)发送和接收字节。可以在使用一根线发送数据的同时用另一根线接收数据。 串口通信协议就是串口通讯时共同遵循的协议。 协议的内容是每一个bit 所代表的意义。 常用的串口通信协议 有以下几种:
1 RS-232(ANSI/EIA-232标准) 只支持 点对点, 最大距离 50英尺。最大速度为128000bit/s, 距离越远 速度越慢。 支持全双工(发送同时也可接收)。
2 RS-422(EIA RS-422-AStandard),支持点对多一条平衡总线上连接最多10个接收器 将传输速率提高到10Mbps,传输距离延长到4000英尺(约1219米),所以在100kbps速率以内,传输距离最大。支持全双工(发送同时也可接收)。
3 RS-485(EIA-485标准)是RS-422的改进, 支持多对多(2线连接),从10个增加到32个,可以用超过4000英尺的线进行串行通行。速率最大10Mbps。支持全双工(发送同时也可接收)。2线连接时 是半双工状态。
2.RS-232
RS-232标准接口(又称EIA RS-232)是常用的串行通信接口标准之一,它是由美国电子工业协会(EIA)联合贝尔系统公司、调制解调厂家及计算机终端生产厂家于1970年共同制定,其全名是“数据终端设备( DTE)和数据通信设备(DCE)之间串行二进制数据交换接口技术标准”。
3.TTL电平与RS232电平的区别
什么是TTL电平、RS232电平?它们有什么区别呢?
3. 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芯片模块为例)的工作原理。
CH340 是一个USB 总线的转接芯片,实现USB 转串口、USB 转IrDA 红外或者USB 转打印口。为了增加串口通讯的远距离传输及抗干扰能力,RS-232标准使用-15V 表示逻辑 1, +15V 表示逻辑 0。常常会使用 MH340芯片对 USB/TTL与RS-232电平的信号进行转换。
二、串口传输文件
1、准备
将TTL连接为如图所示:

注意:①两USB串口对应链接 RXD,TXD反串连接 ②TXD -> RXD 后将Usb串口接到电脑com口出
安装串口调试助手
2、传输操作
启动串口调试助手并打开串口,将两台电脑调制相同的波特率,本例使用115200波特率
然后开始发送文件,我发送的是一张png图片

然后等待发送完毕
接收端接受文件的设置如下图所示勾选:
接收端如图所示:

之后接收端在串口调试助手的安装目录里能找到传送过来的txt文件,将其另存为png文件:

在接收端能够打开图片,说明传输成功。
二、任务1:基于HAL库的串口通信
- STM32系统给上位机(win10)连续发送“hello windows!”,win10采用“串口助手”工具接收。如果STM32的连续发送之间不加延时语句,观察win10端是否出现接收数据丢失的现象。
- 在完成以上任务基础,继续扩展功能:当上位机给stm32发送一个字符“#”后,stm32暂停发送“hello windows!”;发送一个字符“*”后,stm32继续发送;
1.在STM32CubeMX上为芯片设置引脚、配置时钟,在Keil中生成代码
- 配置USART,NVIC

2. 硬件选型与引脚设置
- 选择STM32芯片型号: STM32F103C8T6
- 引脚设置:
- 配置GPIO端口,如GPIOA的PA4方便观察验证烧录。

- 配置GPIO端口,如GPIOA的PA4方便观察验证烧录。
3. 时钟配置
-
开启HSE时钟: 8 MHz外部晶振
-
配置时钟树: 确保系统时钟设置正确满足应用需求。

4. 代码生成
- 生成初始化代码: 点击“GENERATE CODE”,选择Keil uVision5作为工具链。

5. 编写Keil中的代码
5.1 查看工程
-
cubemx为我们生成了工程代码模版。

5.2 主函数实现
- 在
main.c中编写LED闪烁逻辑,使用HAL_UART_Transmit发送数据。
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
HAL_UART_Receive_IT(&huart1, (uint8_t *)&order, 1);
while (1)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&message,strlen(message),0xFFFF);
HAL_Delay(1000);
}
}
6. 分析代码部分
-
HAL库调用: 通过简化的API接口控制硬件。
-
延时函数:
HAL_Delay()用于实现LED的闪烁时间。 -
**HAL_UART_Transmit_DMA(UART_HandleTypeDef huart, uint8_t pData, uint16_t Size)
功能:串口通过DMA发送指定长度的数据。
参数:
UART_HandleTypeDef *huart UATR的别名 如 : UART_HandleTypeDef huart1; 别名就是huart1
*pData 需要发送的数据
Size 发送的字节数
7.电路板连接

8. 使用软件烧录

点击开始编程烧录在keil中生成的hex文件。
8.使用串口助手观察数据传输效果
-
查看接收区:

成功收到了数据。
9. 波形观察
- 观察波形: 开始仿真,利用利用逻辑分析仪工具查看GPIO引脚的数字信号波形,验证LED闪烁周期。
9. 实验总结
总结要点:
- 熟练掌握了STM32CubeMX引脚配置与代码生成。
- 使用HAL库显著简化了GPIO操作过程。
- 通过Keil仿真有效验证了代码逻辑的正确性。
反思与展望:
- 进一步熟悉中断配置与处理,提升系统响应效率。
- 探索更加复杂的外设如UART、I2C以扩展应用范围。
二、任务2:拓展:发送数据检测
- 继续扩展功能:当上位机给stm32发送一个字符“#”后,stm32暂停发送“hello windows!”;发送一个字符“*”后,stm32继续发送;
1.在STM32CubeMX上为芯片设置引脚、配置时钟,在Keil中生成代码
- 配置中断时打开usart中断。
2. 硬件选型与引脚设置(与任务1一致)
3. 时钟配置(与任务1一致)
4. 代码生成(与任务1一致)
5. 编写Keil中的代码(与任务1一致)
5.1 print函数重写
#include <stdio.h>
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
int fgetc(FILE *f)
{
uint8_t ch = 0;
HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
return ch;
}
5.2 主函数实现
- main部分:
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
HAL_UART_Receive_IT(&huart1, (uint8_t *)&order, 1);
while (1)
{
if(flag==1)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&message,strlen(message),0xFFFF);
HAL_Delay(1000);
}
}
}
6. 分析代码部分
- GPIO初始化: 使用HAL库的GPIO初始化函数对端口设置。
- HAL库调用: 通过简化的API接口控制硬件。
- 延时函数:
HAL_Delay()用于实现延时。 - 中断控制部分: 使用HAL_UART_Receive_IT(&huart1, (uint8_t *)&order, 1);函数检测接收数据,并用flag变量存储。
- while循环部分: 当flag为1时,继续发送数据。
7. 实验现象
-
完成上述步骤后,将程序下载到芯片中。
-
**现象描述:**接收到*开始发送。

接收到#停止发送。

6. 实验总结
总结要点:
- 熟练掌握了STM32CubeMX引脚配置与代码生成。
- 通过Keil仿真有效验证了代码逻辑的正确性。
- 了解了中断的相关应用
反思与展望:
- 进一步熟悉中断配置与处理,提升系统响应效率。
- 探索更加复杂的外设如UART、I2C以扩展应用范围。
三、学习STM32中断、DMA通信原理和编程方法。使用stm32tubemx和HAL库分别完成以下编程练习
2.代码:
int main(void)
{
uint8_t Senbuff[] = "Hello world\n";
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
while (1)
{
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)Senbuff, sizeof(Senbuff));
HAL_Delay(1000);
}
}
3.代码分析:
3.1 HAL_UART_Transmit_DMA函数:
功能:串口通过DMA发送指定长度的数据。
参数:
UART_HandleTypeDef *huart UATR的别名 如 : UART_HandleTypeDef huart1; 别名就是huart1
*pData 需要发送的数据
Size 发送的字节数
4.实际效果

四、 在没有示波器条件下,可以使用Keil的软件仿真逻辑分析仪功能观察任务二(1)串口输出波形,并分析时序状态正确与否,计算波特率实际为多少。
1. 设置仿真环境
- 在Keil中调试设置,如下图所示。

2 波形观察
- 开始仿真,利用利用逻辑分析仪工具查看数字信号波形。

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐



所有评论(0)