3.7号freeRtoS

1. 串口通信

配置串口为异步通信

设置波特率,数据位,校验位,停止位,数据的方向

同步通信

在同步通信中,数据的传输是在发送端和接收端之间通过一个共享的时钟信号进行同步的。这意味着发送端和接收端的时钟需要保持同步,以确保数据在正确的时间传输。在同步通信中,数据被划分成等长的块,并且在每个时钟周期内传输一个完整的数据块。因此,发送方和接收方需要严格按照时钟信号的节奏进行数据的发送和接收。

异步通信

在异步通信中,数据的传输是通过一组起始和停止信号来确定的,而不是通过共享的时钟信号。每个数据块都有一个起始位和一个或多个停止位,用于确定数据的开始和结束。异步通信中,发送端和接收端的时钟不需要保持同步,因此可以更灵活地处理速度不同步的情况。

区别

时钟同步:在同步通信中,发送端和接收端需要共享一个时钟信号以同步数据传输;而在异步通信中,时钟信号不是必需的,数据的传输通过起始和停止信号来确定。

速度区别:

同步通信速度:同步通信的速度受制于时钟信号的频率,因为数据的传输是根据时钟信号进行同步的。发送端和接收端需要以相同的时钟频率进行数据传输,因此速度受限于这一频率。

异步通信速度:相比之下,异步通信的速度没有受到严格的时钟同步的限制。由于数据的传输是通过起始和停止信号来确定的,因此发送端和接收端可以以不同的速度进行数据传输。这意味着异步通信可以更灵活地处理速度不同步的情况,因此在某些情况下可能会比同步通信更快。

灵活性:由于不需要时钟同步,异步通信更灵活,能够处理速度不同步的情况;而同步通信需要发送端和接收端保持严格的时钟同步,因此在处理速度不同步的情况下可能会出现问题。

串口发送数据

函数:

UART:串口异步发送(A:异步)

USART:串口的同步和异步发送(S:同步)

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout)

UART_HandleTypeDef *huart:指定要使用的串口

const uint8_t *pData:要发送的数据(typedef unsigned char uint8_t;)

uint16_t Size:要发送数据的大小

uint32_t Timeout:超时时间,单位是ms,1000ms

HAL_StatusTypeDef:数据是否成功发送

串口重定向

串口重定向就是将串口的功能重新定向到标准输入或者是标准输出当中。

在stm32cube中配置

在usart.c中包含头文件,并编写函数

//重新实现fputc的功能
int fputc(int ch, FILE* f)
{
    HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 1000);
    return ch;
}

调用printf会调用到fputc,所以我们只需要将fputc重新实现就可以实现使用printf来向电脑打印数据的功能。

串口接收数据

打开串口接收中断

当接收到数据后就会调用到接收中断回调函数

HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

UART_HandleTypeDef *huart:指定要接收数据的串口

uint8_t *pData:数据缓冲区用来保存数据

uint16_t Size:每次要接收多少字节数据

HAL_StatusTypeDef:是否成功打开接收中断

串口接收中断回调函数:

__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

{

}

注意事项:每次接收完数据后都需要重新打开接收中断。

2. DMA

在嵌入式系统中,DMA(Direct Memory Access,直接内存访问)也是一种重要的技术,用于实现外部设备和系统内存之间的高效数据传输,从而减轻CPU的负担,提高系统性能。在嵌入式系统中,由于资源有限、对功耗和性能要求较高,因此DMA技术显得尤为重要。通过DMA技术,嵌入式系统可以更高效地进行数据传输和处理,从而满足各种应用场景的需求。

DMA的优点:

1.使用DMA可以减轻CPU负担提高系统的运行效率

2.使用DMA可以快速传输数据(像音频,视频等数据量较大的数据)

配置DMA传输数据

传输函数

HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size)

注意:不需要超时时间了,因为CPU得到了释放,不需要一直等待将数据发送完成,这个工作交给了DMA

空闲中断+DMA处理不定长数据

CPU不知道外部什么时候会发来数据,可以开启DMA接收,让DMA一直监测是否有数据,当有数据并且接收完一包数据就产生空闲中断处理数据。

开启DMA接收

以DMA+空闲中断的方式接收数据的函数

HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

UART_HandleTypeDef *huart:指定从哪个串口接收数据

uint8_t *pData:数据保存的缓冲区

uint16_t Size:要接收数据的大小

