STM32 HAL库USART的接收数据方法实现(STM32Cube_FW_F1_V1.8.5)

目录

概述

1 使用STM32Cube生成项目

1.1 软件版本信息

1.2 配置串口相关参数

1.3 生成工程

2 问题描述

3 解决问题

3.1 修改代码

3.2 编写新的回调函数

4 测试


概述

 

本文主要介绍STM32 HAL库USART的接收数据方法实现,笔者使用的HAL库为STM32Cube_FW_F1_V1.8.5,使用的MCU为STM32F103RC6,使用STM32Cube生成和串口相关的代码,发现其并不能实现接收数据功能,本文写作的目的就是记录解决这个问题的方法。

1 使用STM32Cube生成项目

1.1 软件版本信息

软件名称版本信息
STM32CubeSTM32CubeMX 6.11
STM32 HALSTM32Cube_FW_F1_V1.8.5

1.2 配置串口相关参数

1)工作模式

选择串口1,使用异步传输数据模式

2)配置串口相关参数

 3)串口的IO信息

4) 使能串口接收中断

 

1.3 生成工程

配置完成参数,生成项目。

2 问题描述

配置完成项目后,编译项目,然后下载代码到板卡中。运行代码后,

1)ORE被置位

2)快速运行代码,但其并没有进入到串口中断中

3)CR1寄存器中的参数值中的RXNEIE吗,没有被置位

3 解决问题

3.1 修改代码

在usart.c文件中,在MX_USART1_UART_Init函数添加如下语句,其目的是打开USART1的接收中断:

  SET_BIT(huart1.Instance->CR1, USART_CR1_RXNEIE);

Control register 1 (USART_CR1)

Address offset: 0x0C
Reset value: 0x0000

Bit 5 RXNEIE: RXNE interrupt enable
此位由软件设置和清除。

0:中断被禁止

1: 当USART_SR寄存器中的ORE=1或RxNE=1时,会产生USART中断
 

3.2 编写新的回调函数

此回调函数不是HAL库中提供的,而是需要程序员自己编写,其主要实现如下功能,该函数编写在usart.c文件中实现:

uint8_t testbuff[32];
uint8_t recCnt;
void UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    uint32_t isrflags   = READ_REG(huart->Instance->SR);
    uint32_t cr1its     = READ_REG(huart->Instance->CR1);

    if( huart->Instance==USART1 )
    {
        /* UART in mode Receiver -------------------------------------------------*/
        if (((isrflags & USART_SR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET))
        {
            testbuff[recCnt++] = huart->Instance->DR;
            if( recCnt>= 32)
                recCnt = 0;
        }
        SET_BIT(huart->Instance->CR1, USART_CR1_RXNEIE);
        CLEAR_BIT(huart->Instance->SR, USART_SR_ORE);
    }
}

Status register (USART_SR)
Address offset: 0x00
Reset value: 0x00C0

Bit 3 ORE: Overrun error
当移位寄存器中当前接收的字为准备在RXNE=1时被转移到RDR寄存器中。如果在USART_CR1寄存器中RXNEIE=1。它由软件序列清除(读取USART_SR寄存器,后面跟着对USART_DR寄存器的读取)。

stm32f1xx_it.c中的USART1_IRQHandler()函数中调用该回调函数

源码如下:

/**
  * @brief This function handles USART1 global interrupt.
  */
void USART1_IRQHandler(void)
{
    /* USER CODE BEGIN USART1_IRQn 0 */
    /* USER CODE END USART1_IRQn 0 */
    UART_RxCpltCallback( &huart1 );
    HAL_UART_IRQHandler(&huart1);
    /* USER CODE BEGIN USART1_IRQn 1 */
    /* USER CODE END USART1_IRQn 1 */
}

4 测试

1)完成以上代码之后,就可以编译项目,然后下载到板卡中测试该功能。在USART1_IRQHandler函数中添加断点。

 2)使用串口调试助手发送数据至板卡

3)查看结果

 使用ST-Link调试,debug的数据

