STM32使用中断方式进行USART数据收发以及printf函数的重写

news2024/11/17 10:50:55

时间记录:2024/1/5

一、USART/UART介绍

协议介绍
(1)起始位,一位逻辑电平0表示
(2)数据位,8-9位,逻辑高低电平,一般使用8位
(3)校验位,分为奇校验、偶校验、无校验
(4)停止位,0.5、1、1.5、2个逻辑电平1表示
(5)波特率,数据传输的速度,1S发送接收的比特位数,常用的115200、9600
UART协议图
串口介绍
串口1:
    TX:PA9 RX:PA10
串口2:
    TX:PA2 RX:PA3
串口3:
    TX:PB10 RX:PB11

二、以串口1为例实现数据的收发

(1)使能GPIO时钟,配置GPIO端口

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStruct;
    
    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;//发送数据端口,复用推挽输出
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStruct);
    
    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;//接收数据端口,浮空输入
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStruct);

(2)使能串口时钟,配置串口初始化参数

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
    
    USART_InitTypeDef USART_InitStruct;
    
    USART_InitStruct.USART_BaudRate = 115200;//波特率
    USART_InitStruct.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;//模式,收发模式
    USART_InitStruct.USART_WordLength = USART_WordLength_8b;//数据位长度,8位
    USART_InitStruct.USART_Parity = USART_Parity_No;//校验位,无校验位
    USART_InitStruct.USART_StopBits = USART_StopBits_1;//一位停止位
    USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
    USART_Init(USART1,&USART_InitStruct);

(3)设置串口接收中断,使能串口

	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//设置接收中断
    USART_Cmd(USART1,ENABLE);//使能串口

(4)设置中断NVIC,未设置中断分组的话可以先进行设置

    NVIC_InitTypeDef NVIC_InitStruct;
    
    NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
    NVIC_Init(&NVIC_InitStruct);

(5)编写中断函数进行数据接收处理,每次接收到1字节数据

void USART1_IRQHandler(void)
{
    uint16_t temp;
    if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET){//接收到数据
        USART_ClearITPendingBit(USART1,USART_IT_RXNE);//软件清除中断状态位
        temp=USART_ReceiveData(USART1);//接收1字节数据
    }
}

(6)编写发送数据函数进行数据发送,每次发送1字节数据

	while(USART_GetFlagStatus(USARTx,USART_FLAG_TXE)==RESET);//0表示数据还未转移到移位寄存器,1表示数据已经移动到移位寄存器可以发送数据
    USART_SendData(USART1,data);//每次发送1字节数据
    while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)==RESET);//1表示发送完成

三、重写printf函数进行串口数据的发送

方法1:
(1)引入头文件stdio.h
(2)在串口函数中重写fputc函数

int fputc(int ch,FILE* f)
{
    while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//0表示数据还未转移到移位寄存器,1表示数据已经移动到移位寄存器可以发送数据
    USART_SendData(USART1,(u8)ch);
    while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);//1表示发送完成
    return 0;
}

(3)设置使用微库,小扳手->Device->将Use MicroLIB前面的多选框勾选上
使用微库
方法2:
(1)与方法1的(1)(2)步骤一致
(2)在串口函数中写入一些必要的定义即可,定义如下

#pragma import(__use_no_semihosting);//不使用半主机模式

//避免使用半主机模式
void _sys_exit(int x)
{
    x=x;
}

//标准库需要支持的函数
struct __FILE
{
    int handle;
};
FILE __stdout;

四、最后看一下实现的一个效果,使用串口调试助手发送任意消息,以\r\n结尾认为接收完毕,进入回调函数发送MYUSARTTEST1217字符到串口调试助手显示
效果展示
STM32代码和串口调试助手软件有需要可私信本人领取

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

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

相关文章

5分钟搞懂AI的可解释性

大家好啊,我是董董灿。 想象一下,如果有一天,有人跑过来突然告诉你,他搞懂了人类大脑记忆的运行机制,你会是什么反应? 你可能会和我一样,把他当做疯子。 因为我觉得这个课题太深奥了&#xf…

