文章目录
- 一、学习目的
- 二、CubeMX配置
- 三、代码编写
一、学习目的
串口通信是一种简单且广泛应用的通信方式。本文的学习目标是通过CubeMX工具配置串口通信,并编写相应代码,以实现串口助手打印信息以及蓝牙通信等功能。
二、CubeMX配置
(1)首先打开CubeMX软件,新建工程。有关软件使用以及新建工程的相关操作在之前的文章中已经有过记载,有需要可以查看以下文章:蓝桥杯嵌入式学习记录——点亮第一个LED(含软件的使用)_蓝桥杯嵌入式led-CSDN博客
(2)进入如下界面后,先点击System Core > RCC时钟选项,如图步骤所示打开高速时钟设置
(3)再点击SYS >Debug ,选择串口通信方式
(4)接着按照下图步骤修改时钟参数,以下提供修改后的参数图:
(5)接下来就可以开始配置串口信息了,点击进入左侧的Connectivity > USART2,选择模式为Asynchronous,设置波特率为9600(可以根据需要自行设置)
(6)如图所示,打开串口中断设置
至此,CubeMX上的串口配置已经完成,接下来按照以下步骤生成工程文件代码即可
(1)给工程文件命名 > 选择编辑器
(2)选择生成文件类型 > 生成文件
三、代码编写
CubeMX的配置完成之后,就可以打开工程文件进行代码编写了
(1)串口输出
例如最常见的,printf输出到串口,就需要将fputc里面的输出指向串口(重定向),即将以下代码添加到自动生成的usart.c中就行
#include "stdio.h"
//标准库需要的支持函数
struct __FILE
{
int handle;
}; FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x)
{
x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{
while((USART2->SR&0X40)==0);//循环发送,直到发送完毕
USART2->DR = (uint8_t) ch;
return ch;
}
需要注意的是,一定不要忘记添加stdio.h库,添加完以上代码后,在主函数中添加usart.h和stdio.h库后就可以直接通过printf函数打印串口信息了
(2)串口接收
例如通过蓝牙控制(串口助手同理)时,希望单片机接收到我们发送的信息并执行相应操作,这时需要开启串口中断(也有别的办法,这里暂时只记录串口中断),可以通过以下函数开启串口中断:
#define rxDataLen 1 //接收一个字节的数据
char rxBuffer[rxDataLen]; // 存储接收到的数据的数组
HAL_UART_Receive_IT(&huart2, (uint8_t *)rxBuffer, rxDataLen); //使能串口中断
注意别忘记定义接收的字节变量和储存变量的数组哈,开启串口中断之后就可以编写中断服务函数(回调函数),模板如下:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart == &huart2) // 如果是串口2
{
if(rxBuffer[0] == '1')
{
//操作1
}
if(rxBuffer[0] == '2')
{
//操作2
}
//返回接收的信息
// HAL_UART_Transmit_IT(&huart2, (uint8_t *)rxBuffer, rxDataLen);
}
// 使用HAL_UART_Receive_IT()时,只会进入一次中断。因此需要在回调函数内再次调用该函数
HAL_UART_Receive_IT(&huart2, (uint8_t *)rxBuffer, rxDataLen);
}
至此,关于CubeMX的串口配置就记录完成了