USART的PAL库编程

news2025/1/13 15:41:36

USART驱动的工作原理

在这里插入图片描述
总结一下我们之前使用中断的方式来进行数据的发送和接收 如果收到数据数据在RDR寄存器中 RXNE标志位就从0到1触发中断 进入中断服务函数 把数据缓存在队列中 然后在到进程函数中断接收数据函数中进行出队处理
发送数据就是把中断关闭(标志位TXE的寄存器TDR为空的时候为1会误触发中断所以要关闭)要发送的数据进行入队然后打开中断 IDR寄存器中还是没数据
然后标志位TXE为1触发中断 进入中断服务函数把数据出队 逐个发送

USART驱动的具体使用方法

驱动概述
在这里插入图片描述
PAL库初始化USART
在这里插入图片描述
因为数据发送和数据的接收都是共同用一个中断源
所以只需要设置一个优先级分组和子优先级和抢占优先级
发送缓冲区和接收缓冲区
在这里插入图片描述
因为我们是使用中断的方式发送和接收数据的 PAL库中 所以要把数据缓存在队列中也就是缓冲区 但是这个队列不能太长因为队列占用的是RAM 芯片的RAM收到限制
PAL库函数的初始化

	hUSART1.Init.USARTx = USART1;
	hUSART1.Init.BaudRate = 9600;
	hUSART1.Init.USART_WordLength = USART_WordLength_8b;
	hUSART1.Init.USART_StopBits = USART_StopBits_1;
	hUSART1.Init.USART_Parity = USART_Parity_No;
	hUSART1.Init.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
	hUSART1.Init.USART_IRQ_PreemptionPriority = 0;
	hUSART1.Init.USART_IRQ_SubPriority = 0;
	hUSART1.Init.TxBufferSize = 128;//缓冲区的长度
	hUSART1.Init.RxBufferSize = 128;//缓冲区的长度
	hUSART1.Init.Advanced.Remap = 1;//启用复用功能 AFIO
	hUSART1.Init.Advanced.LineSeparator = LineSeparator_CRLF; // \r\n
	PAL_USART_Init(&hUSART1);

编写PAL库的中断服务函数
在这里插入图片描述
具体代码

void USART1_IRQHandler(void)
{
	PAL_USART_IRQHandler(&hUSART1);
}

数据的发送
在这里插入图片描述
数据的接收
在这里插入图片描述
time out (超时值)在这里插入图片描述如果在调用这个函数接口 对应传入的的TIME out值就如上图所示
数据的接收
在这里插入图片描述

PAL_USART_ReadLine 在使用这个函数接口之前先要设置行分隔符的方式 行分隔符就是\r \r\n 等多种分隔行 在初始化的时候调用高级参数
在这里插入图片描述
char strBuffer[64];设置为64即可

#include "stm32f10x.h"
#include "stm32f10x_pal.h"
#include "stm32f10x_pal_usart.h"

static PalUSART_HandleTypeDef hUSART1;//声明句柄



int main(void)
{
	PAL_Init();
	
	hUSART1.Init.USARTx = USART1;
	hUSART1.Init.BaudRate = 9600;
	hUSART1.Init.USART_WordLength = USART_WordLength_8b;
	hUSART1.Init.USART_StopBits = USART_StopBits_1;
	hUSART1.Init.USART_Parity = USART_Parity_No;
	hUSART1.Init.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
	hUSART1.Init.USART_IRQ_PreemptionPriority = 0;
	hUSART1.Init.USART_IRQ_SubPriority = 0;
	hUSART1.Init.TxBufferSize = 128;//缓冲区的长度
	hUSART1.Init.RxBufferSize = 128;//缓冲区的长度
	hUSART1.Init.Advanced.Remap = 1;//启用复用功能 AFIO
	hUSART1.Init.Advanced.LineSeparator = LineSeparator_CRLF; // \r\n
	PAL_USART_Init(&hUSART1);
	
	
	
	
	//	// 1. 发送单个字节 0x5a
//	PAL_USART_SendByte(&hUSART1, 0x5a);
	
//	// 2. 发送字节数组 01 02 03 04 05
//	const uint8_t a[] = {1,2,3,4,5};
//	
//	PAL_USART_SendBytes(&hUSART1, a, sizeof(a)/sizeof(uint8_t));

//  // 3. 发送单个字符 H
//	PAL_USART_PutChar(&hUSART1, 'H');

//  // 4. 发送字符串Hello world\r\n
//	PAL_USART_SendString(&hUSART1, "Hello world\r\n");
  
//	// 5. 发送格式化字符串
//	const char *name = "Tom";
//	uint32_t age = 18;
//	float height = 173.5;
//	
//	PAL_USART_Printf(&hUSART1, "\r\nName:%s\r\nAge:%d\r\nHeight:%.1fcm\r\n", name, age, height);
//	

//  // 1. 接收单个字节
//	PAL_USART_SendString(&hUSART1, "Receive single byte...");
//	uint8_t byteRcvd;
//	byteRcvd = PAL_USART_ReceiveByte(&hUSART1, PAL_MAX_DELAY);
//	PAL_USART_Printf(&hUSART1, "Byte received: 0x%02x\r\n", byteRcvd);

//  // 2. 接收5个字节
//	PAL_USART_SendString(&hUSART1, "Receive 5 bytes ...");
//	
//	uint8_t a[5];
//	PAL_USART_ReceiveBytes(&hUSART1, a, 5, PAL_MAX_DELAY);
//	
//	PAL_USART_Printf(&hUSART1, "5 bytes received: %02x %02x %02x %02x %02x", a[0], a[1], a[2], a[3], a[4]);

  // 3. 接收一行字符串
	PAL_USART_SendString(&hUSART1, "Receive a line ...\r\n");
	char strBuffer[64];
	PAL_USART_ReadLine(&hUSART1, strBuffer, sizeof(strBuffer) / sizeof(char), PAL_MAX_DELAY);
	
	PAL_USART_Printf(&hUSART1, "Line received: %s\r\n", strBuffer);
	
	
	while(1)
	{
	}
}

