【正点原子STM32H7R3开发套件试用体验】按键、串口通信
本文介绍了单片机开发板学习中常见且重要的 按键输入 和 串口通信 ,通过原理讲解与实际代码控制,结合正点原子STM32H7R3开发板的项目部署,帮助读者更好地理解这两部分内容。
1 按键输入
按键是一种输入设备,如生活中常见的电脑键盘、开机键、电梯按钮、手机触屏……
工业领域更为常见,作为控制仪器仪表的主要方式,按键输入方式从诞生的那一刻起,以其便捷的操作方式、高效的成本控制、精准的输入控制等优点,注定成为单片机学习的经典项目。
按键控制的关键因素为消抖。当按键被按下的瞬间,电平不稳定,这种不稳定会导致单片机多次检测到低电平,并触发多次控制,因此采用延时消抖的解决方案。

原理图
用户按键

用户 LED

硬件
-
LED
-
按键
- WKUP - PC13
- KEY0 - PE9
- KEY1 - PE8
- KEY2 - PE7
项目实现
按键控制 GPIO 引脚输出电平状态,进而实现 LED 控制。
具体现象
- 1 按下WKUP按键,LED0、LED1 亮起
- 2 按下KEY0按键,LED0 状态翻转
- 3 按下KEY1按键,LED1 状态翻转
- 4 按下KEY2按键,LED0、LED1 状态翻转
代码
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/delay/delay.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/LED/led.h"
#include "./BSP/KEY/key.h"
int main(void)
{
uint8_t key;
sys_mpu_config();
sys_cache_enable();
HAL_Init();
sys_stm32_clock_init(300, 6, 2);
delay_init(600);
usart_init(115200);
led_init();
key_init();
while (1)
{
key = key_scan(0);
switch (key)
{
case WKUP_PRES:
{
LED0(0);
LED1(0);
break;
}
case KEY0_PRES:
{
LED0_TOGGLE();
break;
}
case KEY1_PRES:
{
LED1_TOGGLE();
break;
}
case KEY2_PRES:
{
LED0_TOGGLE();
LED1_TOGGLE();
break;
}
}
delay_ms(10);
}
}
效果

2 串口通信
串口通信(Serial Communications),串口按位发送和接收字节。
串口通信是异步通信,通信双方需事先约定好通信参数。串口通信的重要参数包括波特率、数据位、停止位和奇偶校验。
串口通信根据数据传输方向可分为单工、半双工和全双工,串口线最少需要两根 (GND和信号线),可以实现单工通信;也可以使用 3 根通信线 (TX、RX、GND),来实现全双工通信。
在代码控制串口的实现过程中,关键在于发送缓冲区和接收缓冲区是。发送移位寄存器和接收移位寄存器的工作是自动的,不需要编程控制,因此串口代码需要初始化串口控制器,发送信息时写入发送缓冲区,接收信息时到接收缓冲区中读取。
工业和生活中较为常见的串口通信协议 RS-232(ANSI/EIA-232标准),即 IBM-PC及其兼容机上的串行连接标准;可用于连接鼠标、打印机或者Modem、工业仪器仪表等。
新型串口技术:高速串口、无线串口、网络串口、USB虚拟串口、虚拟串口技术、模拟串口、射频串口等。
因此,无论在工业还是科研领域,串口通信都时刻保持相当的活力,并扮演着重要角色。深入学习串口通信,对日后的工作、学习以及嵌入式项目的应用开发设计具有重要意义。
原理图

硬件连接
使用 LED0 进行程序运行状态提示,其与 GPIO 的连接方式为
使用串口 USART1 进行通信,对应的硬件接口为
- USART1_TX - PB14
- USART1_RX - PB15
注意检查开发板对应引脚是否由短路帽按照原理图正确连接
项目实现
- 回复串口接收到的数据
- 每间隔一定时间,串口发送一段提示信息
- LED0 闪烁,提示程序正在运行
代码
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/delay/delay.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/LED/led.h"
int main(void)
{
uint16_t len;
uint16_t times = 0;
sys_mpu_config();
sys_cache_enable();
HAL_Init();
sys_stm32_clock_init(300, 6, 2);
delay_init(600);
usart_init(115200);
led_init();
while (1)
{
if (g_usart_rx_sta & 0x8000)
{
len = g_usart_rx_sta & 0x3FFF;
printf("\r\n您发送的消息为:\r\n");
HAL_UART_Transmit(&g_uart1_handle, (uint8_t *)g_usart_rx_buf, len, HAL_MAX_DELAY);
printf("\r\n\r\n");
g_usart_rx_sta = 0;
}
else
{
if ((times % 5000) == 0)
{
printf("\r\n正点原子 H7R3开发板 串口通信实验\r\n");
printf("正点原子@ALIENTEK\r\n\r\n\r\n");
}
if ((times % 200) == 0)
{
printf("请输入数据,以回车键结束\r\n");
}
if ((times % 30) == 0)
{
LED0_TOGGLE();
}
times++;
delay_ms(10);
}
}
}
效果
串口发送提示信息

板载 LED0 闪烁

踩坑
使用官方程序烧录,如果出现这样的报错 cannot access memory ...
则需要检查 Flash download 是否添加了正点原子的算法文件

若只包含 STM32H7Rx_64 文件,则需要将官方算法文件 ATK-DNH7R3_XSPI_MULTIPLE.FLM 复制到 MDK IDE 的安装路径中,Keil_v5\ARM\Flash 文件夹下,并添加至 Programming Algorithm

重新编译程序并烧录即可。

3 总结
本文介绍了按键输入和串口通信这两部分内容,结合具体项目,测试了正点原子 STM32H7R3 开发板的串口模块和按键模块功能实现,为后面的高级应用打好基础。