嵌入式软件--stm32 DAY 6 USART串口通讯(下)

news2025/5/20 4:51:33

1.寄存器轮询_收发字符串

通过寄存器轮询方式实现了收发单个字节之后,我们趁热打铁,争上游,进阶到字符串。字符串就是多个字符。很明显可以循环收发单个字节实现。

然后就是接收字符串。如果接受单个字符的函数放在while里,它也可以实现一个一个的接收字符串,在一定时间戳下,效果等同。

然后我们要想想如何整合,写成一个函数。

2.问题解答,状态位清零

我们的编程方式,一个是寄存器写法,一个是hal库写法。还有的就是实现思路。

//发送一个字符
void USART_SendChar(uint8_t ch)
{
   //判断TDR是否为空,必须等待TDR为空才能写入数据,也就是继续发送
   while((USART1->SR & USART_SR_TXE)==0)
   {

   }

   //将要发送的数据写入TDR
   USART1->DR = ch;
}

初始的时候,TDR的存储寄存器肯定为空

关于状态位清零,TXE和RXNE都可以自动清零。

只要发数据,就自动清零。

RXNE也是一样,只要读RDR,就会清零。

3.串口通讯 寄存器中断方式

复制上一个工程文件,把改删除的删掉。

主要配置中断管理NVIC

中断服务函数

main.c

#include "usart.h"
#include "delay.h"
#include <string.h>
//定义接收缓冲区和接收数据长度
uint8_t buff[100];
uint8_t size;
int main(void)
{
	//1.初始化
    USART_Init();
	
	//发送单个字符
	USART_SendChar('A');
	USART_SendChar('\n');
	//发送字符串
	uint8_t str[]="Hello World!\n";
	USART_SendString(str,strlen((char *)str));
	while(1)
	{
		
	}
	
}

usart.c

#include "usart.h"

//初始化
void USART_Init(void)
{
   //开启时钟
   RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
   RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;

   //GPIO工作模式
   // PA9:TX 复用推挽输出,CNF=10,MODE=11
   GPIOA->CRH |= GPIO_CRH_MODE9;
   GPIOA->CRH |= GPIO_CRH_CNF9_1;
   GPIOA->CRH &= ~GPIO_CRH_CNF9_0;
   // PA10:RX 浮空输入,CNF=01,MODE=00
   GPIOA->CRH &= ~GPIO_CRH_MODE10;
   GPIOA->CRH &= ~GPIO_CRH_CNF10_1;
   GPIOA->CRH |= GPIO_CRH_CNF10_0;
   
   //串口模块设置
   //设置波特率 115200
   USART1->BRR = 0x271;
   //使能串口和收发模块
   USART1->CR1 |= USART_CR1_UE;
   USART1->CR1 |= (USART_CR1_TE|USART_CR1_RE);
   
   //配置数据帧格式
   USART1->CR1 &=~ USART_CR1_M;   //长度为8位的数据,没有校验位
   USART1->CR1 &=~ USART_CR1_PCE;  //无校验,不使用校验位
   USART1->CR2 &=~ USART_CR2_STOP;  //1位停止位

   //使能串口接收中断
   USART1->CR1 |= USART_CR1_RXNEIE;
   USART1->CR1 |= USART_CR1_IDLEIE;

   //配置NVIC
   NVIC_SetPriorityGrouping(3);
   NVIC_SetPriority (USART1_IRQn,2);
   NVIC_EnableIRQ(USART1_IRQn);
   }

//发送一个字符
void USART_SendChar(uint8_t ch)
{
   //判断TDR是否为空,必须等待TDR为空才能写入数据,也就是继续发送
   while((USART1->SR & USART_SR_TXE)==0)
   {

   }

   //将要发送的数据写入TDR
   USART1->DR = ch;
}



//发送字符串,数组可以用指针表示,形参就是数组和字长
void USART_SendString(char *str,uint8_t size)
{
   uint8_t i = 0;
   for ( i = 0; i < size; i++)
   {
      USART_SendChar(str[i]);
   }
   
}

//引入外部变量
extern uint8_t buff[100];
extern uint8_t size;

//中断服务程序
void USART1_IRQHandler(void)
{
   //判断是RXNE=1还是IDLE=1
   if (USART1->SR & USART_SR_RXNE)
   {
      //如果RXNE=1,表示接收到一个字符
buff[size]=USART1->DR;
size++;
   }
   else if (USART1->SR & USART_SR_IDLE)
   {
      USART1->DR;
      //如果IDLE=1,表示检测到空闲帧,字符串接收完毕
      USART_SendString(buff,size);
      size=0;
   }
   
}

usart.h

#ifndef __USART_H
#define __USART_H
#include "string.h"
#include "stm32f10x.h"
//初始化
void USART_Init(void);

//发送一个字符
void USART_SendChar(uint8_t ch);


