1. uart(1)
串口简介
USART1,2,3:同步、异步
UART4,5:异步

异步通信

波特率也可以理解:传输每一位需要的时间
波特率9600:1s传输9600bit或者传输1bit的时间是19600\frac{1}{9600}96001s
串口发送/接收函数

串口发送函数
此处常用阻塞方式发送函数

串口接收函数
重点学习采用中断方式的接收函数
需要配合***接收中断回调函数***的使用

MX串口配置
USART1——异步模式——波特率

中断使能设置

NVIC优先级配置

其余System Core设置:
SYS/RCC/GPIO(PC12-output)
KEIL代码部分
串口初始化
读代码——MX_USART1_UART_Init();


UART中断部分




测试一 简单收发


以下测试只限发送和接收相同位数据,超出发送位数上限时,接收结果将显示错误
Test1 电脑端发送串口数据,单片机接收并翻转led
#include "main.h"
#include "usart.h"
#include "gpio.h"
uint8_t temp;
void SystemClock_Config(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
HAL_UART_Receive_IT(&huart1,&temp,1);// 启动接收,将接收到的1bit保存在temp
while (1)
{
}
}
// 串口接收中断回调函数
// 串口有数据进入,触发接收中断
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart==&huart1)
{
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_12);
HAL_UART_Receive_IT(&huart1,&temp,1);// 每次接收完数据重新启动接收
}
}
Test2 电脑端发送串口数据,单片机接收并回传给电脑
#include "main.h"
#include "usart.h"
#include "gpio.h"
uint8_t temp;
uint8_t u1_flag;// uart1标志位
uint8_t u1_txbuf[20] = {
"this is ok"};// 用于发送:单片机向电脑端回传数据数组
void SystemClock_Config(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
HAL_UART_Receive_IT(&huart1,&temp,1);// 启动接收启动接收,将接收到的1bit保存在temp,并进入中断
while (1)
{
if(u1_flag == 1)
{
HAL_UART_Transmit(&huart1,u1_txbuf,10,0xff);// 单片机向电脑端回传数据
u1_flag=0;
}
}
}
// 串口接收中断回调函数
// 串口有数据进入,触发接收中断
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart==&huart1)
{
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_12);
u1_flag=1;
HAL_UART_Receive_IT(&huart1,&temp,1);// 每次接收完数据重新启动接收
}
}
Test3 单片机接收5bit进入中断并向电脑返回数据
#include "main.h"
#include "usart.h"
#include "gpio.h"
uint8_t temp;
uint8_t u1_flag;// uart1标志位
uint8_t u1_rxbuf[20] = {
0};// 用于接收
void SystemClock_Config(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
HAL_UART_Receive_IT(&huart1,u1_rxbuf,5);// 单片机每接收5bit才进入中断
while (1)
{
if(u1_flag == 1)
{
temp++;
HAL_UART_Transmit(&huart1,u1_rxbuf,5,0xff);// 单片机向电脑端回传数据
u1_flag=0;
}
}
}
// 串口接收中断回调函数
// 串口有数据进入,触发接收中断
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart==&huart1)
{
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_12);
u1_flag=1;
HAL_UART_Receive_IT(&huart1,u1_rxbuf,5);// 电脑端发送5个bit进入1次中断
}
}
Printf函数重定向至USARTx
/**
* 函数功能: 重定向c库函数printf到USARTx
* 输入参数: 无
* 返 回 值: 无
* 说 明:无
*/
#include <stdio.h>
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch,1,0xffff);
return ch;
}
Test4 使用printf函数向串口发送数据
#include "main.h"
#include "usart.h"
#include "gpio.h"
#include <stdio.h>
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch,1,0xffff);
return ch;
}
uint8_t temp;
uint8_t u1_flag;

本文介绍了STM32中UART串口的配置与使用,包括波特率计算、中断接收函数和回调函数的应用。通过一系列测试案例展示了如何实现串口数据的收发、数据解析、LCD1602显示以及与手机蓝牙通信,涉及串口协议、数据处理和实时性需求。

554

被折叠的 条评论
为什么被折叠?