CR1寄存器中的参数值:RXNEIE=1

 SR寄存器中的参数值,RXNE和ORE已经被清除

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

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

相关文章

Leetcode刷题笔记6

34. 在排序数组中查找元素的第一个和最后一个位置 34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode) 解法一:暴力查找 [1, 2, 3, 3, 3, 4, 5] t 3 从前往后扫描暴力查找,最坏情况下O(N) 优化 利用数组有序的…

【动态规划 组合数学 放球问题】2338. 统计理想数组的数目

本文涉及知识点 动态规划汇总 组合数学汇总 【组合数学 隔板法 容斥原理】放球问题 本题同解 【动态规划】【前缀和】【分组】2338. 统计理想数组的数目 LeetCode2338. 统计理想数组的数目 给你两个整数 n 和 maxValue ,用于描述一个 理想数组 。 对于下标从 0…

Unity中模拟生成正态分布的一种方式

using System; using System.Collections; using System.Collections.Generic; using Unity.Mathematics; using UnityEngine;public class MathFunction : MonoBehaviour {private void Start(){//key 范围 0-99 表示 0% 到 99%Dictionary<int,uint> m new Dictionary&…

CSS绘制圆弧

css绘制如图的圆弧&#xff1a; 这种矩形弧形的效果中&#xff0c;弧形的效果一般是由一条曲线拉伸出来的&#xff0c;这条曲线往往是属于一个椭圆的&#xff0c;所以可以绘制一个椭圆&#xff0c;截取部分可视区域实现效果。 <style> .wrapper{width: 400px;height: 60…

Hive原理及、部署和以及使用(超详细)

Hive的安装配置、初始化元数据、启动 1、解压hive到指定目录/usr/local/src 改名&#xff0c;将mysql的驱动包拷贝到hive的lib目录下 2、环境变量 1&#xff09; vi /etc/profile export HIVE_HOME/usr/local/src/hive export PATH P A T H : PATH: PATH:HIVE_HOME/bin echo…

20 厂商文档学习资料查询

01 厂商介绍 新华三&#xff08;H3C&#xff09; 新华三是一家专注于IT基础设施产品和解决方案的公司&#xff0c;提供从网络设备到数据中心解决方案的全套服务。它是中国领先的网络解决方案供应商之一&#xff0c;业务涵盖企业网、数据中心、云计算等多个领域。 华为&#x…

Java排序算法汇总篇,八种排序算法

排序算法汇总: Java排序算法(一)&#xff1a;冒泡排序 Java排序算法(二)&#xff1a;选择排序 Java排序算法(三)&#xff1a;插入排序 Java排序算法(四)&#xff1a;快速排序 Java排序算法(五)&#xff1a;归并排序 Java排序算法(六)&#xff1a;希尔排序 Java排序算法(…

科普之旅 | 什么是大语言模型

作者&#xff1a;陈之炎本文约2000字&#xff0c;建议阅读5分钟 本文介绍了大语言模型。 导读 在这个信息爆炸的时代&#xff0c;你是否曾幻想过与机器流畅交谈&#xff0c;或是让AI助你笔下生花&#xff0c;创作出惊艳的文章&#xff1f;这一切&#xff0c;都离不开大语言模型…

港口利器:ModbusTCP转CAN轻松连接,提升跨运车效率!

BXKJ系列嵌入式通信模块&#xff0c;宛如一把神奇的钥匙&#xff0c;打开了与特定工业网络沟通的神秘之门。这些模块的可互换性&#xff0c;赋予了用户自由连接至任何所需网络的无限可能。它们与众多主流现场总线和工业以太网网络无缝对接&#xff0c;包括但不限于Profibus、De…

matlab(实例):滤波器(低通、带通、高通,使用butter函数、filter函数)

一、题目&#xff1a;已知一个时域信号&#xff0c;包含三个频率&#xff08;50Hz、150Hz、300Hz&#xff09;&#xff0c;分别设计并使用低通滤波器、带通滤波器、高通滤波器&#xff0c;对其进行滤波&#xff0c;画出滤波信号的时域图和频谱图。 二、解题过程&#xff1a; ①…

孩子用的灯什么样的好?安利几款适合孩子用的护眼台灯

随着学生们重返校园&#xff0c;家长和孩子们忙于新学期的准备工作&#xff0c;眼睛健康的考量自然也在其中。这也是为何近年来护眼台灯越来越受到欢迎的原因之一。作为一个长期近视并且日常用眼时间较长的人&#xff0c;我本人对护眼台灯有着长期的使用经历&#xff0c;并对它…

halcon程序如何导出C#文件

1.打开halcon文件&#xff1b; 2.写好需要生成C#文件的算子或函数&#xff1b; 3.找到档案-输出&#xff0c;如下图&#xff1b; 4.点击输出&#xff0c;弹出如下窗口 &#xff08;1&#xff09;可以修改导出文件的存储路径 &#xff08;2&#xff09;选择C#-HALCON/.NET &…

window11 设置 ubuntu2204 至最佳体验(安装/右键菜单/root用户/docker)

前言 在 window 中如果不使用 ubuntu 命令行会非常不方便&#xff0c;还好微软提供了 ubuntu 的终端&#xff0c;下载安装后简单设置下就可以愉快的使用了。 本文会涉及的方面 安装右键菜单设置root 用户设置docker 设置 安装 ubuntu 到微软的软件商店中下载安装即可&…

AndroidFlutter混合开发

为什么要有混合开发 我们知道&#xff0c;Flutter是可以做跨平台开发的&#xff0c;即一份Flutter的Dart代码&#xff0c;可以编译到多个平台上运行。这么做的好处就是&#xff0c;在不降低多少性能的情况下&#xff0c;尽最大可能的节省开发的时间成本&#xff0c;直接将开发…

【OrangePi AIpro】香橙派 AIpro 解锁开发新潜能

目录 引言 一、开箱初印象 二、硬件配置概览 三、软件环境搭建 网络配置【VScode】安装配置、插件及远程SSH连接SSH 访问 OrangePi AIpro配置 vim安装外设开发库 四、实战项目体验 USB 摄像头测试1、使用 fswebcam 测试 USB 摄像头2、使用 mjpg-streamer 测试 USB 摄像头&a…

Microsoft Outlook Lite 引入短信功能

随着科技的不断进步&#xff0c;我们的沟通方式也在不断演变。微软最新推出的 Outlook Lite 应用&#xff0c;不仅为我们提供了一个轻量级的电子邮件管理工具&#xff0c;现在更是带来了一项令人兴奋的新功能——短信服务。 Outlook Lite&#xff1a;轻量级&#xff0c;功能全…

WiFi模块网络配置基本设置

WiFi模块网络如何配置&#xff1f;WiFi模块网络配置基本设置如下&#xff1a;   1、网络配置与AT命令   请求串口或其他交互接口输入SSID或密码。   虽然通过串口AT命令配置网络很简单&#xff0c;但是需要串口输入&#xff0c;一般需要在单片机系统上提供一个人机交互接…

打工人福音⚡:公牛充电交互协议,建议收藏!

分享《一套免费开源充电桩物联网系统&#xff0c;是可以立马拿去商用的&#xff01;》 协议原文件下载地址&#xff1a; 链接: https://pan.baidu.com/s/1kW15Nfe9cjPDFLGPYJ-zUg?pwdagq2 提取码: agq2 1 总则 1.1 协议概述 本协议适用于公司所有充电产品包括交直流充电桩、…

vueRouter路由总结

https://blog.csdn.net/qq_24767091/article/details/119326884

CUDA学习(2)

什么是CUDA CUDA&#xff08;Compute Unified Device Architecture&#xff09;&#xff0c;统一计算设备架构&#xff0c;英伟达推出的基于其GPU的通用高性能计算平台和编程模型。 借助CUDA&#xff0c;开发者可以充分利用英伟达GPU的强大计算能力加速各种计算任务。 软件生…