当前位置: 首页 > news >正文

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已经被清除

相关文章:

  • 使用last查看系统登录情况
  • 开源与闭源 AI 模型:发展路径的比较与前瞻
  • 【SAP HANA 33】前端参数多选情况下HANA如何使用IN来匹配?
  • k8s集群的存储卷、pvc和pv
  • VB6 MQTT为什么在物联网应用中使用 MQTT 而不是 HTTP?
  • 算法(七)插入排序
  • 如果查看svn的账号和密码
  • 矩阵链相乘(动态规划法)
  • 前端vue搭建
  • 7 步解决Android Studio模拟器切换中文输入
  • go语言初学03 连接mysql
  • python数据分析——数据预处理
  • 【CH32V305FBP6】调试入坑指南
  • list 的实现
  • Kubernetes (K8s) 普及指南
  • 【Linux系统编程】快速查找errno错误码信息
  • classpath对获取配置文件的影响
  • docker-consul
  • extjs4学习之配置
  • JavaScript 奇技淫巧
  • Javascript编码规范
  • Java多态
  • Java精华积累:初学者都应该搞懂的问题
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • 关于springcloud Gateway中的限流
  • 后端_MYSQL
  • 基于HAProxy的高性能缓存服务器nuster
  • 简单实现一个textarea自适应高度
  • 前端代码风格自动化系列(二)之Commitlint
  • 前端学习笔记之观察者模式
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 微信小程序开发问题汇总
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • # 透过事物看本质的能力怎么培养?
  • ######## golang各章节终篇索引 ########
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • $refs 、$nextTic、动态组件、name的使用
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (2)STM32单片机上位机
  • (3)选择元素——(17)练习(Exercises)
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (pytorch进阶之路)扩散概率模型
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (面试必看!)锁策略
  • (一)Docker基本介绍
  • (一)面试需要掌握的技巧
  • (自用)网络编程
  • .htaccess配置重写url引擎
  • .NET BackgroundWorker