单片机HAL库使用HAL_UART_Receive_IT

2023-05-16

前言

由于本人第一次尝试开发单片机,要实现的功能是信息转发,需要调用HAL库方法,中断接受信息转发给FPGA,这里没有用到DMA方式所以不做赘述,特此记录分享希望帮到你们。

发送信息和中断接受流程

  • 发送

轮询等待方式发送消息Timeout超时返回,调用的这个方法发送数据发现只能发送一个字节8位的数据,发送大于一个字节数数组时会产生问题,拿示波器抓也只有第一个字节有效,其余都是错的,着实被这个浪费了很多时间,后来选择了第二种发送方式

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

中断发送消息,这个就可以发送多个字节数数组

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

  • 接收

这里也遇到了一些问题,可能是自己经验不足,在此说明下中断接受调用流程。首先先确定你要用到的是哪个串口,我们板子上有两个串口可以接受中断信号,我初始化了两个串口,用UART0去接受UART1的信号肯定是不行的,比如你初始化的UART1口,那么中断发生的时候会调用UART1_IRQHandler,如果是UART0,那么调用UART0_IRQHandler,然后调用HAL_UART_IRQHandler --> UART_Receive_IT(huart) --> HAL_UART_RxCpltCallback(huart)。这里你只需重载UART1_IRQHandler和HAL_UART_RxCpltCallback即可,附上代码

void UART1_IRQHandler(void)
{
  /* USER CODE BEGIN UART1_IRQn 0 */
    HAL_UART_IRQHandler(&sUartxHandle);
  /* USER CODE END UART1_IRQn 0 */
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance == UART1)
	{
		Do something...
	}
	else if(huart->Instance == UART0)
	{
		Do something...
	}
}

接受中断有个前提,是你必须要初始化中断,而且是每次调用完HAL_UART_RxCpltCallback以后都要重新初始化一下,用

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

注意Size设置,串口接收满这些个数以后才会触发中断,没有接收满不会触发中断,但是你仍然可以读取到pData里接受到的数据。

下面贴一些我的初始化代码

UART_HandleTypeDef sUartxHandle = {0};
static UINT8 buffer_in[5];
static UINT8 buf_count = 5;

void Init_uchar    
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    __HAL_RCC_GPIOD_CLK_ENABLE()

    GPIO_InitStruct.Pin = GPIO_PIN_5;
    GPIO_InitStruct.Mode = GPIO_MODE_AF;
    GPIO_InitStruct.OpenDrain = GPIO_PUSHPULL;	
    GPIO_InitStruct.Debounce.Enable = GPIO_DEBOUNCE_DISABLE;
    GPIO_InitStruct.SlewRate = GPIO_SLEW_RATE_HIGH;
    GPIO_InitStruct.DrvStrength = GPIO_AF5_UART1_TXD;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Alternate = UARTx_RX_ALTERNATE_AFn;
    HAL_GPIO_Init(UARTx_RX_PORT, &GPIO_InitStruct);
		
    GPIO_InitStruct.Pin = GPIO_PIN_6;
    GPIO_InitStruct.Mode = GPIO_MODE_AF;
    GPIO_InitStruct.Alternate = GPIO_AF5_UART1_RXD;
    HAL_GPIO_Init(UARTx_TX_PORT, &GPIO_InitStruct);		
    
    /* Peripheral clock enable */
    __HAL_RCC_UART1_CLK_ENABLE()
	
    sUartxHandle.Instance = UARTx;
    sUartxHandle.Init.BaudRate = 115200;
    sUartxHandle.Init.BaudDouble = UART_BAUDDOUBLE_ENABLE;	
    sUartxHandle.Init.WordLength = UART_WORDLENGTH_8B;
    sUartxHandle.Init.Parity = UART_PARITY_NONE;
    sUartxHandle.Init.Mode = UART_MODE_TX_RX;
    HAL_UART_Init(&sUartxHandle);
    
    HAL_UART_Receive_IT(&sUartxHandle, buffer_in, buf_count);
    NVIC_EnableIRQ(UARTx_IRQn);
}

