基于stm32的HAL库的串口实现不定长中断(空闲中断)(四)

news2024/11/24 20:41:29

串口实现不定长中断(空闲中断)


目录

串口实现不定长中断(空闲中断)

1、串口头文件

2、串口初始化配置

3、msp公用的一个函数这里有三个串口,都会调用msp先进行一个判断

4、对接收数组进行清空

5、中断服务函数--数据收发

1.空闲中断的触发机制:

6、重定向到串口1中


1、串口头文件

#include "sys.h"

#define UART1_RX_BUF_SIZE 128  //接收
#define UART1_TX_BUF_SIZE 64	 //发送 发送可以小一些看使用的场景

//宏定义错误代码

#define UART_EOK       0 
#define UART_ERROR    1
#define UART_ETIMEOUT 2 //数据超时
#define UART_EINVAL   3 //非法字符
void uart1_init(uint32_t baudrate);
void uart1_receiv_test(void);

uint8_t uart1_rx_buf[UART1_RX_BUF_SIZE];
uint16_t uart1_rx_len = 0;

2、串口初始化配置

UART_HandleTypeDef uart1_handle = {0};

void uart1_init(uint32_t baudrate)
{
    uart1_handle.Instance         =     USART1;             //选择通用异步收发器
    uart1_handle.Init.Baudrate    =     baudrate;           //设置波特率
    uart1_handle.Init.WordLength  =     UART_WORDLENGTH_8B; //字长参数列表用的8位
    uart1_handle.Init.StopBits    =     UART_STOPBITS_1;    //停止位的数量
    uart1_handle.Init.Parity      =     UART_PARITY_NONE;   //奇偶奇偶校验,不过不准确所以不用
    uart1_handle.Init.HwFlowCtl   =     UART_HWCONTROL_NONE;//流控制
    uart1_handle.Init.Mode        =     UART_MODE_TX_RX;    //设置即使要收又要发
    HAL_UART_Init(&uart1_handle);
}

3、msp公用的一个函数这里有三个串口,都会调用msp先进行一个判断

void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
    //由于是公共函数需要判断是哪个串口
    if(huart->Instance == USART1)
    {
    //通用异步收发器使能
    //串口时钟使能
    __HAL_RCC_USART1_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();
    //配置GPIO口
    GPIO_InitTypeDef gpio_initstruct;
    //配置TX
    gpio_initstruct.Pin    = GPIO_PIN_9;          //选择PA9
    gpio_initstruct.Mode   = GPIO_MODE_AF_PP;     //复用推完输出
    gpio_initstruct.Pull   = GPIO_PULLUP;         //上拉
    gpio_initstruct.Speed  = GPIO_SPEED_FREQ_HIGH;//高速模式
    HAL_GPIO_Init(&GPIOA,gpio_initstruct);

    //配置RX
    gpio_initstruct.Pin    = GPIO_PIN_10;         //选择PA9
    gpio_initstruct.Mode   = GPIO_MODE_AF_INPUT;//由数据手册stm32V10的GPIO配置要求而的
    HAL_GPIO_Init(&GPIOA,gpio_initdstruct);
    //NVIC配置
    HAL_GPIO_EnableIRQ(USART1_IRQn);                 //使能中断
    HAL_NVIC_SetPriority(USART1_IRQn,2,2);           //设置中断优先级
    
    //如何确定RNXE被置为1  __HAL_UART_ENABLE_IT()
    __HAL_UART_ENABLE_IT(huart,UART_IT_RXNE);         
    __HAL_UART_ENABLE_IT(huart,UART_IT_IDLE);        //空闲中断
    
}
}

4、对接收数组进行清空

void uart1_rx_clear(void)
{
    memset(&uart1_rx_buf,0,sizeof(uart1_rx_buf));
    uart1_rx_len = 0;
}

5、中断服务函数--数据收发

1.空闲中断的触发机制:

空闲中断是在监测到数据接收后(即串口的RXNE位被置位)开始检测,当总线上在一个字节对应的周期内未再有新的数据接收时,触发空闲中断IDLE位被硬件置1.

