一、STM32串口硬件接收与发送框图

0.补充
- 串口是以ascii码字符(8位二进制数据)来通讯的
- 串口的物理线 数据是一位一位传输的
1.串口发送
- 数据写入发送数据寄存器TDR
- 数据从发送数据寄存器TDR逐步转入发送移位寄存器 ()
-------前:TXE=0-----------数据全部转入发送移位寄存器 --------后:TXE=1-------------- - 发送移位寄存器将每一帧数据逐步发送到引脚上
-------前:TC=0-----------最后一帧数据发送完 --------后:TC=1-------------- - 串口发送完成中断按照设置是否执行
2.串口接收
- 数据从引脚到接收移位寄存器
- 数据从接收移位寄存器到接收数据寄存器RDR
-------前:RXNE=0-----------数据全部转入接收数据寄存器RDR --------后:RXNE=1-------------- - 数据可以被读取,也可以产生接收中断
二、printf串口重定义(串口发送)
1.将syscall.c文件在工程编译中排除
(因为此文件和我们即将要添加的文件相冲突)


2.添加两个文件到工程中
- 添加
retarget.h文件到Core >> Inc中 - 添加
retarget.c文件到Core >> Src中

/*
* retarget.c
*
* Created on: 2021年10月20日
* Author: Administrator
*/
#include <_ansi.h>
#include <_syslist.h>
#include <errno.h>
#include <sys/time.h>
#include <sys/times.h>
#include <limits.h>
#include <signal.h>
#include <../Inc/retarget.h>
#include <stdint.h>
#include <stdio.h>
#if !defined(OS_USE_SEMIHOSTING)
#define STDIN_FILENO 0
#define STDOUT_FILENO 1
#define STDERR_FILENO 2
UART_HandleTypeDef *gHuart;
void RetargetInit(UART_HandleTypeDef *huart) {
gHuart = huart;
/* Disable I/O buffering for STDOUT stream, so that
* chars are sent out as soon as they are printed. */
setvbuf(stdout, NULL, _IONBF, 0);
}
int _isatty(int fd) {
if (fd >= STDIN_FILENO && fd <= STDERR_FILENO)
return 1;
errno = EBADF;
return 0;
}
int _write(int fd, char* ptr, int len) {
HAL_StatusTypeDef hstatus

本文详细介绍了STM32串口的硬件接收与发送原理,包括串口发送的TDR和移位寄存器操作,以及串口接收的中断处理。此外,还详细阐述了如何在STM32CubeIDE中重定义printf函数以实现串口输出,并讲解了串口接收中断的配置与应用,强调了回车换行作为接收结束标志的重要性。
最低0.47元/天 解锁文章
2159