HAL_StatusTypeDef:是否成功开启

空闲中断回调函数

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)

{

}

3. ADC采样

ADC是一种将模拟信号转换为数字信号的一种器件或者是电路。

STM32Cubemx配置ADC采样

开启ADC采样函数

HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc)

HAL_StatusTypeDef:是否成功打开

ADC_HandleTypeDef* hadc:指定要打开哪个ADC

获取采样数值

uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef* hadc)

ADC_HandleTypeDef* hadc:要对哪个ADC进行采样

uint32_t:代表采样到的数据

4. PWM

PWM是脉宽调制(Pulse Width Modulation)的缩写。它是一种通过控制信号的脉冲宽度来产生模拟效果的技术。PWM信号由一系列周期性的脉冲组成,每个脉冲的宽度可以调整,从而改变其平均功率或能量。

PWM信号常用于控制电机速度、LED亮度调节、音频信号合成等应用中。例如,在电机驱动器中,通过调整PWM信号的脉冲宽度,可以控制电机的转速;在LED调光控制中,通过调整PWM信号的脉冲宽度,可以实现LED的亮度调节。

打开定时器的PWM通道

函数

HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel)

TIM_HandleTypeDef *htim:指定要打开的定时器

uint32_t Channel:指定要打开的通道

HAL_StatusTypeDef:是否打开成功

作业

1.

2.

在stmcubemx开启DMA接收

使用函数HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)以空闲中断的方式接收数据

在回调函数void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)中编写功能代码,此时当接收数据后搁一段时间没有数据继续出现,则执行回调函数。

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

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

相关文章

视频编解码技术介绍 - 基本概念篇