void USART1_IRQHandler(void)
{
    uint8_t receive_data = 0;
    //判断什么时候数据的收发 如何判断是否收到数据  看RXNE  RDR接收数据寄存器内不为空 就会触发一个        
    中断就可以进行一个操作
	//判断是否为RXNE触发的中断
    //需要判断数组是否接收完,防止缓冲区被刷爆
    if(__HAL_UART_GET_FLAG(&uart1_handle,UART_RX_RXNE) != RESET)
{
        //需要判断数组是否接收完,防止缓冲区被刷爆
        if(uart1_rx_len >= sizeof(uart1_rx_buf))
        uart1_rx_len = 0;
               
        //进行接收
        //接收的位置,接受的数据,接收的长度,超时时间
  
    HAL_UART_Receive(&uart1_handle,&receive_data,1,1000);
    uart1_rx_buf[uart1_rx_len++] = receive_data;//接收到的数据保存到数组中
    //需要判断数组是否接收完
    //发出数据
 }   
    if(__HAL_UART_GET_FLAG(&huart1_handle,UART_RX_IDLE) !=RESET)
    {
    printf("recv: %s\r\n",uart1_rx_buf);//直接打印
    uart1_rx_clear();                  //清空数组中的数据一边下一次接收,造成影响
    __HAL_UART_CLEAR_IDLEFLAG(&uart1_handle);//对UART_FLAG_IDLE进行软件清零
}
    
}

6、重定向到串口1中

int fputc(int ch, FILE *f)
{
    while((USART1-SR & 0x40) == 0)
    USART1->DR = (uint8_t)ch;
    return ch;
}

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

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

相关文章

HDLBits中文版,标准参考答案 | 3.2.5 Finite State Machines | 有限状态机(5)

关注 望森FPGA 查看更多FPGA资讯 这是望森的第 20 期分享 作者 | 望森 来源 | 望森FPGA 目录 1 Q6b: FSM next-state logic | Q6b:FSM 下一状态逻辑 2 Q6c: FSM one-hot next-state logic | Q6c:FSM 独热下一状态逻辑 3 Q6: FSM 4 Q2a: FSM 5 Q2b…

R编程环境的搭建

【图书推荐】《R语言医学数据分析实践》-CSDN博客 R语言对编程环境的要求不高,可以在多种操作系统平台上运行,包括Windows、macOS和Linux。要运行R语言,需要安装R解释器。可以从R语言的官方网站下载和安装最新版本。R语言还需要一个集成开发…

【可答疑】基于51单片机的水位检测系统(含仿真、代码、报告、演示视频等)

✨哈喽大家好,这里是每天一杯冰美式oh,985电子本硕,大厂嵌入式在职0.3年,业余时间做做单片机小项目,有需要也可以提供就业指导(免费)~ 🐱‍🐉这是51单片机毕业设计100篇…

postman变量,断言,参数化

环境变量 1.创建环境变量 正式环境是错误的,方便验证环境变化 2.在请求中添加变量 3.运行前选择环境变量 全局变量 能够在任何接口访问的变量 console中打印日志 console.log(responseBody);//将数据解析为json格式 var data JSON.parse(responseBody); conso…

HTML(七)表格

在HTML中&#xff0c;表格的标准形式如下&#xff1a; <table></table> 使用上面的语言&#xff0c;就已经生成了一个表格&#xff0c;只不过这个表格什么都没有 那么&#xff0c;该如何让表格存在东西呢&#xff1f; 首先&#xff0c;我们需要使用到<tr> …

sqli-labs less-26 空格绕过

空格绕过 过滤空格 用Tab代替空格%20 %09 %0a %0b %0c %0d %a0 //() 绕过空格注释符绕过//–%20//#–- -;%00; 空白字符绕过SQLite3 —— 0A,0D,0c,09,20 MYSQL 09,0A,0B,0B,0D,A0,20 PosgressSQL 0A,0D,0C,09,20 Oracle_11g 00,0A,0D,0C,09,20 MSSQL 01,02,03,04,05,06,07,…

python爬虫案例——selenium爬取淘宝商品信息,实现翻页抓取(14)