kali-Linux安装ARL灯塔教程以及timeout of 20000ms exceeded 的解决方法

FLAG:别和妈妈诉苦,她帮不上,也睡不着。 专研方向: docker,ARL资产灯塔系统 每日emo:天冷了,你还在坚持吗? 欢迎各位与我这个菜鸟交流学习 kali安装ARL灯塔教程 1.安装docker环境,…

【智慧零售】东胜物联蓝牙网关硬件解决方案,促进零售门店数字化管理

依托物联网(IoT)、大数据、人工智能(AI)等快速发展,数字化和智能化已成为零售企业的核心竞争力。更多的企业通过引入人工智能、大数据等先进技术手段,提高门店运营效率和服务质量。 某连锁咖啡企业牢牢抓住…

位运算 (运算符)

文章目录 位运算位运算概述位运算概览& 按位与&#xff08;AND&#xff09;| 按位或&#xff08;bitwise OR&#xff09;^ 按位异或&#xff08;bitwise XOR&#xff09;~ 按位非&#xff08;bitwise NOT&#xff09;<< 左移&#xff08;bitwise shift left&#xff…

zookeeper应用场景之分布式的ID生成器

1. 分布式ID生成器的使用场景 在分布式系统中&#xff0c;分布式ID生成器的使用场景非常之多&#xff1a; 大量的数据记录&#xff0c;需要分布式ID。大量的系统消息&#xff0c;需要分布式ID。大量的请求日志&#xff0c;如restful的操作记录&#xff0c;需要唯一标识&#x…

分布式(7)

目录 31.基于Zookeeper如何实现分布式锁&#xff1f; 32.什么是ACID&#xff1f; 33.什么是分布式的XA协议&#xff1f; 34.什么是2PC&#xff1f; 35.什么是3PC&#xff1f; 31.基于Zookeeper如何实现分布式锁&#xff1f; 顺序节点 创建一个用于发号的节点“/test/lock…

Mybatis缓存实现方式

文章目录 装饰器模式Cache 接口及核心实现Cache 接口装饰器1. BlockingCache2. FifoCache3. LruCache4. SoftCache5. WeakCache 小结 缓存是优化数据库性能的常用手段之一&#xff0c;我们在实践中经常使用的是 Memcached、Redis 等外部缓存组件&#xff0c;很多持久化框架提供…

Unity3D Shader 之透视效果XRay

