前言: STM32串口介绍
串行通信是单片机与外部设备或其他计算机交换信息的一个方式, 数据一位一位的按顺序传送, 其优点是只需要一条传输线, 协议简单, 但是缺点就是传送速度较慢。
串口是单片机上非常便捷的一个工具, 当写程序需要调试的时候, 它可以很方便的提供调试方法, 只要在一些关键代码执行的地方, 通过串口给串口调试助手发送相关信息, 就可以使我们很方便的查看代码在这个位置的执行情况。
下面看一下我所使用的单片机上串口的原理图接线
外部的发送端TXD就是单片机串口的接收端USART_RX, 外部接收端RXD就是单片机串口的发送端USART_TX
TXD : Transmit(TX) Data(D) Receive(RX) Data(D))
USART就是Universal Synchronous/Asynchronous Receiver/Transmitter(通用同步/异步串行接收/发送器)的缩写 就是一个全双工的收发器
CH340是串口芯片, 当单片机用一根USB串口线接到电脑的时候, TXD就是指电脑通过数据线给单片机发送数据,对应单片机要接收数据, 因此单片机对应引脚就是RX(接收)
(电脑端发送) TXD -----> USART_RX(单片机接收)
(单片机发送) USART_TX-----> RXD (电脑端接收)
单片机上用跳线帽将PA10, PA9和USART1_RX, USART1_TX连接起来了, 所以我们只需对PA10, PA9配置即可
PA9就是USART1_TX, PA10就是USART1_RX
跳线帽将PA9和CH340的RXD, PA10和CH340的TXD连接起来了
下面开始Cube配置+IAR编程
3.1 操作简介
使用异步串口通信, 分别以轮询、中断、DMA方式使用串口发送数据进行与电脑的通信。 电脑端使用串口调试助手接收单片机发送的信息
3.2 轮询方式串口通信
单片机会不断查询串口对应引脚, 有通信需求就进行处理, 这样比较浪费CPU资源, 前面在中断里面也讲过, 中断可以很好地弥补这个。 这里先演示轮询方式
Step1 : Cube配置
新建一个工程, 同时也加入LED和按键等对应引脚的配置, 用以配合串口通信
(1) RCC和SYS配置
(2)USART1串口1配置
注释 :
关于异步传送(Asynchronous)和同步传送(Synchronous)
1、同步发送 : 发送方和接收方以同一个时钟源控制发送和接收。 就是当发送方发出数据后, 等待接收方发回响应后才发下一个数据包。
2、异步传送 : 数据在线路上是以一个字为单位传送, 各个字符之间可以是接连传送也可以是间断传送, 这完全由发送方根据需要来决定。 发送和接收双方分别用自己的饿时钟源来控制发送和接收。也就是说发送方发出数据后, 不等待接收方回应, 随时可以发送下一组数据
(3) 按键和LED引脚配置[Pinout & Configuration]
跟第二篇博客写的按键的配置一样的 点击下方蓝字快速回到第二篇博客
第一节补充: 按键操作(CubeMX加HAL库学STM32系列)
(4) 时钟树配置[Clock Configuration]
(5) 工程配置[Project Manager]
(6) 生成代码 (Generate)
Step2 : IAR或Keil编程
(1) 重定向printf函数
在学习C语言的时候, 大家肯定都用过printf这个函数, printf可以将指定字符打印到电脑的显示器上。
但是, 单片机要使用这个就要把他打印的方向改一下, 不是打印在电脑的命令行中, 而是打印到串口里面,传输到串口调试助手. 因此我们需要重定向printf函数。
重定向后我们要将调试信息打印到USART1中, 需要对printf所依赖的打印函数fputc()重定向在usart.c里面添加如下代码
#include "stdio.h"
/******************************************************************
*@brief Retargets the C library printf function to the USART.
*@param None
*@retval None
******************************************************************/
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int _io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__*/
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
上面除了重定向的代码, 还包含了一个标准库头函数, 最好加上这个, 因为printf函数就是这个库里面的, 不加的话有时候会出错或者警告
Tips : HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF); 是通过串口1传输一个字符, ch为字符的地址, 0XFFFF表示超时时间 下面是这个函数的定义 Go to definition进入 stm32f4xx_hal_uart.c可以看这个函数定义
关于串口通信的其他接口函数都可以在 stm32f4xx_hal_uart.h文件里面找到声明
在stm32f4xx_hal_uart.h里面的一些串口通信相关功能函数
(2) 主函数
由于我们CubeMX配置了串口, 所以主函数里面也自动添加了串口初始化函数
下面添加测试printf的代码
/* USER CODE BEGIN 3 */
// 在while(1)里面循环扫描, 判断读取的按键引脚状态
// 判断 WK_UP 按键是否按下
if (HAL_GPIO_ReadPin(WKUP_GPIO_Port, WKUP_Pin) == GPIO_PIN_SET)
{
HAL_Delay(10); // 延时10ms, 做一个软件的消抖, 防止因抖动而检测到按键按下
if (HAL_GPIO_ReadPin(WKUP_GPIO_Port, WKUP_Pin) == GPIO_PIN_SET) // 如果确实按下了
{
while(HAL_GPIO_ReadPin(WKUP_GPIO_Port, WKUP_Pin) == GPIO_PIN_SET); // 松手检测, 即当这个按键松开后才进行下面的程序, 下同
printf("key WK_UP was pressed rn");
}
}
// 判断 KEY0 按键是否按下
if (HAL_GPIO_ReadPin(KEY0_GPIO_Port, KEY0_Pin) == GPIO_PIN_RESET)
{
HAL_Delay(10); // 延时10ms, 软件消抖
if (HAL_GPIO_ReadPin(KEY0_GPIO_Port, KEY0_Pin) == GPIO_PIN_RESET)
{
while(HAL_GPIO_ReadPin(KEY0_GPIO_Port, KEY0_Pin) == GPIO_PIN_RESET);
printf("key KEY0 was pressed rn");
}
}
/* USER CODE END 3 */
(3) 编译下载
上一篇:【STM32CubeMX】 串口通信(USART) Printf重定向
下一篇:STM32CubeMX系列教程 5.0版本环境开发——2.Uart串行通信功能
推荐阅读最新更新时间:2024-11-11 12:15
设计资源 培训 开发板 精华推荐
- LM2902DR2G 带迟滞比较器的典型应用
- AM1S-0305SZ 1W DC-DC转换器典型应用
- 用于编程欠压锁定的 LT3066EMSE-5 线性稳压器的典型应用电路
- Max98357AETE立体声验证板
- 土壤湿度检测传感器2
- SY89825U,SY89825U 评估板,2.5/3.3V,1:22 高性能、低电压 PECL 总线时钟驱动器和转换器,带内部端接
- EVAL-ADMP510Z-FLEX,基于 ADMP510 的底部端口模拟输出 MEMS 麦克风评估板
- LT1764EQ-1.8 SCR 预稳压器的典型应用可提供跨线路变化的效率
- 紫外手电筒
- AM1G-4803DZ ±3.3V 1 瓦 DC-DC 转换器的典型应用