精华内容
下载资源
问答
  • stm32 cubemx hal串口收发 中断接收 包括 MDK项目 和 stm32的cubemx 项目 使用hal最新的库函数开发 cubemx 4.26.1 有中文注释
  • 用STM32 HAL库,串口使用中断模式,发现程序有时候会进去死锁状态,原因应该是串口在发送过程中,这时候数据又被发送过去了,然后就很容易会死锁了。上网找了相关的资料,见链接:...

    用STM32 HAL库,串口使用中断模式,发现程序有时候会进去死锁状态,原因应该是串口在发送过程中,这时候数据又被发送过去了,然后就很容易会死锁了。

    上网找了相关的资料,见链接:

    https://blog.csdn.net/mickey35/article/details/74255041

    作者分析了原因,是__HAL_LOCK的原因,这里点个赞。

    作者又写了另外一种情况下串口死锁的解决方法,具体可见:

    https://blog.csdn.net/mickey35/article/details/78529637

    串口溢出中断(ORE)。继续点个赞。


    展开全文
  • STM32 HAL实现串口中断接收

    千次阅读 2020-03-28 17:20:58
    一、串口设置 1. 异步模式 2. 参数 3. 中断使能 4. 生成代码如下 /* USART6 init function */ static void MX_USART6_UART_Init(void) { huart6.Instance = USART6; huart6.Init.BaudRate = 115200; huart6....

    一、串口设置

    1. 异步模式

    在这里插入图片描述
    默认RX在PC7上,根据需要改到PG9上
    在这里插入图片描述
    在这里插入图片描述

    2. 参数

    在这里插入图片描述

    3. 中断使能

    在这里插入图片描述

    4. 生成代码如下

    /* USART6 init function */
    static void MX_USART6_UART_Init(void)
    {
    
      huart6.Instance = USART6;
      huart6.Init.BaudRate = 115200;
      huart6.Init.WordLength = UART_WORDLENGTH_8B;
      huart6.Init.StopBits = UART_STOPBITS_1;
      huart6.Init.Parity = UART_PARITY_NONE;
      huart6.Init.Mode = UART_MODE_TX_RX;
      huart6.Init.HwFlowCtl = UART_HWCONTROL_NONE;
      huart6.Init.OverSampling = UART_OVERSAMPLING_16;
      if (HAL_UART_Init(&huart6) != HAL_OK)
      {
        _Error_Handler(__FILE__, __LINE__);
      }
    }
    

    5. 自己需添加中断服务函数

    //发生溢出中断或DMA中断时
    uint8_t Rx_HAL_Buff_Temp[2];	//HAL函数接收临时缓存
    uint8_t Rx_Buff[100];			//接收帧缓存,自己定义大小
    uint8_t RxCounter = 0;			//接收计数器
    void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
    {
      huart->ErrorCode = HAL_UART_ERROR_NONE;
      HAL_UART_Receive_IT(&huart6,Rx_HAL_Buff_Temp,1);
    }
    //接收到1字节数据,回调函数如下
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    {
      if(huart->Instance==USART6)
      {
    	Rx_Buff[[RxCounter++] = Rx_HAL_Buff_Temp[0];
    	//加上自己的代码
      	HAL_UART_Receive_IT(&huart6,Rx_HAL_Buff_Temp,1);
      } 
    }
    
    展开全文
  • [STM32系列]一、HAL库的串口中断接收

    千次阅读 2019-09-09 14:41:50
    [STM32系列]一、HAL库的串口中断接收1、前言2、回调函数3、HAL库中断接收函数使用 1、前言 HAL即硬件抽象层(英语:Hardware Abstraction Layer),实现了不同硬件的统一接口操作。这就极大的简化了程序员的移植工作...

    [STM32系列]一、HAL库的串口中断任意长度接收

    1、前言

    HAL即硬件抽象层(英语:Hardware Abstraction Layer),实现了不同硬件的统一接口操作。这就极大的简化了程序员的移植工作,搭配STM32CubeMX,使用起来非常方便。

    2、回调函数

    HAL库使用了很多的回调机制,这样写能够更好的实现程序的分层处理,不影响程序的主体框架,方便后期修改移植。

    3、HAL库中断接收函数使用

    使用HAL_UART_Receive_IT函数前,需要使能串口的接收中断,并配置中断优先级。

     /* Peripheral clock enable */
        __HAL_RCC_USART2_CLK_ENABLE();
      
        __HAL_RCC_GPIOA_CLK_ENABLE();
        /**USART2 GPIO Configuration    
        PA2     ------> USART2_TX
        PA3     ------> USART2_RX 
        */
        GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
        GPIO_InitStruct.Alternate = GPIO_AF4_USART2;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    
        /* USART2 interrupt Init */
        HAL_NVIC_SetPriority(USART2_IRQn, 1, 1);
        HAL_NVIC_EnableIRQ(USART2_IRQn);
    

    在对应的串口中断函数中需要对应的中断处理

    void USART2_IRQHandler(void)
    {
      /* USER CODE BEGIN USART2_IRQn 0 */
    
      /* USER CODE END USART2_IRQn 0 */
      HAL_UART_IRQHandler(&huart2);
      /* USER CODE BEGIN USART2_IRQn 1 */
    
      /* USER CODE END USART2_IRQn 1 */
    }
    

    这时就可以使用
    HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
    函数接收了,该函数会打开接收中断接收数据,函数的第一个参数指定接收串口的结构体指针,第二个参数为接收数据指针,第三个参数为接收数据长度。该函数没有超时机制,必须要指定接收的数据长度,在数据没有达到接收长度时该函数会一直阻塞,这就要求接收的数据长度必须为已知,在接收不定长度数据时会不适用。
    在使用串口接收Modbus-RTU数据时,需要接收不定长的数据帧,并且要求非阻塞接收。像在标准库中接收数据一样,这里可以通过HAL_UART_Receive_IT接收单个字节的数据,在接收回调函数中加入超时处理即可完成一帧数据的接收。接收流程如下:

    Created with Raphaël 2.2.0 开始 接收一个字节 超时? 帧处理 结束 yes no

    保证数据帧完整的接收,就需要在接收完一个字节数据的时候将计时清零,继续下一次接收,直到超时退出,然后再处理这一帧数据。具体实现内容如下:

    //数据接收结构体
    struct M_Rev{
    	uint8_t revcnt;			//接收计数
    	uint8_t revact;			//开始标志
    	uint8_t oldcnt;			//上次计数
    	uint32_t revtick;		//接收计时
    	uint8_t revbuff[MODBUS_MAX_LEN];		//接收缓存
    }Modbus_Rev;
    
    //接收回调函数
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    {
    	if(huart->Instance == USART2)		//判断串口
    	{
    		if(Modbus_Rev.revcnt == 0)		//帧第一个数据
    		{
    			if(Modbus_Rev.revact == 1)	//首次接收
    			{
    				Modbus_Rev.revact = 2;		
    			}
    			else	//非首次接收
    			{
    				Modbus_Rev.revbuff[0] = Modbus_Rev.revbuff[Modbus_Rev.oldcnt];	//上一次接收数据位置
    			}	
    			HAL_TIM_Base_Start_IT(&htim2);	//开启定时器
    			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET);	//开启指示灯
    		}		
    		Modbus_Rev.revcnt += 1;	//接收计数
    		if(Modbus_Rev.revcnt >= MODBUS_MAX_LEN)	Modbus_Rev.revcnt = MODBUS_MAX_LEN - 1;	
    		
    		Modbus_Rev.revtick = 0;	//计时清0
    		HAL_UART_Receive_IT(huart, &(Modbus_Rev.revbuff[Modbus_Rev.revcnt]), 1);	//接收下一次数据
    	}
    }
    
    //定时器回调函数
    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    {
    	Modbus_Rev.revtick += 1;				//计时增加
    	if(Modbus_Rev.revtick > MAX_TIM_CNT)	//定时器溢出
    	{
    		Modbus_Rev.revtick =0;				//计时清0
    	}
    	if(Modbus_Rev.revtick >= MODBUS_T35)	//接收超时
    	{
    		if(Modbus_Rev.revact == 2)			//首次接收
    		{
    			Modbus_Rev.revact = 0;			//关闭首次接收
    		}	
    		Modbus_ReciveData(Modbus_Rev.revbuff,Modbus_Rev.revcnt);		//完成一帧接收,处理
    		Modbus_Rev.oldcnt = Modbus_Rev.revcnt;		//保存接受位置
    		Modbus_Rev.revcnt = 0;				//接收计数清0
    		HAL_TIM_Base_Stop_IT(&htim2);	//关闭定时器
    		
    		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);	//关闭指示灯
    	}
    }
    

    其中要注意的一点是,在第二帧接收时,由于接收的地址是上一帧的接收位置 + 1所以需要保存其位置,将其数值赋值到这一帧的第一个字节即可。

    展开全文
  • HAL串口中断接收

    千次阅读 2018-11-17 20:02:00
    然后开启串口中断,在中断中接收数据。但是不要在中断中处理数据,中断中尽量少做一些事情 2.编程中用到的函数 (1)HAL库中提供了很多串口操作的函数,有轮询模式收发,中断模式收发和DMA模式收发,我这里用的是...

    1.利用CubeMX配置串口1

    (1)配置串口1波特率为9600,波特率设置的太高有时会收不到消息,我碰到过。然后开启串口中断,在中断中接收数据。但是不要在中断中处理数据,中断中尽量少做一些事情
    1392333-20181117151546465-760941921.jpg

    2.编程中用到的函数


    (1)HAL库中提供了很多串口操作的函数,有轮询模式收发,中断模式收发和DMA模式收发,我这里用的是中断模式
    1392333-20181117152634637-733885637.jpg
    (2)这里用到的三个函数,我说一下他们的意思,其他函数类似
    HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef huart, uint8_t pData, uint16_t Size);
    //该函数功能为开启串口接收中断,并指定存储接收数据的缓存区,设置从串口接收的数据大小。这里要特别注意,该函数只有从串口接收到Size个数据后才会返回,不然会阻塞。
    HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef huart, uint8_t pData, uint16_t Size, uint32_t Timeout);
    //该函数功能为发送数据到指定串口,pData为数据地址,Size为数据大小,Timeout为超时时间。
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
    //该函数为串口接收完数据后的回调函数,在串口中断中,会依次调用以下这些函数:USART1_IRQHandler(),HAL_UART_IRQHandler(&huart1),UART_Receive_IT(),HAL_UART_RxCpltCallback()。回调函数在主函数中可以自己实现,HAL库只有定义,没有具体实现,我们可以在回调函数中做一些处理,来处理我们得到的数据。

    3.代码实现


    (1)这里做一个简单的串口与上位机串口助手通信的实验,将串口助手发送给开发板串口1的数据回发到串口助手。注意,在利用CubeMX生成的代码进行编程时,自己添加的代码一定要加在各种“BEGIN”和“END”之间。
    (2)首先在main中设置全局变量uint8_t RxCounter1=0,RxBuffer1[50]={0},RxTemp1=0,F_Usart1=0;用来保存从串口收到的数据,F_Usart1为接收完成标志,在while中会一直检测它是否变化,然后进行相关操作。RxTemp1为单缓冲区,接收一个字节时可用
    1392333-20181117161400924-742162294.jpg
    (3)在main()函数中while()之前开启串口接收中断,填好相关参数,HAL_UART_Receive_IT(&huart1,&RxTemp1,1);这里这么设置,先把数据保存到RxTemp1,然后再在回调函数中保存到RxBuffer1中,是为了把串口发来的数据完整的存储在RxBuffer1中,方便我进行其他处理
    1392333-20181117193658312-151646064.jpg
    (4)实现回调函数,这里有两种方法,方法一可以保存数据再进行操作,方法二直接发送数据,不进行操作,仔细看图中注释
    1392333-20181117193924518-2055357068.jpg
    (5)在while中的处理
    1392333-20181117200437982-1957774276.jpg

    4.补充说明


    (1)至此,串口实验基本完成。在这里说一下我项目里碰到的另外一个问题,我里面有两个串口通信要处理,先要在程序里发送数据到串口3,然后要把串口3反馈的内容进行一些处理后发送到串口1,这时候需要把开启中断函数里(HAL_UART_Receive_IT(&huart3,&RxBuffer3[RxCounter3++],1);)的数据缓冲区直接设为全局数组,然后回调函数里直接写开启中断的函数即可,不再需要RxTemp1标志位,但是要注意每次程序发送数据后要 延迟200ms,不然数据会收不到。看图中针对串口3的操作即可
    1392333-20181117195002322-88334606.jpg

    1392333-20181117195051999-1217580915.jpg
    1392333-20181117195138369-506610281.jpg

    转载于:https://www.cnblogs.com/yf4695/p/9975230.html

    展开全文
  • 文章目录软硬件型号1....打开串口 打开中断 配置优先级 生成工程文件 2. 代码添加 在usart.h中添加: #define USART_REC_LEN 200 //定义最大接收字节数 200 #define EN_USART1_RX 1 //使能
  • 在使用过程中几乎不需要去修改HAL库本身代码, 直接使用现有HAL库接口就可以快速方便的开发应用程序, 配合CubMx对开发人员来说实在是太友好了, 今天介绍个自用的串口中断接收的使用方法, 先看下HAL库的串口中断接收的...
  • 简介:STM32与上位机之间用通信协议(自己定义)进行串口通信。怎么判断上位机发过来的指令是正确的,而不是一串乱码?怎么从正确的指令中提取出想要的命令代号,从而实现想要的功能? 方法:读取上位机发来的命令,...
  • 这里使用USART1串口 usart.c中添加 (1)添加全局变量 uint8_t USART1_Buff[100] = {0}; //接收帧缓存,自己定义大小 uint8_t USART1_STA = 0; bool USART1_Receive_Flag = false; uint8_t res = 0; (2)在MX...
  • STM32 HAL库+串口DMA+空闲中断(IDLE)实现不定长数据接收,可以用来参考学习使用,简单易懂。
  • STM32使用HAL库写串口接收中断

    万次阅读 热门讨论 2019-03-16 22:16:31
    下面讲解使用HAL库配置串口1,使串口1可以使用中断接收字节并原样返回。 1. STM32CubeMX对串口1作如下配置 2. 添加如下代码 ​ uint8_t uart1_rxbuf[10]; // 用于存放接收到的数据 void MX_USART1...
  • CubeMX,HAL库使用串口发送和中断接收一、CubeMX界面配置二、MDK代码 不得不说HAL库和标准库相比确实简单多了。。。 一、CubeMX界面配置 选择完 异步通讯模式 后,其余默认即可。 打开串口中断 二、MDK代码 在/* ...
  • 网上使用HAL串口时很多都没有实现不定长数据的接收,要么是限定数据长度,要么是加“0x0a 0x0d”来控制接收完成,找了很久都没有真正找到一个能用的,在很多通信中不可能是定义的,或是加上“0x0a 0x0d”来实现的,...
  • Mode选择异步模式Asynchronous,查看串口的基础配置-Parameter Settings,保持默认不变。 选择NVIC Settings点击Enabled使能全局中断。 这样整个串口配置就完成了。 二、代码实现 在自动生成代码里点开MX...
  • hal库实现stm32串口中断接收数据

    千次阅读 2020-12-01 14:14:21
    先设置并开启串口中断接收 该函数功能为开启串口接收中断,并指定存储接收数据的缓存区,设置从串口接收的数据大小。这里要特别注意,该函数只有从串口接收到Size个数据后才会返回,不然会阻塞。 HAL_UART_Receive_...
  • ST推的HAL库,在整个接收过程中,是没有用到串口接收空闲中断,它的处理有三种,分别是轮询,接收完成中断(每一个字节一次),DMA接收。 整个Hal库把接收和发送过程都封装好了,就用最简单的轮询方式看,先看...
  • 距离上次串口挖的坑,已经过去1年多了,这次带着更加方便的解决方法来了,不用再次初始化串口那么麻烦了,更加省事[>\/<] 本菜鸟用的主控MCU:STM32L031K6UX 直接贴代码,简单粗暴,以后直接加到定时...
  • STM32CubeMX串口接收数据(中断方式,HAL库)

    万次阅读 多人点赞 2018-01-31 16:30:13
    系统:linux mint 18.3 xfce 64bit 软件: STM32CubeMX 4.24 SW4STM32 2.4 ... 开发板芯片:STM32F103RCT6,STM32F407VET6...实现效果:打开两个串口助手窗口,一个是USART1的,一个是USART2的,任意一个串口串口1
  • 代码已完成,待更新到此平台...................
  • 简介:STM32与上位机之间用通信协议(自己定义)进行串口通信。怎么判断上位机发过来的指令是正确的,而不是一串乱码?怎么从正确的指令中提取出想要的命令代号,从而实现想要的功能?(闲来无事,写个玩玩,原创!第...
  • 所以,中断接收的过程就是 (pTxBuffPtr,TxXferSize 和 TxXferCount 三个变量分别用来设置串口发送的数据缓存指针,发送的数据量和还剩余的要发送的数据量。 pRxBuffPtr,RxXferSize 和RxXferCount 则是用来设置...
  • 在进行串口中断使用的时候遇到了一些小麻烦,写下解决方案供大家参考。 1.UART相关的头文件引用错误  由于本人直接使用MDK进行开发,没有使用CubeMX,所以一些初始化需要手动进行。在引用UART相关的头文件时,...
  • STM32串口中断接收方式对于初学者有一定帮助STM32串口中断是最简单的
  • HAL库中,进入接收中断的方法与标准库很不一样,具体方法如下 u8 Res[1] ; //声明一个U8数组 HAL_UART_Receive_IT(&huart1,Res,1); // 初始化中打开串口1接收中断 //重写函数HAL_UART_RxCpltCallback,放在任意...
  • 使用的时候发现:接收完一个字节立即用DMA的方式发送出去,会出现数据的丢失,如用串口调试助手发送1234,返回的只有13 目前只能用缓存buf+协议结束(如0x0d,0x0a)的方式解决。 stm32cubeMX的配置界面如下: 1.使用...
  • STM32串口中断接收实验(HAL库)

    万次阅读 2018-09-10 20:11:39
    简介:STM32与上位机之间用通信协议(自己定义)进行串口通信。怎么判断上位机发过来的指令是正确的,而不是一串乱码?怎么从正确的指令中提取出想要的命令代号,从而实现想要的功能? 方法:读取上位机发来的命令...
  • HAL串口中断

    千次阅读 2021-09-27 10:26:31
    一,配置串口初始化 void MX_USART1_UART_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; ...
  • 之前一直用STM32CUBE配置工程,但是一用到USART1的DMA接收中断,或者USART1的接收中断...在一个工程里可以使用,另一个工程出现了数据不更新的情况(明明已经将缓冲区的数据全部读取了),感觉HAL库的串口中断很坑(...
  • 发送和接收两个函数  /*##-2- Start the transmission process #####################################*/  /* While the UART in reception process, user can transmit data through   "aTxBuffer"...
  • STM32L031 HAL 串口收发例程(中断配合轮询) 代码环境 开发工具:STM32CUBEIDE 芯片:STM32L031K6T6 端口: UART2 基本配置 其中,PA9 (RX)的输入上拉,在System Core的GPIO里配置。 TX(发送)设计 TX部分...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,080
精华内容 1,632
关键字:

hal串口中断接收