void USART1_IRQHandler(void)
{
	PAL_USART_IRQHandler(&hUSART1);
}

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

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

相关文章

《Junit单元测试》

目录 SpringBoot2.2.0版本之前的单元测试模式 SpringBoot2.2.0版本之后的单元测试模式 SpringBoot2.4以上版本移除了默认对Vintage的依赖 SpringBoot2.2.0版本之前的单元测试模式 SpringBooot 2.2.0 版本开始引入Junit5作为单元测试默认库,之前的版本是使用Junit…

线程...

文章目录 1.Linux中线程该如何理解2.重新定义线程 和 进程3.重谈地址空间 --- 第四讲4.Linux线程周边的概念 线程:是进程内的一个执行分支。线程的执行粒度,要比进程要细 很多教材喜欢这么说,这只是一个线程的特征之一,来解释线程。 1.Linux中线程该如何…

力扣 --- 最后一个单词的长度

题目描述: 给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 示例 1: 输入:s "Hello World&…

GEE:Sobel算子卷积和Roberts算子卷积对比

作者:CSDN @ _养乐多_ 本文介绍了Sobel算子卷积和Roberts算子卷积操作的代码,并进行了图像对比,可以观察到两个算子的细微差异。 文章目录 一、Sobel算子和Roberts算子对比二、完整代码三、代码链接一、Sobel算子和Roberts算子对比 详细介绍介绍参考《遥感数字图像处理教程…

计算机导论——第39章 文件和目录

除了虚拟化CPU和内存,另外一个是持久存储,永久存储信息。持久存储设备与内存不同,内存在断电时内容会丢失,而持久存储设备会保持这些数据不变。 1. 文件和目录 文件就是一个线性字节数组,每个字节都可以读取或者写入…

DBS note7 (end):DB Design

目录 一、前言 二、引言 三、Entity-Relationship Models(实体-关系模型) 1、关系约束 三、函数依赖和正则化 1、BCNF分解 2、无损分解 3、依赖关系保留分解 一、前言 略读过一遍CS186,对于CS186来说,绝对不止这 7 篇笔记…

windows 你的电脑不能投影到其他屏幕,请尝试重新安装驱动程序

注意 千万不要去下载什么驱动精灵,太垃圾不好用还一堆附带的软件。按以下步骤进行解决: 解决方法 可能是显卡驱动的问题,我的笔记本按照如下步骤重启一下驱动后解决了,步骤如下: 右键点击桌面的开始菜单,选择”设备…

算法通关村第十六关-白银挑战滑动窗口经典题目

大家好我是苏麟 , 今天带来滑动窗口经典的一些题目 . 我们继续来研究一些热门的、高频的滑动窗口问题 大纲 最长子串专题无重复字符的最长子串 长度最小的子数组盛最多水的容器 最长子串专题 无重复字符的最长子串 描述 : 给定一个字符串 s ,请你找出其中不含有重…

React如何像Vue一样将css和js写在同一文件

如果想在React中想要像Vue一样把css和js写到一个文件中,可以使用CSS-in-JS。 使用CSS-in-JS 下载 npm i styled-components使用 就像写scss一样,不过需要声明元素的类型 基本语法及展示如下, import styled from "styled-component…