1、 Shader "Unlit/XRay" {Properties{_MainTex("Texture", 2D) "white" {}// 漫反射_Diffuse("Diffuse", COLOR) (1,1,1,1)// XRay 效果_XRayColor("XRay Color", COLOR) (0,1,1,1)_XRayPower("XRay Power",…

python识别验证码+灰度图片base64转换图片

一、为后面识别验证码准备 1、base64转换为图片&#xff0c;保存本地、并且置灰 上文中的base64,后面的就是包含Base64编码的PNG图像的字符串复制下来 import base64 from PIL import Image import io# 这里是你的Base64编码的字符串 base64_data "iVBORw0KGgoAAAANSUhE…

记录汇川:水塔指令解释-ST

可以通过帮助查看指令手册 PLC的IO地址映射-两种方法 第一种&#xff1a; 新建一个全局变量表&#xff0c;按照如图所示建立IO地址 第二种&#xff1a; 直接如图所示位置定义名字 注意&#xff1a;IW和QB这两个前面一个有蓝色M一个没有。 蓝色的M表示模块发生变化的时候地址不会…

不用愁企业内部知识库搭建啦,照着这样做轻松解决

在现代企业中&#xff0c;知识是一项宝贵的资源。拥有一个完善的内部知识库可以帮助企业有效地管理和分享知识&#xff0c;提高团队的协作效率&#xff0c;促进创新和发展。然而&#xff0c;对于很多企业来说&#xff0c;搭建一个高效的知识库可能会成为一项具有挑战性的任务。…

【docker】cgroups资源限制

目录 一、cpu资源控制 1、 设置cpu使用率上限 2、设置cpu资源占用比&#xff08;设置多个容器时才有效&#xff09;Docker通过–cpu-shares指定cpu份额&#xff0c;默认为1024&#xff0c;值为1024的倍数。 3、设置容器绑定指定的CPU 三、内存资源控制 四、磁盘IO配额控制…

非接触式红外测温MLX90614

1.MLX90614简介 MX90614是一款由迈来芯公司提供的低成本&#xff0c;无接触温度计。输出数据和物体温度呈线性比例&#xff0c;具有高精度和高分辨率。TO-39金属封装里同时集成了红外感应热电堆探测器芯片MLX81101&#xff08;温度是通过PTC或是PTAT元件测量&#xff09;和信号…

原生微信小程序如何动态修改svg图片颜色及尺寸、宽高(封装svgIcon组件)

最终效果 前言 动态设置Svg图片颜色就是修改Svg源码的path中的fill属性&#xff0c; 通过wx.getFileSystemManager().readFile读取.xlsx文件 把文件转成base64 封装svg-icon组件 1、在项目的components下新建svg-icon文件夹&#xff0c;新增base64.js文件 class Base64 {cons…

深圳易图讯实景三维数字孪生系统 实景三维电子沙盘

深圳易图讯实景三维数字孪生系统是一款基于三维地理空间的数字孪生系统&#xff0c;首先&#xff0c;该系统集成了多维度地理空间数据&#xff0c;可以将各类数据与应用需求进行充分整合&#xff0c;实现数据跨界融合、场景全角度可视等功能。其次&#xff0c;该系统具备智能化…

36V到80V降5V1A电源芯片WT6039

36V到80V降5V1A电源芯片WT6039 宽电压12V到90V的降压DC-DC转换器WT6039&#xff0c;功能强大&#xff0c;使用广泛。 WT6039是一款功能非常强大的降压DC-DC转换器芯片&#xff0c;它在12V到90V的宽电压范围内都能正常工作。WT6039不仅具有使能开关控制、参考电源、误差放大器等…

gRPC - 分布式 gRPC 四种通信方式、三种代理方式(全代码演示)

目录 一、分布式 gRPC 开发 1.1、项目结构 & 前置说明 1.1.1、项目结构 1.1.2、protoc 必备依赖 1.1.3、推荐插件&#xff08;简化开发&#xff09; 1.1.4、protoc 生成 Java 代码说明 1.2、一元 RPC&#xff08;代理方式一&#xff1a;阻塞式 BlockingStub&#xff…

深度学习中的准确率、精确率(查准率)、召回率(查全率)、F1值、ROC曲线的AUC值,

混淆矩阵 其中关于 TP, TN; FP, FN 的解释&#xff1b; 其中首字母 T&#xff0c;F代表预测的情况&#xff0c;即T代表预测的结果是对的&#xff0c; F代表预测的结果是错误的&#xff1b; 第二个字母代表预测是预测为 正样本&#xff0c;还是负样本&#xff0c; Positve 代表…

Python实现某城市从站点API获取天气状况示例(Crossin教室实例24)

一、要点说明&#xff1a; 根据站点当前API数据是由‘\r’字符连接的字符串的特点&#xff0c;主要用到了字符串的split()方法。此方法参数就是‘\r’。函数返回值是被分隔的字符串的列表。通过使用列表索引就可以分项取到天气数据。 二、示例代码&#xff1a; import reque…

面试被问了几百遍的 IOC 和 AOP ,一篇文章带你搞清楚!!!

面试被问了几百遍的 IOC 和 AOP &#xff0c;一篇文章带你搞清楚&#xff01;&#xff01;&#xff01; 这篇文章会从下面从以下几个问题展开对 IoC & AOP 的解释 什么是 IoC&#xff1f;IoC 解决了什么问题&#xff1f;IoC 和 DI 的区别&#xff1f;什么是 AOP&#xff…