//发送一个字符串,数组可以用指针表示,形参就是数组和字长
void USART_SendString(char *str,uint8_t size);


#endif

 

我们可以将接收字符串的标志位在外面定义出来。

 

4.串口案例一串口通讯_hal库轮询方式

我们有usart1配置。

我们反正还得需要配,这个时候我们可以不管他,直接去左边框栏中点点点。图形化配置的精髓就是方便。

还是调用hal库简单。

轮询方式使用效率不是很高,中断方式才高。

5.HAL库中断方式—定长数据接收

记住USART1用异步模式,要打开中断实现

中断方式要和回调函数结合。

接收定长数据,会和之前接收的数据结合分析

6.HAL库中断方式--变长数据接收

接收变长数据,size是可接收的字长上限。

她的回调不一样,是下面这个。在函数面前加void,我忘了加,编译出错。

先检查是什么模块

7.重定向printf—寄存器方式

用printf输出调试信息,打印到屏幕,没有屏幕也可重定向printf,把数据打印到串口,从而在电脑端接收调试信息,这是一种有效调试手段。

printf大法对任何语言都是有用的。

printf的底层函数:fputc

把字符一个个发到控制台文件里。 

重写也在usart.c里,记得引入<stdio.h>

8.重定向——hal

usart.c里

在main函数来随便打印。

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

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

相关文章

问题处理——在ROS2(humble)+Gazebo+rqt下,无法显示仿真无人机的相机图像

文章目录 前言一、问题展示二、解决方法&#xff1a;1.下载对应版本的PX42.下载对应版本的Gazebo3.启动 总结 前言 在ROS2的环境下&#xff0c;进行无人机仿真的过程中&#xff0c;有时需要调取无人机的相机图像信息&#xff0c;但是使用rqt&#xff0c;却发现相机图像无法显示…

朱老师,3518e系列,第六季

第一节&#xff1a;概述。 首先是 将 他写好的 rtsp 源码上传&#xff0c;用于分析。 已经拷贝完。 第二节&#xff1a; h264 编码概念。 编解码 可以用cpu, 也可以用 bsp cpu 编解码的效果不好。做控制比较好。 h264 由 VCL&#xff0c; NAL 组成。 NAL 关心的是 压缩…

ElasticSearch-集群

本篇文章依据ElasticSearch权威指南进行实操和记录 1&#xff0c;空集群 即不包含任何节点的集群 集群大多数分为两类&#xff0c;主节点和数据节点 主节点 职责&#xff1a;主节点负责管理集群的状态&#xff0c;例如分配分片、添加和删除节点、监控节点故障等。它们不直接…

一文掌握工业相机选型计算

目录 一、基本概念 1.1 物方和像方 1.2 工作距离和视场 1.3 放大倍率 1.4 相机芯片尺寸 二、公式计算 三、实例应用 一、基本概念 1.1 物方和像方 在光学领域&#xff0c;物方&#xff08;Object Space&#xff09;是与像方&#xff08;Image Space&#xff09;相对的…

LabVIEW机械振动信号分析与故障诊断

利用 LabVIEW 开发机械振动信号分析与故障诊断系统&#xff0c;融合小波变换、时频分布、高阶统计量&#xff08;双谱&#xff09;等先进信号处理技术&#xff0c;实现对齿轮、发动机等机械部件的非平稳非高斯振动信号的特征提取与故障诊断。系统通过虚拟仪器技术将理论算法转化…

【Spring】Spring中的适配器模式

欢迎来到啾啾的博客&#x1f431;。 记录学习点滴。分享工作思考和实用技巧&#xff0c;偶尔也分享一些杂谈&#x1f4ac;。 欢迎评论交流&#xff0c;感谢您的阅读&#x1f604;。 目录 适配器模式Spring MVC的适配器模式 适配器模式 适配器模式&#xff08;Adapter Pattern&a…

2、ubuntu系统配置OpenSSH | 使用vscode或pycharm远程连接

1、OpenSSH介绍 OpenSSH&#xff08;Open Secure Shell&#xff09;是一套基于SSH协议的开源工具&#xff0c;用于在计算机网络中提供安全的加密通信。它被广泛用于远程系统管理、文件传输和网络服务的安全隧道搭建&#xff0c;是保护网络通信免受窃听和攻击的重要工具。 1.1…

RPC与SOAP的区别

一.RPC&#xff08;远程过程调用&#xff09;和SOAP&#xff08;简单对象访问协议&#xff09;均用于实现分布式系统中的远程通信&#xff0c;但两者在设计理念、协议实现及应用场景上存在显著差异。 二.对比 1.设计理念 2.协议规范 3.技术特性 4.典型应用场景 5.总结 三.总结…

Day11-苍穹外卖(数据统计篇)