文章目录 1、任务目标2、网页分析3、代码编写3.1 代码分析3.2 完整代码1、任务目标 目标网站:淘宝(https://www.taobao.com/) 任务要求:通过selenium实现自动化抓取 淘宝美食 板块下的所有商品信息,并实现翻页抓取,最后以csv格式将数据保存至本地;如: 2、网页分析 首先…

Servlet[springmvc]的Servlet.init()引发异常

报错&#xff1a; 原因之一&#xff1a; web.xml配置文件中监听器导入依赖项错误

android——自定义控件(不停变化的textview、开关switch、动画效果的打勾)

一、从开始数字到结束数字&#xff0c;不断变化 import android.animation.TypeEvaluator; import android.animation.ValueAnimator; import android.content.Context; import android.util.AttributeSet; import android.view.animation.AccelerateDecelerateInterpolator;i…

OpenCV答题卡识别

文章目录 一、基本流程二、代码实现1.定义函数2.图像预处理&#xff08;1&#xff09;高斯模糊、边缘检测&#xff08;2&#xff09;轮廓检测&#xff08;3&#xff09;透视变换&#xff08;4&#xff09;阈值处理和轮廓检测 3.筛选和排序选项轮廓4.判断答案5.显示结果 三、总结…

ssm基于javaweb的数学竞赛网站的设计与实现+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码请私聊我 需要定制请私聊 目 录 目 录 III 第1章 绪论 1 1.1选题动因 1 1.2目的和意义 1 1.3论文结构安排 2 第2章 开发环境与技术 …

Redis 缓存预热,缓存雪崩,缓存击穿,缓存穿透

Spring-data-redis 说明&#xff1a; 在 SpringBoot2.x 之后&#xff0c;原来使用的jedis 被替换为了 lettuce jedis : 采用的直连&#xff0c;多个线程操作的话&#xff0c;是不安全的&#xff0c;如果想要避免不安全的&#xff0c;使用 jedis pool 连接池 lettuce : 采用n…

云计算(第二阶段):mysql后的shell

第一章&#xff1a;变量 前言 什么是shell Shell 是一种提供用户与操作系统内核交互的工具&#xff0c;它接受用户输入的命令&#xff0c;解释后交给操作系统去执行。它不仅可以作为命令解释器&#xff0c;还可以通过脚本完成一系列自动化任务。 shell的特点 跨平台&#xff1a…

【LeetCode】动态规划—124. 二叉树中的最大路径和(附完整Python/C++代码)

动态规划—124. 二叉树中的最大路径和 题目描述前言基本思路1. 问题定义路径的限制&#xff1a; 2. 理解问题和递推关系核心思路&#xff1a;状态定义&#xff1a;递归公式&#xff1a; 3. 解决方法递归 动态规划方法伪代码&#xff1a; 4. 进一步优化5. 小总结 Python代码Pyt…

安装GraphRAG

安装GraphRAG 本文没有安装成功&#xff0c;一直卡在构建图节点。 我用的思路是GraphRAGOllama&#xff08;大语言模型&#xff09;Xinference&#xff08;词嵌入&#xff09;。找到的其他思路是&#xff0c;修改源码。 1 简介 1.1 GraphRAG GraphRAG是微软开源的一种基于…

鸿蒙开发 三十九 ArkTs类 class 静态属性和方法的定义

鸿蒙提供了static关键字&#xff0c;可以用static关键字修饰的属性和方法&#xff0c;用static修饰的属性和方法用类名.的方式调用&#xff0c;如下图&#xff1a; 在Robot方法中定义了静态的属性version&#xff0c;调用的话直接Robot.version就可以了&#xff0c;定义了方法&…

RabbitMQ消息队列MQ脑裂(网络分区)整理分析

文章目录 RabbitMQ 的集群架构基础什么是MQ脑裂检测网络分区RabbitMQ 网络分区导致脑裂的原因• 多个节点认为自己是主节点&#xff1a;• 节点间状态不一致&#xff1a;• 集群的不可用性和错误恢复&#xff1a; RabbitMQ 网络分区引发脑裂的常见场景队列镜像不同步HA&#xf…

人工智能的研究方法

一、人工智能是自然科学和社会科学的交叉学科 1、仿生学&#xff0c;生物构造和功能 2、运筹学&#xff0c;应用数学进行科学决策 3、控制论&#xff0c;通信与控制 4、认知科学&#xff0c;人脑或心智工件机制 5、哲学&#xff0c;世界观和方法论 6、数学&#xff0c;概…

Halcon Blob分析提取小光斑

文章目录 算子complement 返回一个区域的补集select_region_point 选择包含指定像素的所有区域intensity 计算灰度值的均值和偏差 案例 算子 complement 返回一个区域的补集 complement(Region : RegionComplement : : )Region (输入对象)&#xff1a;这指的是输入的一个或多…

[Linux] 软硬链接

软硬连接是两种链接方式,目的是通过使用一个已有的文件,在不进行拷贝的情况下,可以在不同的路径下访问同一份文件 软连接相当于快捷方式 硬连接相当于引用计数 软硬链接的目标也可以是软硬链接 软连接 指令 : ln -s 源文件 链接文件 软连接可链接文件夹 链接文件被删除后文件…