Stm32L0串口中断接收使用
最新在做LoRa的项目,使用的是STM32L072和SX1276,需要做一个串口透传模块,刚开始做demo的时候不考虑功耗,所以串口发送和接收直接使用下列函数执行:
HAL_UART_Transmit(&Sensor_UartHandle,(unsigned char *)&readcommand, sizeof(vcom_read_command_t), VCOM_START_DELAY);
HAL_UART_Receive(&Sensor_UartHandle,(unsigned char *)read_temp,UART_BUFFER_MAX_LEN, VCOM_RECV_TIMEOUT);
都涉及到了超时时间,而超时时间依赖的是systick中断,接收发送100字节没问题。
但现在需要做低功耗,那么就不允许systick频繁中断了,于是考虑到串口中断接受,但stm32的库提供的函数让人看不明白:
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
尝试一个晚上,现在收发没问题了,网上写的步骤不够详细,先将我的做法例举如下:
1.在串口初始化的时候打开串口中断,M0的芯片只有串口中断,不区分发送或者接收中断:
void CommandUartInit(void)
{
Sensor_UartHandle.Instance = SENSOR_USARTX;
Sensor_UartHandle.Init.BaudRate = 4800;
Sensor_UartHandle.Init.WordLength = UART_WORDLENGTH_9B; /*8-bit data and 1-bit even bit*/
Sensor_UartHandle.Init.StopBits = UART_STOPBITS_1;
Sensor_UartHandle.Init.Parity = UART_PARITY_EVEN;
Sensor_UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
Sensor_UartHandle.Init.Mode = UART_MODE_TX_RX;
if(HAL_UART_Init(&Sensor_UartHandle) != HAL_OK)
{
/* Initialization Error */
Error_Handler();
} NVIC_EnableIRQ(USART2_IRQn);
NVIC_ClearPendingIRQ(USART2_IRQn);
}
2.添加中断处理函数,按照stm32文件惯例,中断函数在stm32xxx_it.c里面添加:
void USART2_IRQHandler(void)
{
HAL_UART_IRQHandler(&Sensor_UartHandle);
}
这里需要说明的是,串口发送和接受的处理库已经帮我们做好了,全部封装在 void HAL_UART_IRQHandler(UART_HandleTypeDef *huart) 这个函数里,我们需要做的就是在中断处理函数里面调用这个函数而已,参数填写正确的串口号。
3. 在主循环中调用发送接收函数:
HAL_UART_Transmit_IT(&Sensor_UartHandle,(unsigned char *)&readcommand, sizeof(vcom_read_command_t));
do{
uart_receive_status = HAL_UART_Receive_IT(&Sensor_UartHandle,(unsigned char *)read_temp,UART_BUFFER_MAX_LEN);
temp_state=HAL_UART_GetState(&Sensor_UartHandle);
if(temp_state==HAL_UART_STATE_BUSY_RX || temp_state==HAL_UART_STATE_BUSY_TX_RX)
{
receive_timeout ++;
}
}while(Sensor_UartHandle.RxXferCount != 0 && receive_timeout < 10000);
这里有几点需要说明:
1)发送没什么好说的,直接调用HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)就可以将数据发送出去,可以发送任意size的数据。
2)接收函数做的比较恶心,HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size),每调用一次只接收一个字节,自己可以去分析static HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart)。
3)说一下这几个函数之间的关系:
调用HAL_UART_Receive_IT()相当于开启接收中断--->如果有数据,会触发中断USART2_IRQHandler() ---> HAL_UART_IRQHandler() ---> UART_Receive_IT()
可以看到在HAL_UART_Receive_IT中设置的各种参数,在UART_Receive_IT中都会用到,uhdata = (uint16_t) READ_REG(huart->Instance->RDR);这个就是从串口数据寄存器中获取到的数据。
4)重新说明下,不管是发送数据还是接收数据都会触发中断,进而最终会调用到 UART_Receive_IT()这个函数,在这个函数里面分别对接收和发送做了处理,可以看看源码。
5)为了实现接受任意长度的数据,我定义了一个255字节的数组用于接受,然后加了一个超时时间,网上很多用系统时钟做超时,但我为了做低功耗,没有开启systick中断,所以就直接加了一个u32的变量去计数,超时时间要根据自己接收的最长数据调整。
6)很多人说在接收大数据的时候这个库函数有问题,项目太急,暂时就不研究了,等遇到的时候再研究吧。
Stm32L0串口中断接收使用的更多相关文章
- STM32 HAL库关于串口中断烧录程序后可以正常运行,断电重启后无法进入中断的问题分析以及解决方法
1.情景描述: 最近在做一个项目,X86的上位机通过串口控制MCU,使用串口中断接收上位机数据时,MCU在上电的情况下烧录程序,可以正常接收上位机的数据,在断电重启后,一直进入不了中断回调函数,上电的 ...
- STM32移植RT-Thread的串口只能接收一个字节数据的问题
打开设备的函数参数要与注册设备函数参数要一致, 注册设备的函数及其参数如下: /* register UART1 device */ rt_hw_serial_register(&serial ...
- STM8S和STM8L调试串口中断的注意点
1. STM8L串口中断注意点 在调试PM2.5传感器GP2Y1051的时候,发现在仿真的时候开始能够进行数据的接受,但是如果暂停之后就不能接受数据,其实只是接收了一次完整的数据. 问题程序 解决方法 ...
- 基于STM8的UART发送和中断接收---STM8-第二章
1. 综述 UART的基础知识,通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART,是一种异步收发传输器. 做软件开发的人都 ...
- STM32 串口中断总结
原文:https://blog.csdn.net/weixin_42480952/article/details/82981409 最近在学习使用dma传输方式进行串口通讯,感觉这个很详细,存一下 . ...
- STM32F10x_硬件I2C主从通信(轮询发送,中断接收)
Ⅰ.写在前面 关注我分享文章的朋友应该知道我在前面讲述过(软件.硬件)I2C主机控制从机EEPROM的例子.在I2C通信主机控制程序是比较常见的一种,可以说在实际项目中,很多应用都会使用到I2C通信. ...
- STM32单片机串口中断+DMA使用(含CUBE配置)
最近又要重新用32做点东西,发现一两年没怎么碰的结果就是,曾经熟得不行的东西都变得极度陌生,这种重新学习记忆的过程过于痛苦,果然还是要留下一些记录给之后失忆的自己的. 1.STM32CUBE配置 1. ...
- STM32串口中断实例二
int main(void) { uint8_t a=;//LED高低电压控制 /* System Clocks Configuration */ RCC_Configuration(); //系统时 ...
- STM32串口——中断方式的一般配置方法
#include "stm32f10x.h" /************************************************ 该程序讲解串口程序的一般配置方法: ...
随机推荐
- centos 安装 composer
1 安装 composer curl -sS https://getcomposer.org/installer | php 2 添加到环境变量 mv co ...
- cocos2d方块方块
cGridSize=32 cSceneWidth=8+2 cSceneHeight=18 fuction Grid2Pos(x,y) local visibleSize=cc.Director:get ...
- mybatis if标签判断字符串相等
mybatis 映射文件中,if标签判断字符串相等,两种方式: 因为mybatis映射文件,是使用的ognl表达式,所以在判断字符串sex变量是否是字符串Y的时候, <if test=" ...
- xStream解析生成xml文件学习资料
参考链接: http://www.cnblogs.com/hoojo/archive/2011/04/22/2025197.html
- java中的package
java中用于存放源文件的文件夹叫做包package package中可以有源文件也可以由其他包. package的“全限定名”不是从磁盘的根目录开始的,而是从源代码的根目录开始的,以点号“.”作为分 ...
- 戴尔poweredge r730服务器配置以及系统安装
第一次给服务器安装的是ubantu系统: 首先我们开机进入小型BIOS设置一下RAID,或者进入服务器管理系统,在系统的BIOS中进行RAID设置: 开机后当看到出现< Ctrl > &l ...
- 2.19 C++友元函数和友元类
参考: http://www.weixueyuan.net/view/6350.html 总结: 借助friend关键字将其声明为友元函数,结果,在display函数体内,我们就能访问private属 ...
- redis 解析配置文件
在redis安装文件夹里面有redis.conf,查看配置. 一:基础配置介绍 1.units(单位) --这里可以看到 1k和1kb是不一样的, units 这里单位是不区分大小写的,are al ...
- ASP.NET使用文件上传控件上传图片
ASPX代码 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default. ...
- 1.横向滚动条,要设置两个div包裹. 2. 点击切换视频或者图片. overflow . overflow-x
1.横向滚动条. div.1 > div.2 > img img img 第一: 设置 div.1 一个固定的宽度 和高度 . 例如宽度 700px; 高度是 120px; 设置 o ...