NOTE:sUartxHandle.Init.BaudDouble = UART_BAUDDOUBLE_ENABLE;    我设置的是双缓冲模式,因为我这块板子波特率要求是115200,如果设置为UART_BAUDDOUBLE_DISABLE,则在115200下接受到的数据是不对的。小于115200波特率的可以设置为UART_BAUDDOUBLE_DISABLE,设置为UART_BAUDDOUBLE_ENABLE,HAL_UART_RxCpltCallback会被触发两次注意处理。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单片机HAL库使用HAL_UART_Receive_IT 的相关文章

  • latex与mathtype的对应

    在latex中一些特殊的字体在用mathtype实现的时候需要找到相应的字体 xff0c 就是说latex实现的所有特殊的字体 xff0c 实现 xff0c 在mathtype中都能找到相应的对应 例如下面的文本对应 R E u
  • 深度学习 优化算法

    深度学习优化算法 优化算法概念动量框架 SGDMomentumNAGAdaGradRMSProp AdaDeltaAdamNdam参考 优化算法 概念 优化算法的功能是通过改善训练方式来最大化或者最小化损失函数 模型内部有些参数 xff0c
  • AVStream AVCodecContext AVCodec

    AVStream 表示成一个流媒体 xff0c 每个AVStream对应一个AVCodecContext xff0c 存储该音视频流使用解码器的相关数据 xff0c 每个AVCodecContext中对应一个AVCodec 包含该音视频的解
  • 2022 年 GIS 就业状况

    2022 年 GIS 就业状况 我们生活在数字时代 xff0c 通过进行在线研究选择我们的道路 xff0c 比如选择假期 选择大学或追求职业 如果您正在考虑进入 GIS 领域或在 GIS 领域进一步发展 xff0c 那么这份报告一定会有所帮
  • Eigen使用方法

    看了这边博客之后总结一下https blog csdn net augusdi article details 12907341 xff0c 感谢原作 xff01 看了之后学到了好多 xff01 1 矩阵定义 不管是向量还是矩阵 xff0c
  • Linux C 书籍推荐

    建议学习路径 xff1a 首先先学学编辑器 xff0c vim emacs什么的都行 然后学make file文件 xff0c 只要知道一点就行 xff0c 这样就可以准备编程序了 然后看看 C程序设计语言 K amp R xff0c 这样
  • Lidar与imu外参标定

    目录 网上资料 方案1 方案2 Lidar与IMU的相对旋转 实现 总结 附录 xff1a 最近由于工作需要 xff0c 花了几天时间了解激光与imu的标定方法 xff1b 因为项目需要 xff0c 且这里是个人认识的一个整理 xff0c
  • ROS的tf包中坐标变换的方法

    1 setRotation函数的参数 在坐标变换的时候常有这样的写法 xff1a tfTutorialsAdding a frame C 43 43 transform setOrigin tf Vector3 0 0 2 0 0 0 tr
  • 转载-自定义ros消息 vector

    原创 xff1a https blog csdn net m zhangjingdong article details 79617966 1 我在ros程序包中新建一个msg文件夹 xff0c 用于存储msg消息相关定义 xff0c 之后
  • 学神的“诞生”-2014清华大学本科生特等奖学金答辩观后感

    清华的特奖与交大的竢实扬华 偶然间在学堂在线上留意到有这样的一场现场答辩 xff0c 很想知道最高学府的最高荣誉花落谁家 xff0c 得此殊荣的又是些怎样的 学神 xff0c 几点感受记录之 1 经历 gt gt 证书 清华的学生更注重大学
  • qt中 美化 问题列表

    1 QTabWidget 中tab xff0c tab bar xff0c pane属性分布 2 使用qss美化时 xff0c tab标签上和pane中都能美化成功 xff0c 但tab最右侧的tab bar却始终没有成功 设置控件的背景
  • AttributeError: module 'cv2.cv2' has no attribute 'createLBPHFaceRecognizer'

    AttributeError module cv2 cv2 has no attribute createLBPHFaceRecognizer 在某一次做人脸识别的小demo的过程中遇到了这个问题 下面直接上产生问题的源代码 span cl
  • CAN总线ACK响应问题

    CAN总线的应答位 xff08 ACK xff09 用来表示节点已经收到有效的帧 任何节点如果准确无误地接收到帧 xff0c 则要向总线上发送显性位 xff0c 该显性位将掩盖发送节点输出的隐性位 xff0c 使总线上表现为显性 如果发送节
  • 嵌入式书籍推荐

    嵌入式书籍推荐 Linux基础 1 Linux与Unix Shell 编程指南 C语言基础 1 C Primer Plus xff0c 5th Edition 美 Stephen Prata着 2 The C Programming Lan
  • 调试中关于__FILE__, __LINE__ 及 __FUNCTION__ 用法

    在C语言中 FILE xff1a 打印相应的文件名 LINE xff1a 打印语句在源代码中相应的行 FUNCTION xff1a 打印语句在源代码中相应的函数名
  • 看技术书籍坚持不下来的,看这里,记录增量学习法

    今天 xff0c 在阅读 软技能 代码之外的生存指南 这本书的过程中 xff0c 学习到了番茄工作法 定额工作法 xff0c 受此启发 xff0c 突然脑海里冒出了一个方法论 xff0c 这是我独创的一个学习方法论 xff0c 我把它称作
  • ubuntu16.04安装realsense2环境与SDK(D435)

    关于realsense2环境的安装以及SDK的使用现在的文档还不是很多 xff0c 就分享下我的过程 xff0c 希望对大家有帮助 我安装是从源码构建的 xff0c 以下是我参考的资料链接 第一个链接是官网 xff0c 我是以它为主 xff
  • C++服务器研发精进

    一袭青衫闯帝都 xff0c 回首已然四春秋 壮志未酬心未老 xff0c 抚膺身衰发已疏 转眼间已经工作四年有余 xff0c 回想刚毕业的懵懂无知 xff0c 仿佛就在昨日 xff0c 成长乎 xff1f 徒增岁月矣 理想中的职业生涯应该是目
  • [kernel 启动流程] (第二章)第一阶段之——设置SVC、关闭中断

    1 kernel启动流程第一阶段简单说明 arch arm kernel head S kernel入口地址对应stext ENTRY stext 1 第一阶段要做的事情 xff0c 也就是stext的实现内容 设置为SVC模式 xff0c
  • opencv 2.4.9编译踩坑笔记

    为了跑GSLAM xff0c 一直遇到opencv版本的问题 xff0c 本机之前是4 1 0 xff0c 作者回答用的版本是opencv2 4 9 xff0c 没办法 xff0c 再装一个 最终我的CMAKE指令 xff1a cmake