React使报错不再白屏

如果代码中出现问题导致报错&#xff0c;通常会使页面报错&#xff0c;导致白屏 function Head() {// 此时模拟报错导致的白屏return <div>Head --- {content}</div> } export default () > {return (<><div>下面是标题</div><Head />…

Swing程序设计(7)JPane面板,滑动面板

文章目录 前言一、JPane面板&#xff0c;滑动面板是什么&#xff1f;二、实操展示 1.JPane面板2.JScrollPane面板总结 前言 该篇博客介绍Java的Swing程序中JPane面板以及&#xff0c;滑动面板的使用。面板的使用&#xff0c;各个组件在不同的面板上被不同地摆放&#xff0c;让插…

MATLAB Simulink +STM32硬件在环 (HIL)实现例程测试

MATLAB Simulink STM32硬件在环 &#xff08;HIL&#xff09;实现例程测试 &#x1f4cd;相关篇《STM32CubeMxMATLAB Simulink点灯程序》✨本例程没有使用到STM32CubeMX来创建工程&#xff08;在Simulink 中不是选择的STM32xxxbased类型的&#xff09;。 &#x1f516;STM32xxx…

Github无法打开

文章目录 一、问题二、解决2.1、科学上网&#xff08;使用中&#xff09;2.2、使用代理&#xff08;不稳定&#xff09;2.3、修改hosts&#xff08;得更新&#xff09;2.3.1、找到hosts文件2.3.2、复制hosts文件2.3.3、添加记录2.3.4、替换原来的hosts文件2.3.5、成功访问Githu…

W2311294-万宾科技可燃气体监测仪怎么进行数据监测

万宾科技可燃气体监测仪怎么进行数据监测 燃气是现代城市之中重要的能源&#xff0c;它已经渗透到城市生活的方方面面&#xff0c;对燃气管网的管理也在考验着政府人员的工作能力。燃气管网的安全运行和城市的安全和人民的生活直接挂钩。为了及时掌握燃气管网的运行状态&#x…

2023年GopherChina大会-核心PPT资料下载

一、峰会简介 自 Go 语言诞生以来&#xff0c;中国便是其应用最早和最广的国家之一&#xff0c;根据 Jetbrains 在 2021 年初做的调查报告&#xff0c;总体来说目前大概有 110 万专业的开发者 选择 Go 作为其主要开发语言。就其全球分布而言, 居住在亚洲的开发者最多&#xff…

了解大模型 RAG (Retrieval-Augmented Generation):大模型外挂知识库 (检索增强技术)

本心、输入输出、结果 文章目录 了解大模型 RAG &#xff08;Retrieval-Augmented Generation&#xff09;&#xff1a;大模型外挂知识库 &#xff08;检索增强技术&#xff09;前言什么是检索增强技术 RAG &#xff08;Retrieval-Augmented Generation&#xff09;检索增强技术…

RocketMQ领域模型详解

1、主题&#xff08;Topic&#xff09; 1.1、定义​ 主题是 Apache RocketMQ 中消息传输和存储的顶层容器&#xff0c;用于标识同一类业务逻辑的消息。 主题的作用主要如下&#xff1a; 定义数据的分类隔离&#xff1a; 在 Apache RocketMQ 的方案设计中&#xff0c;建议将不同…

【STM32】STM32学习笔记-STM32简介(02)

00. 目录 文章目录 00. 目录01. STM32简介1.1 STM32是什么1.2 STM32应用领域1.3 STM32命名规则1.4 STM32选型 02. ARM简介2.1 ARM是什么2.2 ARM系列 03. STM32开发板3.1 MCU简介3.2 STM32开发板3.3 STM32硬件资源 04. STM32系统架构05. STM32引脚定义06. STM32启动配置07. STM3…

python爬虫AES魔改案例:某音乐素材下载网

声明&#xff1a; 该文章为学习使用&#xff0c;严禁用于商业用途和非法用途&#xff0c;违者后果自负&#xff0c;由此产生的一切后果均与作者无关 一、找出需要加密的参数 js运行 atob(‘aHR0cHM6Ly93d3cuYWlnZWkuY29tL3NvdW5kL2NsYXNzLw’) 拿到网址&#xff0c;F12打开调…

类 —— 多态、抽象类

多态 通常说的多态&#xff0c;是指发生在类之间的多态。即相同的代码&#xff0c;实现不同的功能。 函数重载 —— 静态多态/编译时多态。 类之间的多态 —— 动态多态/运行时多态。 前提 继承、虚函数、函数重写。 函数重写&#xff08;override&#xff09; 在子类中重…