第一章 视频编解码技术介绍 - 基本概念篇 文章目录 前言1. 我的疑问1.1 什么是视频编解码技术1.2 为什么会有视频编解码技术1.3 视频编解码中有哪些核心技术1.4 作为开发者需要重点了解视频编解码中的哪些技术 2. 视频编解码的历史3. 基本概念3.1 像素3.2 分辨率3.3 ppi(像素密…

CorelDRAW下载2024最新版专业的平面设计软件,专注于矢量图形编辑与排版

CorelDRAW是一款功能强大的矢量图形设计软件,广泛应用于标志设计、插画绘制、排版印刷、VI设计、包装设计、网页制作等众多领域。它提供了丰富的绘图工具和特效,使用户能够轻松地创建和编辑复杂的矢量图形。CorelDRAW还支持导入和导出多种文件格式&#…

RabbitMQ 安装使用

文章目录 RabbitMQ 安装使用安装下载 Erlang下载 RabbitMQ 的服务安装好后看是否有 RabbitMQ 的服务开启管理 UIRabbitMQ 端口使用一览图 使用输出最简单的 Hello World!生产者定义消费者消费消息小拓展 RabbitMQ 安装使用 安装 下载 Erlang RabbitMQ 是用这个语…

【机器学习300问】30、准确率的局限性在哪里?

一、什么是准确率? 在解答这个问题之前,我们首先得先回顾一下准确率的定义,准确率是机器学习分类问题中一个很直观的指标,它告诉我们模型正确预测的比例,即 还是用我最喜欢的方式,举例子来解释一下&#xf…

倒计时35天

dp预备(来源:b站acm刘春英老师) 1. 2. 3. 4. 5. 6. 7.

13:大数据与Hadoop|分布式文件系统|分布式Hadoop集群

大数据与Hadoop|分布式文件系统|分布式Hadoop集群 Hadoop部署Hadoop HDFS分布式文件系统HDFS部署步骤一:环境准备HDFS配置文件 查官方手册配置Hadoop集群 日志与排错 mapreduce 分布式离线计算框架YARN集群资源管理系统步骤一:安装…

spring boot 集成 mysql ,mybatisplus多数据源

1、需要的依赖&#xff0c;版本自行控制 <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId> </dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java<…

初阶数据结构之---二叉树的顺序结构-堆

引言 今天要讲的堆&#xff0c;不是操作系统虚拟进程地址空间中&#xff08;malloc&#xff0c;realloc等开空间的位置&#xff09;的那个堆&#xff0c;而是数据结构中的堆&#xff0c;它们虽然名字相同&#xff0c;却是截然不同的两个概念。堆的底层其实是完全二叉树&#x…

【spark operator】spark operator动态分配executor

背景&#xff1a; 之前在使用spark operator的时候必须指定executor的个数&#xff0c;在将任务发布到spark operator后&#xff0c;k8s会根据指定的个数启动executor&#xff0c;但是对于某些spark sql可能并不需要用到那么多executor&#xff0c;在此时executor的数量就不好…

Python快速入门系列-1

Python快速入门系列 第一章: Python简介1.1 Python的历史与发展1.2 Python的优势与特点1.2.1 易学易用1.2.2 动态类型1.2.3 丰富的标准库与第三方库1.2.4 面向对象与函数式编程1.2.5 广泛应用领域 1.3 Python的应用领域 第一章: Python简介 1.1 Python的历史与发展 Python是一…

sizeof和strlen的详细万字解读

sizeof和strlen的对比 sizeof不是函数 侧面证明sizeof不是函数 如果是函数 应该需要有括号 不能落下来 strlen 只针对字符串 包含头文件 string.h 并且这个是个函数 随机数值 sizeof里面有表达式的话 表达式里面是不参与计算的 下面的s求出的是4 就是因为是不参与计算的 不…

AI绘画StableDiffusion实操教程:冰霜旗袍美女

前几天分享了StableDiffusion的入门到精通教程&#xff1a;AI绘画&#xff1a;Stable Diffusion 终极炼丹宝典&#xff1a;从入门到精通 但是还有人就问&#xff1a;安装是安装好了&#xff0c;可是为什么生成的图片和你生成的图片差距那么远呢&#xff1f; 怎么真实感和质感…

pytorch CV入门3-预训练模型与迁移学习

专栏链接&#xff1a;https://blog.csdn.net/qq_33345365/category_12578430.html 初次编辑&#xff1a;2024/3/7&#xff1b;最后编辑&#xff1a;2024/3/8 参考网站-微软教程&#xff1a;https://learn.microsoft.com/en-us/training/modules/intro-computer-vision-pytorc…

GitHub会员充值

GitHub是一个基于Web的代码托管平台&#xff0c;为开发者提供了协作、版本控制和代码管理的工具。它允许个人和团队共同协作开发软件项目&#xff0c;并提供了许多功能&#xff0c;使得代码的管理和维护更加容易 版本控制系统&#xff1a; GitHub使用Git作为其版本控制系统。Gi…

基于Springboot的高校宣讲会管理系统。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的高校宣讲会管理系统。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Spri…

基于Java的开放实验室管理系统(Vue.js+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 实验室类型模块2.2 实验室模块2.3 实验管理模块2.4 实验设备模块2.5 实验订单模块 三、系统设计3.1 用例设计3.2 数据库设计 四、系统展示五、样例代码5.1 查询实验室设备5.2 实验放号5.3 实验预定 六、免责说明 一、摘…

Charles抓包工具使用

Charles简介 Charles是一款基于HTTP协议的代理服务器和HTTP监视器&#xff0c;通过将自己设置为电脑或浏览器的网络访问代理&#xff0c;能够截取请求和请求结果&#xff0c;从而达到分析抓包的目的。它允许开发者查看所有连接互联网的HTTP通信&#xff0c;包括请求、响应和HTT…

人工智能|机器学习——Canopy聚类算法(密度聚类)

1.简介 Canopy聚类算法是一个将对象分组到类的简单、快速、精确地方法。每个对象用多维特征空间里的一个点来表示。这个算法使用一个快速近似距离度量和两个距离阈值T1 > T2 处理。 Canopy聚类很少单独使用&#xff0c; 一般是作为k-means前不知道要指定k为何值的时候&#…

专题一 - 双指针 - leetcode 202. 快乐数 | 简单难度

leetcode 202. 快乐数 leetcode 202. 快乐数 | 简单难度1. 题目详情1. 原题链接2. 基础框架 2. 解题思路1. 题目分析2. 算法原理3. 时间复杂度 3. 代码实现4. 知识与收获 leetcode 202. 快乐数 | 简单难度 1. 题目详情 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」…

简单BFF架构设计

又到周五了有了一个小时的闲暇时间简单写点东西&#xff0c;介绍一个简单的BFF的架构。BFF:Backends For Frontends,其实现在是个比较常见的前端架构设计的方案&#xff0c;其最大的优势便在于前端可以高度自由的在Node层做一些server端才可以做的东西&#xff0c;比如SSR、登录…