前言&#xff1a; 今天写day11的内容&#xff0c;主要讲了四个统计接口的制作。看起来内容较多&#xff0c;其实代码逻辑都是相似的&#xff0c;这里我们过一遍。 今日所学&#xff1a; Apache ECharts营业额统计用户统计订单统计销量排行统计 1. Apache ECharts 1.1 介绍 A…

Tomcat简述介绍

文章目录 Web服务器Tomcat的作用Tomcat分析目录结构 Web服务器 Web服务器的作用是接收客户端的请求&#xff0c;给客户端作出响应。 知名Java Web服务器 Tomcat&#xff08;Apache&#xff09;&#xff1a;用来开发学习使用&#xff1b;免费&#xff0c;开源JBoss&#xff0…

《从零开始:Spring Cloud Eureka 配置与服务注册全流程》​

关于Eureka的学习&#xff0c;主要学习如何搭建Eureka&#xff0c;将order-service和product-service都注册到Eureka。 1.为什么使用Eureka? 我在实现一个查询订单功能时&#xff0c;希望可以根据订单中productId去获取对应商品的详细信息&#xff0c;但是产品服务和订单服…

FPGA学习知识(汇总)

1. wire与reg理解&#xff0c;阻塞与非阻塞 2. 时序取值&#xff0c;时钟触发沿向左看 3. ip核/setup debug 添加 ila 一、ila使用小技巧 二、同步复位、异步复位和异步复位同步释放 设计复位设计&#xff0c;尽量使用 异步复位同步释放&#xff1b;尽管该方法仍然对毛刺敏感…

Redisson分布式锁-锁的可重入、可重试、WatchDog超时续约、multLock联锁(一文全讲透,超详细!!!)

本文涉及到使用Redis实现基础分布式锁以及Lua脚本的内容&#xff0c;如有需要可以先参考博主的上一篇文章&#xff1a;Redis实现-优惠卷秒杀(基础版本) 一、功能介绍 (1)前面分布式锁存在的问题 在JDK当中就存在一种可重入锁ReentrantLock&#xff0c;可重入指的是在同一线…

语言模型:AM-Thinking-v1 能和大参数语言模型媲美的 32B 单卡推理模型

介绍 a-m-team 是北科 &#xff08;Ke.com&#xff09; 的一个内部团队&#xff0c;致力于探索 AGI 技术。这是一个专注于增强推理能力的 32B 密集语言模型。 a-m-team / AM-Thinking-v1 是其旗下的一个语言模型&#xff0c;采用低成本的方式能实现和大参数模型媲美。 DeepSe…

ChatGPT:OpenAI Codex—一款基于云的软件工程 AI 代理,赋能 ChatGPT,革新软件开发模式

ChatGPT&#xff1a;OpenAI Codex—一款基于云的软件工程 AI 代理&#xff0c;赋能 ChatGPT&#xff0c;革新软件开发模式 导读&#xff1a;2025年5月16日&#xff0c;OpenAI 发布了 Codex&#xff0c;一个基于云的软件工程 AI 代理&#xff0c;它集成在 ChatGPT 中&#xff0c…

智能视觉检测技术:制造业质量管控的“隐形守护者”

在工业4.0浪潮的推动下&#xff0c;制造业正经历一场以智能化为核心的变革。传统人工质检模式因效率低、误差率高、成本高昂等问题&#xff0c;逐渐难以满足现代生产对高精度、高速度的需求。智能视觉检测技术作为人工智能与机器视觉融合的产物&#xff0c;正成为制造业质量管控…

利用html制作简历网页和求职信息网页

前言 大家好&#xff0c;我是maybe。今天下午初步学习了html的基础知识。做了两个小网页&#xff0c;一个网页是简历网页&#xff0c;一个网页是求职信息填写网页。跟大家分享一波~ 说明:我不打算上传图片。所以如果有朋友按照我的代码运行网页&#xff0c;会出现一个没有图片…

卷积神经网络进阶:转置卷积与棋盘效应详解

【内容摘要】 本文深入解析卷积神经网络中的转置卷积&#xff08;反卷积&#xff09;技术&#xff0c;重点阐述标准卷积与转置卷积的计算过程、转置卷积的上采样作用&#xff0c;以及其常见问题——棋盘效应的产生原因与解决方法&#xff0c;为图像分割、超分辨率等任务提供理论…

2025年5月13日第一轮

1.百词斩 2.安全状态和死锁 3.银行家算法和状态图 4.Vue运行 5.英语听力 6.词汇 7.英语 长篇:数学竞赛 8.数学 间断点类型和数量 The rapid development of artificial intelligence has led to widerspareasd concreasns about job displacemant.As AI technology conti…

小结:Android系统架构

https://developer.android.com/topic/architecture?hlzh-cn Android系统的架构&#xff0c;分为四个主要层次&#xff1a;应用程序层、应用框架层、库和运行时层以及Linux内核层。&#xff1a; 1. 应用程序层&#xff08;Applications&#xff09; 功能&#xff1a;这一层包…