二 使用GPIO的复用功能 利用USART 实现printf()

news2024/12/28 17:48:49

参考这篇: 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) ; 

    //初始化USART1
    USART_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);
    //使能USART1
    USART_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库的备选库,它可装入少量内存中,与嵌入式应用程序配合使用,且这些应用程序不在操作系统中运行。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1258730.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习的复习笔记4-岭回归与多项式回归

一、岭回归 在简单的线性回归中,一味追求平方误差最小化,R2值尽可能大,可能会受到噪声的严重干扰。噪声,即偶发的错误的值。 如图,若为满足所有点的拟合(虚线),表面上看R2值小&…

虚拟偶像的商业化

虚拟偶像的商业化主要通过以下几种方式实现: 直播与内容:虚拟主播在各大平台进行直播,提供音乐、游戏、教育等内容。收益主要包括Super Chat(直播打赏)、收费会员(支付月费后成为该频道会员,可…

如何使用WMS仓储管理系统实现流程优化

随着企业对于物流管理的需求日益增长,自动化WMS仓储管理系统已经成为了现代企业的核心工具之一。通过引入信息化技术,我们可以实现仓库管理流程的不断调整和优化,从而更好地满足客户的多样化需求。 一、信息化技术的引领 在现代仓库管理中&a…

Docker和Kubernetes:区别与优势对比

在现代软件开发和部署中,Docker和Kubernetes是两个备受关注的技术。本文将对Docker和Kubernetes进行比较,探讨它们的区别和各自的优势。 引言 在过去的几年中,容器技术得到了迅速的发展,并且在现代软件交付和部署中扮演着越来越重…

如何获取抖音订单列表

怎么获取订单列表接口 请求地址:响应参数以及示例

为什么我用 AI 做不出好看的图?好说给你划重点

最近一个月,我们介绍了些实用的 AI 绘画教程,不知道看过的你是学会了吗?有不少朋友和小编说,有了这些教程,用好说 AI 的指令做起图来比 SD 方便了不少。 不过也有朋友就和小编抱怨:“你教程里的和我做出来…

Flask 实现Token认证机制

在Flask框架中,实现Token认证机制并不是一件复杂的事情。除了使用官方提供的flask_httpauth模块或者第三方模块flask-jwt,我们还可以考虑自己实现一个简易版的Token认证工具。自定义Token认证机制的本质是生成一个令牌(Token)&…

dubbo框架技术文档-《spring-boot整合dubbo框架搭建+配置文件》框架的本地基础搭建

阿丹: 目前流行的微服务更多的就是dubbo和springcould微服务。之前阿丹没有出过dubbo相关的文章,因为之前接触springcould的微服务概念比较多一点,但是相对于springcould来说,springcould服务之间的调用是大多是使用了nacos&#…

Cascader 级联选择器动态加载数据的回显

如果后端没有只返回第三级的id,而是同时把第三级的名字一起返回了,那么就可以通过下面的方法来实现 1.在级联选择器里面加上这句代码 placeholder"请选择" 2.注册一个字符串 pleasett:"" 3.赋值 如过后端返回的有第三级的选项名 直接进行赋…

记录一个mqtt错误

在vue-admin-template 中引入mqtt 安装不报错,引入试过 import mqtt from mqtt import * as mqtt from mqtt/dist/mqtt.min; import {connect} from mqtt 一直报错: 就表示不理解,网上也没查到相应的资料,请告诉我我不是第一个遇…

pytest系列——pytest_runtest_makereport钩子函数获取测试用例执行结果

前言 pytest测试框架提供的很多钩子函数方便我们对测试框架进行二次开发,可以根据自己的需求进行改造。 例如:钩子方法:pytest_runtest_makereport ,可以更清晰的了解测试用例的执行过程,并获取到每个测试用例的执行…

Python基础:字符串(String)详解

1. 字符串定义 在Python中,字符串是一种数据类型,用于表示文本数据。字符串是由字符组成的序列,可以包含字母、数字、符号和空格等字符。在Python中,你可以使用单引号()或双引号("&#xf…

【Python】巧用tkinter设计秒表计时器

秒表计时器是一种用于计算时间间隔的计时器。它通常由一个开始按钮、一个停止按钮和一个重置按钮组成。 使用方法: 单击“开始”按钮开始计时。单击“停止”按钮停止计时。单击“重置”按钮将计时器归零。 注意事项: 没有对计时器误差进行校准&#…

【密码学】【多方安全计算】不经意传输(Oblivious Transfer,OT)

文章目录 不经意传输(oblivious transfer)定义不经意传输的实例(1 out 2,二选一不经意传输)基于RSA的1 out 2 不经意传输疑问 不经意传输(oblivious transfer)定义 不经意传输(obli…

Spring之@Autowired 属性多实现和单实现源码解析

Autowired使用过程中遇到疑问,通过源码解析原因 一、起因1、当person只有一个实现类时,TestController中,Person属性随意取名。2、当有Person两个实现类时,TestController中,属性名称必须和实现类名一致(ma…

HarmonyOS 位置服务开发指南

位置服务开发概述 移动终端设备已经深入人们日常生活的方方面面,如查看所在城市的天气、新闻轶事、出行打车、旅行导航、运动记录。这些习以为常的活动,都离不开定位用户终端设备的位置。 当用户处于这些丰富的使用场景中时,系统的位置能力…

跨境电商崛起:揭秘全球化商机

随着科技的迅猛发展,跨境电商正崭露头角,成为商业新风口。这个数字化时代为全球商家带来了前所未有的机遇,同时也为消费者提供更广阔的购物选择。本文将深入探讨跨境电商的崛起,揭示其中隐藏的全球化商机,以及这一趋势…

【c++】多线程大幅缩减时间

多线程在进行复杂运算时能够大量节约时间 提醒自己能够在多线程运算的时候一定要充分利用 能够省下2/3的时间 测试代码 #include<vector> #include <iostream> #include <thread> using namespace cv; using namespace std; int result1 0 ; bool thread…

希亦和海尔内衣洗衣机哪款好用点?性价比小型洗衣机测评

在最近的这两年以来&#xff0c;专门用于清洗我们内衣裤等贴身衣物的小家电——内衣洗衣机&#xff0c;非常的火爆&#xff01;如今越来越多的人开始使用上了内衣洗衣机&#xff0c;不仅省时而且还省力。但是由于市面上内衣洗衣机产品众多&#xff0c;于是我挑选了希亦和海尔两…

overleaf上武大毕业论文开题报告本地参考文献编译报错

overleaf上武大毕业论文开题报告本地参考文献编译报错 具体报错内容 BibTeX subsystem: /tmp/biber_tmp_FDeB/b2e90af6edbf2e41914433623737dc27_16.utf8, line 4989, syntax error: found “spremont:1979”, expected “,” 解决方案 1.将参考文献编译工具设置为biber …