二 使用GPIO的复用功能 利用USART 实现printf()
参考这篇: STM32串口通信详解
1. 关于USART
USART ( universal synchronous / asynchronous receiver /transmitter) 是一种串行通讯协议 , 允许设备通过串行端口进行数据传输, USART 能够以同步或者异步的方式进行工作,在实际的运用中,我们主要使用的是它的异步通信模式
1.1 USART 工作模式 (异步)
- 通讯方式: 异步 ,无需共享或者同步时钟信号
- 数据格式: 发送和接受数据时, 数据被封装在帧中,通常包含起始位 数据位 可选的奇偶校验位 以及停止位
- 波特率: 使用先双方需要设置相同的波特率
- 流控制: 可选择硬件流控制如RTS/CTS)或者软件流控制 (如XON/XOFF)
- 连接方式: 点对点,通常用于两个设备之间
优点: 在于简单些和点对点的通讯效率
缺点: 没有外部的时钟进行同步, 通讯双方的时钟必须精确的匹配
1.2 USART 工作模式 (同步)
在同步模式下 , USART需要使用一个外部的时钟信号来同步数据的发送和接受
- 同步起始位: 同步模式使用特定的同步字符或位模式来标记数据帧的开始
- 数据位: 数据以固定的数据发送, 速率由外部时钟决定
- 奇偶校检位(可选) : 于异步模式相同, 用于错误检测
- 停止位: 在某些同步的USART中,停止位可能不被使用,因为时钟信号已经提供了数据帧 的同步
优点:优点是速度,因为外部时钟信号允许更快的数据率和更高的数据吞吐量 , 此外 由于时钟信号的存在,接受器能够更加准确的确定何时读取数据位
缺点 : 需要额外的时钟线
1.2 USART 和 UART 的差异
- 同步模式: USART 可以工作在同步模式下,但是需要额外的时钟信号来同步数据的发送和接受, 但是UART 不具备同步模式
- 功能: USART 通常提供更多的特性和配置选项,如数据位的长度,奇偶校检,多种停止位等
- 速度和效率: 在同步模式下, USART可以提供比异步模式(UART)更快的数据传输速度
- 硬件复杂性: USART的硬件实现比UART 复杂, 因为它需要处理同步和异步两种通讯方式
1.4 工作的框图

