USART的PAL库编程

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);
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

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

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

某60区块链安全之Create2实战二学习记录

区块链安全 文章目录 区块链安全Create2实战二实验目的实验环境实验工具实验原理实验内容Create2实战二 实验步骤Create2实战二 实验目的 学会使用python3的web3模块 学会分析以太坊智能合约中的伪随机数问题 学会利用Create2可在同一地址部署不同合约特性解决伪随机数问题 找…

【Docker实操】创建一个Node服务

一、安装node 请查看阿里云官网教程:如何快速部署Node.js项目。(注意要在根目录操作)apt install nodejs、apt install npm执行上面两个命名来安装 安装完成后,执行node -v、npm -v,如果出现版本,就是安装…

排序算法介绍(四)快速排序

0. 简介 快速排序(Quick Sort)是一种高效的排序算法,采用了分治的思想。它选择一个基准元素,通过一趟排序将待排序序列分割成独立的两部分,其中一部分的所有元素都比基准元素小,另一部分的所有元素都比基准…

【ArcGIS Pro微课1000例】0044:深度学习--面部模糊(马赛克)

本文讲解ArcGIS Pro中通过深度学习工具实现人脸面部模糊,起到马赛克的作用。 文章目录 一、效果对比二、工具介绍三、案例实现一、效果对比 原始图片: 深度学习后的模糊照片: 二、工具介绍 本工具为ArcGIS Pro工具箱中的深度学习工具中的:使用深度学习分类像素,如下所示…

彻底解决ModuleNotFoundError: No module named ‘exceptions‘【Bug完美解决】

文章目录 项目场景:问题描述原因分析:解决方案:此Bug解决方案总结心得项目场景: 根据本文可找到bug原因并彻底解决**ModuleNotFoundError: No module named ‘exceptions‘**Bug 报错: E:\Anconda\python.exe c:\Users\24190\PycharmProjects\pythonProject4py尝试 gong…

Linux4.7、环境变量

个人主页:Lei宝啊 愿所有美好如期而遇 目录 基本概念 见见环境变量 指令原理 常见环境变量及其测试 环境变量相关指令 环境变量组织方式 通过代码获取环境变量 通过系统变量获取环境变量以及设置环境变量 环境变量的全局属性 基本概念 首先,…

【Vulnhub 靶场】【Momentum: 2】【简单】【20210628】

1、环境介绍 靶场介绍:https://www.vulnhub.com/entry/momentum-2,702/ 靶场下载:https://download.vulnhub.com/momentum/Momentum2.ova 靶场难度:简单 发布日期:2021年06月28日 文件大小:698 MB 靶场作者&#xff1…

TeXworks 初次使用 debug方法

下载Texlive,打开TeXworks editor 编译排版,可能会报很多错: 1. ! Fatal Package fontspec Error: The fontspec package requires either XeTeX or (fontspec) LuaTeX. (fontspec) (fontspec) …

【数据结构】二叉树遍历的非递归实现

前言: 本文使用栈以非递归的形式遍历整颗二叉树,我是通过数组模拟栈来实现的,如果对用数组模拟栈不太熟悉,你可以直接使用Stack类作为栈实现。 前序(先序)遍历: 要求:二叉树节点的打印顺序为:中…

山西电力市场日前价格预测【2023-12-04】

日前价格预测 预测说明: 如上图所示,预测明日(2023-12-04)山西电力市场全天平均日前电价为179.48元/MWh。其中,最高日前电价为362.01元/MWh,预计出现在18:00。最低日前电价为0.00元/MWh,预计出…

Leetcode1094. 拼车

Every day a Leetcode 题目来源:1094. 拼车 解法1:差分数组 对于本题,设 a[i] 表示车行驶到位置 i 时车上的人数。我们需要判断是否所有 a[i] 都不超过 capacity。 trips[i] 相当于把 a 中下标从 fromi 到 toi−1 的数都增加 numPassenge…

游戏配置表的导入使用

游戏配置表是游戏策划的标配,如下图: 那么程序怎么把把这张配置表导入使用? 1.首先,利用命令行把Excel格式的文件转化成Json格式: json-excel\json-excel json Tables\ Data\copy Data\CharacterDefine.txt ..\Cli…

Siemens-NXUG二次开发-Java开发环境配置[20231203]

Siemens-NXUG二次开发-Java开发环境配置[20231203] 1.NX/UG Java API官方开发文档2.安装Java83.安装jetbrain idea3.windows系统环境变量配置4.使用idea创建项目5.NXOpen Java代码生效流程6.API体系简述6.代码示例 1.NX/UG Java API官方开发文档 西门子NX/UG Java api开发文档…

一款自动帮你生成UI界面和代码的AI神器

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版,欢迎购买。点击进入详情 只要描述你想要的UI是什么样的,它就能帮你生成,是不是很神奇? v0使用 AI 模型根据简单的文本提示生成用户界面和代码&#xff…

U盘不仅能在电脑上使用,在手机上也可使用,包括安卓和苹果手机,但苹果的较特殊

许多最好的安卓手机都使用USB-C端口在电脑上充电和来回传输文件,但如果你需要给老板发电子邮件的文件放在闪存驱动器或全尺寸SD卡上呢? 幸运的是,使用廉价的适配器电缆,你可以将USB加密狗或读卡器直接连接到手机上。你甚至可以直接使用USB-C闪存驱动器,以实现更轻松的过程…

Java基础之数组拷贝

Arrays.copyOf 详解 copyOf是Arrays类下面的一个方法,用于拷贝各种数组 以整型数组为例:int [ ] copyOf(int [ ]array,int newLength);第一个参数是想要拷贝到数组,第二个参数是新拷贝得到的数组的大小(不一定非得和原始数组大小一样&…

深层神经网络(第四周)

这里省略了深层神经网络的前向传播和反向传播,内容和之前相似,不做过多描述。若今后需要,可以再补习。 一、为什么使用深层表示 解决问题时其实并不需要很大的神经网络,但是得有深度,得有比较多的隐藏层。这是为什么…

DBS note7 (end):DB Design

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

SSM项目实战-登录验证成功并路由到首页面,Vue3+Vite+Axios+Element-Plus技术

1、util/request.js import axios from "axios";let request axios.create({baseURL: "http://localhost:8080",timeout: 50000 });export default request 2、api/sysUser.js import request from "../util/request.js";export const login (…