随机推荐

  • 如何使用APM固件飞控来使能外部位置控制

    在三维激光雷达平台上我们飞控采用pixhawk2的飞控 官方给我说这个支持APM和PX4的固件 xff0c 但是对APM固件的支持性比较好 xff0c 因此就选用了APM的飞控 在一开始装好飞机后 xff0c 第一次飞还好好的 xff0c
  • CentOS 8中安装docker时报错的解决

    CentOS 8中安装docker时报错的解决 Problem package podman span class token operator span 3 span class token punctuation span 2 span
  • 四旋翼飞行器(QuadCopter--Parrot mini drone)—— 基于模型设计(Model Based Design)

    版权声明 xff1a 本文为博主原创博文 xff0c 未经允许不得转载 xff0c 若要转载 xff0c 请说明出处并给出博文链接 最近一段时间 xff0c 朋友圈被MATLAB禁止哈工大 哈工程等科研院校使用刷屏了 xff0c 顿时各种声
  • VFH & VFH+ & VFH*—— Path Planning

    版权声明 xff1a 本文为博主原创博文 xff0c 未经允许不得转载 xff0c 若要转载 xff0c 请说明出处并给出博文链接 最近在学习VFH算法 xff0c 感觉蛮神奇 xff0c 特意从维基百科扒来了资料 xff0c 供学习研究
  • VFH 2D —— Path Planning

    版权声明 xff1a 本文为博主原创博文 xff0c 未经允许不得转载 xff0c 若要转载 xff0c 请说明出处并给出博文链接 进行路径规划的前提是 xff0c 无人机或机器人自身已经对当前环境有一个清晰的认知 xff08 环境感知 x
  • PX4——rcs源码分析

    注 xff1a 本文转载自 博主 xff1a 虾米一代 博客 xff1a pixhawk原生码rcS分析 代码执行流程 1 编译时将cmake configs nuttx px4fmu v2 default cmake文件中配置的模块全部编
  • ArduPilot——AP_NavEKF3针对AP_NavEKF2做了哪些改进/变动?

    版权声明 xff1a 本文为博主原创博文 xff0c 未经允许不得转载 xff0c 若要转载 xff0c 请说明出处并给出博文链接 本篇博文主要针对Paul Riseborough大神为ArduPilot做的导航EKF3算法 xff0c 相
  • QuadPlane (VTOL)——ArduPilot——流程梳理

    版权声明 xff1a 本文为博主原创博文 xff0c 未经允许不得转载 xff0c 若要转载 xff0c 请说明出处并给出博文链接
  • 进程的几种状态

    进程 xff1a 进程 xff08 Process xff09 是计算机中的程序关于某数据集合上的一次运行活动 xff0c 是系统进行资源分配和调度的基本单位 进程状态 xff1a 一个进程的生命周期可以划分为一组状态 xff0c 这些状态
  • 超声波纳米材料乳化分散震动棒设计

    超声波纳米材料乳化分散震动棒利用超声波的超声空化作用来分散团聚的颗粒 它是将所需处理的颗粒悬浮液 xff08 液态 xff09 放入超强声场中 xff0c 用适当的超声振幅和作用时间加以处理 由于粉体颗粒团聚的固有特征 xff0c 对于一些
  • noVNC+VNCserver实现远程访问Docker容器桌面

    一 实验环境 主机 xff1a Ubuntu16 04 目标机 xff1a docker容器 说明 xff1a 在主机Ubuntu16 04中安装docker xff0c 并虚拟出一台Ubuntu容器 xff0c 将该容器作为要远程访问的目
  • 本地项目(vscode)和码云建立连接,及常用git命令

    本地Git和线上关联 xff1a 权限设置 G码云 设置 SSH公钥 公钥管理电脑桌面点击右键进入Git Bash Here对照链接输入指令绑定邮箱 xff1a https gitee com help articles 4181 arti
  • 解决android studio 控制台乱码

    双击shift键 xff0c 输入vmoption xff0c 选择Edit Custom CM Options 如果没有配置过 xff0c 就会弹出窗口问是否创建配置文件 xff0c 点击Create xff0c 输入 Dfile enc
  • 无人机学习笔记

    硬件 首先从硬件开始说起把 xff0c 气压计 陀螺仪 磁力计 xff0c 这三个不用说肯定是必备的 xff0c 后面由于开发的需要还添加了激光测距 xff0c 以及光流 但是在开发过程中遇到了很多问题 xff0c 一个一个来说 气压计 气
  • 解决KEIL中ARM编译器不能编译的问题

    keil编译器出现问题 xff0c 根据提示意思就是ARM编译器选择不对的问题 Target 39 Printf 39 uses ARM Compiler 39 V5 06 update 6 build 750 39 which is no
  • linux 内核中strstr函数 功能

    在内核代码中看到strstr函数 xff1a mode 61 strstr boot command line 34 D 34 应该是一个字符串处理函数 xff0c 使用man命令查看下给出如下解释 xff1a SYNOPSIS inclu
  • KPI异常检测资料汇总

    文章目录 0 综述类1 KPI异常检测1 1 经典模型1 1 1 Donut 基于VAE的周期性无监督KPI异常检测1 1 1 1 论文解读1 1 1 2 源码分析 1 12 MAD 基于GANs的时间序列数据多元异常检测 1 2 行业落地
  • jupyter notebook:使用argparse包存在的问题及解决

    argparse模块 argparse是python用于解析命令行参数和选项的标准模块 导入argparse包 span class hljs keyword import span argparse 遇到的问题 parser 61 arg
  • Qt C++和Java相互调用

    Qt C 43 43 和Java相互调用 1 C 43 43 调用Java Test h span class token keyword class span span class token class name Test span s
  • 单片机HAL库使用HAL_UART_Receive_IT

    前言 由于本人第一次尝试开发单片机 xff0c 要实现的功能是信息转发 xff0c 需要调用HAL库方法 xff0c 中断接受信息转发给FPGA xff0c 这里没有用到DMA方式所以不做赘述 xff0c 特此记录分享希望帮到你们 发送信息