2. 流程
2.1 初始化GPIO : GPIO_init(void)
- 使能GPIO的时钟
- 设置GPIO引脚9 和 10 为复用功能 ,方便用作 USART1 的 TX(接受) 和RX(发送) 引脚
- 初始化GPIO 引脚设置 模式(复用) ,输出类型(推挽),上拉下拉(上拉)
2.2 USART的初始化 : USART_init(void)
- 使能 USART1 的时钟
- 配置USART1的参数 :波特率(115200) , 字节长度(8),硬件流控制(无),工作模式(发送),校检位(无), 停止位(1位)
- 使能USART1 使其工作
2.3 fputc函数重写
- 重写fputc函数以便printf可以使用USART发送数据。
将字符ch发送到USART1。 - 使用轮询方式等待发送完成(通过检查USART1的传输完成标志)。
- 返回写入的字符。
3. 代码
3.1 USART.h
#ifndef USART_H
#define USART_H#include "stm32f4xx.h"
#include "stdio.h"
#include "stm32f4xx_usart.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h" void GPIO_init(void);
void USART_init(void);
int fputc(int ch , FILE*f) ; #endif
3.2 USART.c
#include "stm32f4xx.h"
#include "USART.h"
#include "stdio.h" //#include "stm32f4xx_gpio.h"
//#include "stm32f4xx_rcc.h" void GPIO_init(void)
{//使能外设时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//设置GPIOA引脚为复用功能 GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);//初始化GPIOA引脚9 为复用功能输出GPIO_InitTypeDef GPIO_InitStruct ; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF ; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP ; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP ; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9 ; GPIO_Init( GPIOA, & GPIO_InitStruct);//初始化GPIOA引脚10 为复用功能输入GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF ; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP ; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10 ; GPIO_Init( GPIOA, & GPIO_InitStruct);}void USART_init(void)
{ //使能时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE) ; //初始化USART1USART_InitTypeDef USART_InitStruct ; USART_InitStruct.USART_BaudRate = 115200 ; USART_InitStruct.USART_WordLength = USART_WordLength_8b ;USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None ; USART_InitStruct.USART_Mode = USART_Mode_Tx ; USART_InitStruct.USART_Parity = USART_Parity_No ; USART_InitStruct.USART_StopBits = USART_StopBits_1 ;USART_Init(USART1, &USART_InitStruct);//使能USART1USART_Cmd(USART1, ENABLE);}int fputc(int ch , FILE*f)
{ USART_SendData(USART1, (uint8_t) ch) ; while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) ; //等待发送完成 一直为0 则一直循环 return ch ;
}
3.3 main.c
#include "stm32f4xx.h"
#include "USART.h" void delay(uint32_t time) ;
int main()
{ GPIO_init(); USART_init(); while(1) {printf("hello world\r\n") ; }}
4. 关于printf函数,scanf函数 重定向问题
MicroLib是缺省c库的备选库,它可装入少量内存中,与嵌入式应用程序配合使用,且这些应用程序不在操作系统中运行。

相关文章:
二 使用GPIO的复用功能 利用USART 实现printf()
参考这篇: STM32串口通信详解 1. 关于USART USART ( universal synchronous / asynchronous receiver /transmitter) 是一种串行通讯协议 , 允许设备通过串行端口进行数据传输, USART 能够以同步或者异步的方式进行工作,在实际的运用中&…...
C#中的警告CS0120、CS0176、CS0183、CS0618、CS0649、CS8600、CS8601、CS8602、CS8604、CS8625及处理
目录 一、CS0120 二、CS0176 1.解决前 2.解决后 3.解决办法 三、CS0183 四、CS0618 五、CS8600 六、CS8602 七、CS8622 1. 解决前: 2. 解决后: 3.解决方法: 八、CS8604和CS8625 九、CS0649 十、CS8601 一、CS0120 严重性 代…...
js中声明变量的关键字(const,let,var)
const 特点: const不允许在同一作用域重复声明,块级作用域暂时性死区,在声明之前,该变量是不可用的const声明的是一个只读变量,声明之后不能改变其值,一旦声明必须初始化但是const定义的对象属性是可以修…...
Android13 launcher循环切页
launcher 常规切页:https://blog.csdn.net/a396604593/article/details/125305234 循环切页 我们知道,launcher切页是在packages\apps\Launcher3\src\com\android\launcher3\PagedView.java的onTouchEvent中实现的。 1、滑动限制 public boolean onT…...
Java学习路线第一篇:Java基础(2)
这篇则分享Java学习路线第一part:Java基础(2) 从看到这篇内容开始,你就是被选定的天命骚年,将承担起学完Java基础的使命,本使命为单向契约,你可选择YES或者选择YES。 具体路线安排:…...
网络工程师精华篇,50种网络故障及解决方法大集合
上午好,我的网工朋友。 做网络工程师,自然离不开网络,而日常工作中能搞多少大项目?最常见的其实还是网络故障的处理了。 怎么最高效地排查网络故障?怎么简单几招通网? 今天就从基础的入手,分…...
Unity播放网络视频
using System.Collections; using System.Collections.Generic; using UnityEngine; using Mx.UI; using Mx.Utils; using UnityEngine.UI; using UnityEngine.Video; /// <summary> 视频UI面板 </summary> public class VideoUIForm : BaseUIForm { private …...
SCI一区级 | Matlab实现GWO-CNN-LSTM-selfAttention多变量多步时间序列预测
SCI一区级 | Matlab实现GWO-CNN-LSTM-selfAttention多变量多步时间序列预测 目录 SCI一区级 | Matlab实现GWO-CNN-LSTM-selfAttention多变量多步时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现GWO-CNN-LSTM-selfAttention灰狼算法优化卷积长短…...
线性分类器--图像表示
整个模型 图像表示 二进制图像 灰度图像 彩色图像 大多数分类算法都要求输入向量! rbg的图像矩阵转列向量 大小为 32X32 的话,图像矩阵转列向量是多少维? 32x32x3 3072 维列向量...
车载通信架构 —— 传统车内通信网络FlexRay(较高速度高容错、较灵活拓扑结构)
车载通信架构 —— 传统车内通信网络FlexRay(较高速度高容错、较灵活拓扑结构) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,…...
如何在Ubuntu的Linux系统中安装MySQL5.7数据库
前往MySQL数据库官网链接地址下载5.7数据库。 MySQL :: Download MySQL Community Server (Archived Versions)使用ssh的可视化工具将下载的mysql-5.7.40-linux-glibc2.12-x86_64.tar.gz文件上传到Linux服务器,并解压文件 tar -zxvf mysql-5.7.40-linux-glibc2.12-x…...
基于Hadoop的区块链海量数据存储的设计与实现
点我完整下载:基于Hadoop的区块链海量数据存储的设计与实现.docx 基于Hadoop的区块链海量数据存储的设计与实现 Design and Implementation of Mass Data Storage for Blockchain based on Hadoop 目录 目录 2 摘要 3 关键词 4 第一章 引言 4 1.1 研究背景 4 1.2 研…...
运行时错误/缺陷到底是什么缺陷
运行时错误(Run-time Error)是一种跟程序运行状态相关的缺陷。这类缺陷不能通过直接禁用相关特性来屏蔽,而是需要通过分析变量的数值状态来发现可能的异常。简单来说,这些缺陷通常只有当程序执行起来以后,才能逐渐暴露出的缺陷,一…...
应用Web3.0的5种方法提升你的点击量
Web3.0早已成为互联网的全新方向标,为用户带来全新的手机上网感受。它也变成吸引住点击量疯涨的秘密武器。我们将要详细介绍Web3.0的五种使用方法,帮助你更好的了解并应用Web3.0技术性,以提升你的点击量。 1.可靠的身份认证Web3.0技术性提供了…...
计算机服务器中了mallox勒索病毒如何处理,mallox勒索病毒解密文件恢复
科技技术的发展推动了企业的生产运营,网络技术的不断应用,极大地方便了企业日常生产生活,但网络毕竟是一把双刃剑,网络安全威胁一直存在,近期,云天数据恢复中心接到很多企业的求助,企业的计算机…...
408—电子笔记分享
一、笔记下载 链接:https://pan.baidu.com/s/1bFz8IX6EkFMWTfY9ozvVpg?pwddeng 提取码:deng b站视频:408-计算机网络-笔记分享_哔哩哔哩_bilibili 包含了408四门科目(数据结构、操作系统、计算机组成原理、计算机网络)…...
【每日一题】子数组的最小值之和
文章目录 Tag题目来源题目解读解题思路方法一:贡献法单调栈 写在最后 Tag 【贡献法】【单调栈】【数组】【2023-11-27】 题目来源 907. 子数组的最小值之和 题目解读 计算整数数组的连续子数组中最小值的和。 解题思路 本题朴素的解决思想是求出所有的连续子数组…...
【docker】docker总结
一、Docker简介 Docker是开源应用容器引擎,轻量级容器技术。基于Go语言,并遵循Apache2.0协议开源Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux系统上,也可以实现虚拟化容…...
[英语学习][3][Word Power Made Easy]的精读与翻译优化
[序言] 这次翻译校验, 难度有点大, 原版中英翻译已出现了严重地偏差. 昨晚11点开始阅读如下段落, 花费了1个小时也没有理解原作者的核心表达, 索性睡觉了. 今早学习完朗文单词之后, 9点半开始继续揣摩. 竟然弄到了中午11点30, 终于明白原作者要表达的意思了. 废话不多说&#x…...
使用UIActivityViewController分享图片,没有preview
以前都是用第三方sdk来分享的,最近使用官方的UIActivityViewController来做分享,结果分享图片的时候preview不了分享的图片。 自定义一个继承UIActivityItemProvider的类。关于分享的内容自定义可以自己实现UIActivityItemSource这个协议。首先看看协议的…...
SiameseAOE模型在微信小程序评论分析中的应用实战
SiameseAOE模型在微信小程序评论分析中的应用实战 最近和几个做小程序的朋友聊天,他们都在头疼同一个问题:用户评论越来越多,根本看不过来。好评差评混在一起,想提炼点有价值的信息,比如用户到底喜欢商品的哪个点&…...
FPGA开发者必看:UltraScale Plus中URAM与BRAM的5大实战区别(附配置示例)
FPGA开发者必看:UltraScale Plus中URAM与BRAM的5大实战区别(附配置示例) 在UltraScale Plus系列FPGA的设计中,存储资源的高效利用往往是项目成败的关键。作为硬件工程师,我们常常需要在BRAM和URAM之间做出选择——这两…...
3步精通安卓虚拟定位:FakeLocation实现应用级位置模拟的终极指南
3步精通安卓虚拟定位:FakeLocation实现应用级位置模拟的终极指南 【免费下载链接】FakeLocation Xposed module to mock locations per app. 项目地址: https://gitcode.com/gh_mirrors/fak/FakeLocation 在数字时代,位置信息已成为个人隐私的最后…...
双频 WiFi 机柜天线:2.4G+5.8G 全覆盖无死角
WiFi 进机柜,最容易遇到干扰大、衰减快、金属屏蔽。今天分享一步到位的双频 WiFi 机柜天线,2.4G 与 5.8G 同时覆盖,布线少、信号稳。 双频机柜天线优势:一根顶两根,省空间、省布线;抗金属优化,…...
分散加载详解与应用
分散加载(Scatter Loading)是一种由链接器(Linker)提供的、用于精确控制程序各个段(如代码、数据)在目标存储器(如 Flash、RAM)中加载地址和执行地址的机制。其核心在于将单一的、线…...
Qwen3-TTS快速入门:上传15秒语音,一键生成你的专属AI配音
Qwen3-TTS快速入门:上传15秒语音,一键生成你的专属AI配音 1. 为什么选择Qwen3-TTS进行语音克隆 想象一下这样的场景:你需要为视频教程配音,但自己录音总是卡壳;或者想给海外客户发语音邮件,却苦于外语发音…...
哔哩下载姬DownKyi:如何轻松下载B站8K视频和批量管理资源
哔哩下载姬DownKyi:如何轻松下载B站8K视频和批量管理资源 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等&am…...
零代码操作:SiameseAOE中文观点抽取Web界面使用指南
零代码操作:SiameseAOE中文观点抽取Web界面使用指南 1. 认识SiameseAOE观点抽取工具 观点抽取是自然语言处理中的一项实用技术,它能从文本中自动识别出人们对事物的评价和看法。想象一下,当你面对成千上万条商品评论时,手动阅读…...
Java 高级特性” 体系(反射 + 枚举 + Lambda)
1.反射 1.1 定义 Java的反射(reflection)机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法; 不用 new,不用知道类名,也能操作类。 1.2 用途 框架底层核心(S…...
vLLM-v0.17.1惊艳效果:AWQ量化后Llama3-8B显存占用降至11GB
vLLM-v0.17.1惊艳效果:AWQ量化后Llama3-8B显存占用降至11GB 1. vLLM框架简介 vLLM是一个专为大型语言模型(LLM)设计的高性能推理和服务库,以其出色的速度和易用性著称。这个项目最初由加州大学伯克利分校的天空计算实验室开发,现在已经发展…...
