当前位置: 首页 > news >正文

二 使用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。 具体路线安排&#xff1a…...

网络工程师精华篇,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灰狼算法优化卷积长短…...

线性分类器--图像表示

整个模型 图像表示 二进制图像 灰度图像 彩色图像 大多数分类算法都要求输入向量&#xff01; rbg的图像矩阵转列向量 大小为 32X32 的话&#xff0c;图像矩阵转列向量是多少维&#xff1f; 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服务器&#xff0c;并解压文件 tar -zxvf mysql-5.7.40-linux-glibc2.12-x…...

基于Hadoop的区块链海量数据存储的设计与实现

点我完整下载&#xff1a;基于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)是一种跟程序运行状态相关的缺陷。这类缺陷不能通过直接禁用相关特性来屏蔽&#xff0c;而是需要通过分析变量的数值状态来发现可能的异常。简单来说&#xff0c;这些缺陷通常只有当程序执行起来以后&#xff0c;才能逐渐暴露出的缺陷&#xff0c;一…...

应用Web3.0的5种方法提升你的点击量

Web3.0早已成为互联网的全新方向标&#xff0c;为用户带来全新的手机上网感受。它也变成吸引住点击量疯涨的秘密武器。我们将要详细介绍Web3.0的五种使用方法&#xff0c;帮助你更好的了解并应用Web3.0技术性&#xff0c;以提升你的点击量。 1.可靠的身份认证Web3.0技术性提供了…...

计算机服务器中了mallox勒索病毒如何处理,mallox勒索病毒解密文件恢复

科技技术的发展推动了企业的生产运营&#xff0c;网络技术的不断应用&#xff0c;极大地方便了企业日常生产生活&#xff0c;但网络毕竟是一把双刃剑&#xff0c;网络安全威胁一直存在&#xff0c;近期&#xff0c;云天数据恢复中心接到很多企业的求助&#xff0c;企业的计算机…...

408—电子笔记分享

一、笔记下载 链接&#xff1a;https://pan.baidu.com/s/1bFz8IX6EkFMWTfY9ozvVpg?pwddeng 提取码&#xff1a;deng b站视频&#xff1a;408-计算机网络-笔记分享_哔哩哔哩_bilibili 包含了408四门科目&#xff08;数据结构、操作系统、计算机组成原理、计算机网络&#xff09…...

【每日一题】子数组的最小值之和

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;贡献法单调栈 写在最后 Tag 【贡献法】【单调栈】【数组】【2023-11-27】 题目来源 907. 子数组的最小值之和 题目解读 计算整数数组的连续子数组中最小值的和。 解题思路 本题朴素的解决思想是求出所有的连续子数组…...

【docker】docker总结

一、Docker简介 Docker是开源应用容器引擎&#xff0c;轻量级容器技术。基于Go语言&#xff0c;并遵循Apache2.0协议开源Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的Linux系统上&#xff0c;也可以实现虚拟化容…...

[英语学习][3][Word Power Made Easy]的精读与翻译优化

[序言] 这次翻译校验, 难度有点大, 原版中英翻译已出现了严重地偏差. 昨晚11点开始阅读如下段落, 花费了1个小时也没有理解原作者的核心表达, 索性睡觉了. 今早学习完朗文单词之后, 9点半开始继续揣摩. 竟然弄到了中午11点30, 终于明白原作者要表达的意思了. 废话不多说&#x…...

使用UIActivityViewController分享图片,没有preview

以前都是用第三方sdk来分享的&#xff0c;最近使用官方的UIActivityViewController来做分享&#xff0c;结果分享图片的时候preview不了分享的图片。 自定义一个继承UIActivityItemProvider的类。关于分享的内容自定义可以自己实现UIActivityItemSource这个协议。首先看看协议的…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

PostgreSQL——环境搭建

一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在&#xff0…...

加密通信 + 行为分析:运营商行业安全防御体系重构

在数字经济蓬勃发展的时代&#xff0c;运营商作为信息通信网络的核心枢纽&#xff0c;承载着海量用户数据与关键业务传输&#xff0c;其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级&#xff0c;传统安全防护体系逐渐暴露出局限性&a…...

字符串哈希+KMP

P10468 兔子与兔子 #include<bits/stdc.h> using namespace std; typedef unsigned long long ull; const int N 1000010; ull a[N], pw[N]; int n; ull gethash(int l, int r){return a[r] - a[l - 1] * pw[r - l 1]; } signed main(){ios::sync_with_stdio(false), …...