精华内容
下载资源
问答
  • STM8S103F3开发板_实验13_USART中断接收_发送.。很不错的程序。可以用~ STM8S103F3开发板_实验13_USART中断接收_发送.。很不错的程序。可以用~STM8S103F3开发板_实验13_USART中断接收_发送.。很不错的程序。可以用~...
  • 本例程通过PC机的串口调试助手将数据发送至STM32,接收数据后将所接收的数据又发送至PC机,具体下面详谈
  • 此问题由客户工程师提出,客户在使用STM32F103的USART做串口通讯时,发现了一个问题,当设备正常通信一段时间后,串口不响应外部的通信请求了.
  • STM32系列USART中断接受注意事项USART_IT_ORE 1.USART_IT_ORE含义:接收溢出,尚未处理上一拍就迎来了下一拍数据; 2.USART_IT_ORE使能:该中断使能是在USART_IT_RXNE使能同时有效; 3.USART_IT_ORE检测: 1)在未...

    ZHL学习笔记

    STM32系列USART中断接受注意事项 之 USART_IT_ORE

    1. USART_IT_ORE含义:接收溢出,尚未处理上一拍就迎来了下一拍数据;
    2. USART_IT_ORE使能:该中断使能是在USART_IT_RXNE使能同时有效;
    3. USART_IT_ORE检测:
      1)未开启USART_IT_ERR时,只能由 USART_GetFlagStatus(USARTx,USART_Flag_ORE) 检测到;
      2)在开启USART_IT_ERR后,才能被 USART_GetITStatus(USARTx,USART_IT_ORE) 检测到;

    正确的USART接收中断函数使用方法:

    void USARTx_IRQHandler(void)
    {
      uint8_t RxData = 0;
      if(USART_GetITStatus(USARTx,USART_IT_RXNE)!=Bit_RESET) //检查 USART 是否发生中断
      {
          USART_ClearITPendingBit(USARTx,USART_IT_RXNE); // 清中断标志
          RxData = USART_ReceiveData(USARTx);
          // save RxData at here.
      }
      if(USART_GetFlagStatus(USARTx,USART_FLAG_ORE) == SET) // 检查 ORE 标志
      {
          USART_ClearFlag(USARTx,USART_FLAG_ORE);
          USART_ReceiveData(USARTx);
      }
    }
    

    STM官方给出的范例没有详细描述此问题:

    void USARTx_IRQHandler(void)
    {
      uint8_t RxData = 0;
      USART_ClearFlag(USARTx,USART_FLAG_TC ); //清除中断标志
      if(USART_GetITStatus(USARTx,USART_IT_RXNE)!=Bit_RESET)//检查指定的usart是否发生了中断
      {
         RxData = USART_ReceiveData(USARTx);
         // do something at here;
      }
    }
    
    展开全文
  • 今天在使用USART模块,遇到了一些问题并解决了,于是发贴共享。
  • STM32F767串口通信------USART中断接收

    千次阅读 2019-07-31 10:05:23
    USART3 全局中断优先级改为1. 点击右上角生成代码。 2.编写代码 由CubeMX提供IRQhandler函数,需要自己写callback函数,查询手册. 简单介绍下函数执行顺序,当单片机接收到信息,先进入USART3_...

    1.基础配置

     

    点击右边NVIC

    将USART3 全局中断优先级改为1.

    点击右上角生成代码。

     

     

    2.编写代码

    由CubeMX提供IRQhandler函数,需要自己写callback函数,查询手册.

     

    简单介绍下函数执行顺序,当单片机接收到信息,先进入USART3_IRQHanderler函数,如图,在stm32f7xx_it.c下。

    再将huart3地址传入HAL_UART_IRQHandler()中,在这个函数里,单片机将判断是执行接收中断还是发送中断,若是接收中断,则调用HAL_UART_Receive函数,如图。

    在HAL_UART_Receive执行完过后,就会执行刚刚看到的HAL_UART_RxCpltCallback(UART_HandleTypeDef *  huart)函数。

    之后中断的整个流程便结束了。

     

    接下来我们实现将接收到的信息发回单片机。

    打开main.c

    这里在while(1)前执行一次Receive_IT是为了打开中断,下图同理(可以简单理解为中断运行一次自动关闭)

     

    打开STM32F7xx_IT.c

    3.烧写程序

    注意:发送的数据个数必须与Receive_IT函数中第三个参数相同,否则会死机。

    展开全文
  • CUBE HAL库下的USART接收中断问题问题背景绕过问题的两个方案方案一:不用回调函数,直接在it文件里面的IRQ函数里写逻辑方案二:还用回调函数,不过需要调整下官方代码顺序 问题背景 在使用STM32单片机的USART1进行...

    ---------------------------------------↓↓↓ 华丽丽的分割线 ↓↓↓---------------------------------------------
    在连续4天高强度debug下,问题已经解决((嘻嘻(*^▽ ^)):
    stm32xxit.c的USART的IRQ函数里面不能用串口的printf或者HAL_UART_Transmit函数,
    一旦用了的话就会造成无法进入中断回调,具体错误是error8数据溢出。
    在控制变量法的对照试验下,证明了我下述的问题就是由于上述原因导致的。

    小结:
    本次问题百问无回应,自己几乎能把网上那几个固定的答案给背下来了仍无解。
    后面下定决心深入探索,不仅学会了调用报错函数查看异常原因,也对串口中断的函数调用体系有了充分的了解。总而言之,虽然过程很痛苦但是收获极大!目前很开心~
    个人收获-
    ①以后遇见BUG遵循单步查找原则
    ②成立了debug文件夹,保留源文件并上传了百度云,以后也要持续积累经验!!
    ③评论区前辈说的有道理,向下扎到根,不可只会简单调用API,了解函数底层是有必要的
    以上,
    HAL库,冲~
    ---------------------------------------↑↑↑ 华丽丽的分割线 ↑↑↑---------------------------------------------

    问题背景

    在使用STM32单片机的USART1进行串口接收中断时,发现自定义的中断回调函数不能被正常调用,关键配置过程及问题如下:
    ①CUBE配置 (注意在project manager里面选择单独为外设生产.c和.h文件)
    在这里插入图片描述
    ②添加printf重定向:

    usart.h里面添加stdio.h和string.h
    在这里插入图片描述
    usart.c里面添加printf重定向函数
    在这里插入图片描述
    while(1)里测试发送数据正常
    在这里插入图片描述

    ③验证串口中断接收功能(出现问题)
    查阅网上资料得知:
    HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)负责开启接收中断
    只有调用这个函数开启接收中断后,USARTx接收到数据才会进入到stm32xxxxit.c文件里面的USARTx_IRQHandler函数,所以把该开启函数放在while(1)上方(记得自定义一个接收数组作为开启函数的参数
    定义接收数组
    while(1)前开启接收中断

    USARTx_IRQHandler函数内容如下:
    在这里插入图片描述
    个人认为HAL_UART_IRQHandler的功能是:
    ①调用串口接收数据回调函数HAL_UART_RxCpltCallback
    ②清空一切接收标志位、并且清空接收数组缓存
    网上说回调函数HAL_UART_RxCpltCallback是一个weak弱定义函数,使用该回调函数时可以在任意处重新定义它,并且在其函数内部加入要执行的逻辑,即可在发生接收中断时执行该逻辑。
    我在main.c的USER block 4块中重定义了该回调函数:
    在这里插入图片描述
    (提示:该函数内部需要重新调用开启中断的IT函数,否则接收中断只能发生一次)
    烧录程序,
    正常情况下应该是在串口助手发送任意字符串后,串口助手上反馈:There is callback
    但实际情况是:串口助手发送字符串后,无任何反馈

    写至此,我也不知是哪里出了问题
    但通过上述知识储备和一番探索过后,我作出了以下两种可以绕过该问题的解决方案:

    绕过问题的两个方案

    方案一:不用回调函数,直接在it文件里面的IRQ函数里写逻辑

    缺点:
    ① 需要在it.c的上方引入usart.h文件
    ② main.c里面定义的接收数组要在main.h文件里extern称全局变量
    (因为IT函数HAL_UART_Receive_IT的参数需要填入接收数组,
    在main.c的while(1)上方调用了IT函数,而且在it文件里的IRQ函数内夜里调用了IT函数)

    在这里插入图片描述
    烧录程序测试,功能正常
    在这里插入图片描述

    方案二:还用回调函数,不过需要调整下官方代码顺序

    缺点:修改官方代码顺序可能会带来潜在BUG隐患
    main.c里面定义接收数组
    仍在main.c下方的USER CODE Block4里面重定义回调函数:
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    需要修改stm32xxxx.it文件中的USARTx_IRQHandler函数的内容和该回调函数内容分别如下:
    IRQ函数修改后的内容
    main.c里自定义回调函数修改后的内容

    烧录程序,功能正常
    在这里插入图片描述

    总结
    单片机型号是蓝桥杯STM32G431RBT6,本人不仅发现UART的中断的Callback不能使用,而且发现TIM定时器的输入捕获和输出比较的中断的Callback也不能正常使用,
    但是也不知道问题在哪儿,555……
    上述对于UART的中断问题没有从根本上得到解决,至此衷心希望有大佬能给与热心解答,
    如果您对绕过问题的方法有问题请在发表评论区,我看到会回复,
    如果您看出了我的问题所在亦请在评论区中指出,感激不尽0…

    展开全文
  • 二、使用USART前必知的两个函数的作用 2.1 HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) 2.2HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size...

    目录

    一、工程配置

    二、使用USART前必知的两个函数的作用

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

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

    三、代码详解

    3.1 main()函数

    3.2 两个回调函数

    四、总结


    硬件条件:带有两个usart外设(引脚空闲)的STM32开发板/工控板,用杜邦线把它俩正确的连起来。

    实现功能:

    1. stm32的usart1发送信息,发送完成后立即执行“发送完成”回调函数;
    2. stm32的usart2发送信息,发送完成后立即执行“发送完成”回调函数;
    3. stm32的usart1中断接收usart2发送的信息,接收完成后立即执行“接收完成”回调函数;
    4. stm32的usart2中断接收usart1发送的信息,接收完成后立即执行“接收完成”回调函数;

    本文默认读者已经有了如下的基本知识和技能:

    • 对stm32的usart或uart有一定的了解,包括波特率、时序信息等;
    • 会在stm32cubeide中图形化配置芯片的调试串口、时钟和代码自动生成。

    下面直接开始工程(工程中只讲述与usart有关的地方)。

    一、工程配置

    图形化界面中,usart1和usart2的配置如图1-1、图1-2所示。它们的中断优先级配置如图1-3所示。

    到此,两个usart的配置全部结束了(代码中不再添加多余的配置代码)。

    图1-1
    图1-2
    图1-3

    二、使用USART前必知的两个函数的作用

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

    • 用户在 main() 中轮询调用该函数;
    • 执行中:发送pData指针指向空间的信息+使能“发送寄存器空”中断;
    • 执行结束后:立即进入中断;
      • 在中断里,先自动调用 UART_EndTransmit_IT(UART_HandleTypeDef *huart) 函数(该函数会失能“发送完成”中断。不过无所谓,可以不用在意);
      • 中断里,之后再自动调用 HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) 回调函数(用户自定义其功能);
    • 退出中断,等待下一次信息的发送。

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

    • 用户在 main() 和回调函数 HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) 中都调用一次该函数;
    • 执行中:指定未来接收到的信息要存入的空间,即pData指针指向的空间就是之后接收到的信息要存入的空间+使能“奇偶校验错误”中断+使能“其它uart错误”中断+使能“接收寄存器非空”中断;(特别注意:该函数是不会接收信息的,只是指定信息要存入的空间)
    • 执行结束后:等待接收寄存器非空,然后进入中断;
      • 在中断里,先自动调用 UART_Receive_IT(UART_HandleTypeDef *huart) 函数(该函数会接收信息并存入上一步已经预备好的空间中+失能“奇偶校验错误”中断+失能“其它uart错误”中断+失能“接收寄存器非空”中断);
      • 中断里,之后再自动调用 HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) 回调函数(用户自定义其功能,但是用户在该函数中必须自行添加 HAL_UART_Receive_IT() 函数,以指定下一次信息待存入的空间并再次使能对应的中断功能);
    • 退出中断,等待下一次接收寄存器非空。

    三、代码详解

    3.1 main()函数

    /* USER CODE BEGIN PV */
    uint8_t RxData1 = 0x00U;    // usart1接收到的信息待存入的空间
    uint8_t RxData2 = 0x00U;    // usart2接收到的信息待存入的空间
    uint8_t TxData1 = 0x01U;    // usart1待发送的信息
    uint8_t TxData2 = 0xFFU;    // usart1待发送的信息
    /* USER CODE END PV */
    
    int main(void)
    {
      /* USER CODE BEGIN 1 */
    
      /* USER CODE END 1 */
    
      /* MCU Configuration--------------------------------------------------------*/
    
      /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
      HAL_Init();
    
      /* USER CODE BEGIN Init */
    
      /* USER CODE END Init */
    
      /* Configure the system clock */
      SystemClock_Config();
    
      /* USER CODE BEGIN SysInit */
    
      /* USER CODE END SysInit */
    
      /* Initialize all configured peripherals */
      MX_GPIO_Init();
      MX_USART1_UART_Init();
      MX_USART2_UART_Init();
      /* USER CODE BEGIN 2 */
      HAL_UART_Receive_IT(&huart1, &RxData1, sizeof(RxData1));    // 指定usart1存储接收信息所用的空间,并使能usart1的相关接收中断
      HAL_UART_Receive_IT(&huart2, &RxData2, sizeof(RxData2));    // 指定usart2存储接收信息所用的空间,并使能usart2的相关接收中断
      /* USER CODE END 2 */
    
      /* Infinite loop */
      /* USER CODE BEGIN WHILE */
      while (1)
      {
        /* USER CODE END WHILE */
    
        /* USER CODE BEGIN 3 */
    	  if(HAL_UART_Transmit_IT(&huart1, &TxData1, (uint16_t) sizeof(TxData1)) != HAL_OK)    // usart1发送信息,发完信息立即进入中断,执行用户自定义的回调函数使得TxData1的内容加1
    	  {
    		  Error_Handler();
    	  }
    	  if(HAL_UART_Transmit_IT(&huart2, &TxData2, (uint16_t) sizeof(TxData2)) != HAL_OK)    // usart2发送信息,发完信息立即进入中断,执行用户自定义的回调函数使得TxData2的内容减1
    	  {
    		  Error_Handler();
    	  }
      }
      /* USER CODE END 3 */
    }

    3.2 两个回调函数

    /*
     * 该函数是在HAL_UART_Transmit_IT()函数执行完之后立即自动调用的回调函数
     * 
     */
    void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
    {
    	if(huart->Instance == USART1)
    	{
            // 产生usart1下一次发送的信息
    		if(TxData1 == 0xFFU)
    		{
    			TxData1 = 0x01U;
    		}
    		else
    		{
    			TxData1++;
    		}
    	}
    	if(huart->Instance == USART2)
    	{
            // 产生usart2下一次发送的信息
    		if(TxData2 == 0x01U)
    		{
    			TxData2 = 0xFFU;
    		}
    		else
    		{
    			TxData2--;
    		}
    	}
    }
    /*
     * 该函数是在“接收寄存器非空”中断里自动调用的回调函数
     * 进入该函数前,usart1已经将接收到的信息存储在了RxData1中;usart2已经将接收到的信息存储在了RxData2中
     *             并且,两个usart相关的接收中断是处于失能的状态
     */
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    {
    	if(huart->Instance == USART1)
    	{
    		HAL_UART_Receive_IT(&huart1, &RxData1, sizeof(RxData1));    // 指定usart1存储下一次接收信息所用的空间,并再次使能usart1的相关接收中断
    		// 用户代码begin
    
    		// 用户代码end
    	}
    	if(huart->Instance == USART2)
    	{
    		HAL_UART_Receive_IT(&huart2, &RxData2, sizeof(RxData2));    // 指定usart2存储下一次接收信息所用的空间,并再次使能usart2的相关接收中断
    		// 用户代码begin
    
    		// 用户代码end
    	}
    }

    四、总结

    stm32的usart配置和使用流程在stm32cubeide软件中是这样的:

    1. ioc文件里图形化使能usart并配置其波特率、工作方式、中断优先级;
    2. 自动生成代码后,在main.c文件下的main()里调用一次 HAL_UART_Receive_IT() 并轮询调用 HAL_UART_Transmit_IT();
    3. 在main.c文件下的main()外用户自定义两个中断回调函数:HAL_UART_TxCpltCallback() 和 HAL_UART_RxCpltCallback();
    4. HAL_UART_RxCpltCallback() 中必须再次调用 HAL_UART_Receive_IT()。

    我遇到的错误点总结:

    1. 没有在main()里调用 HAL_UART_Receive_IT(),usart是不会进入中断去接收信息的。——阅读了stm32f1xx_hal_uart.c文件中对uart外设的说明,发现了该问题并解决。
    2. 没有在 HAL_UART_RxCpltCallback() 中再次调用 HAL_UART_Receive_IT(),usart只会响应一次中断去接收信息,之后再来新的信息就不会进入中断去接收了,更不会进入 HAL_UART_RxCpltCallback() 函数里了。——通过软件的单步调试功能和网上海量教程,发现了该问题并解决。

    所有与usart相关的函数,它们的功能,传递参数的含义、类型、取值,返回值等;所有与usart相关的结构体,它们的定义,成员变量的含义、类型、取值等,或是其它更多的信息。这些请自行在工程里的这两个文件中进行查阅:

    展开全文
  • 本文讲述关于USART接收中断的问题分析及解决。
  • 在NVIC中配置USART中断优先级: 配置时钟树 STM32L4的最高主频到80M,所以配置PLL,最后使 HCLK = 80Mhz 即可: 生成工程设置 代码生成设置 最后设置生成独立的初始化文件: 生成代码 点击 ...
  • 基于STM32,使用了USART中断接收数据,提供了Txpack和Rxpack两个结构体来定义要传输的数据的结构。
  • AVR USART接收中断程序

    千次阅读 2017-02-23 16:08:45
    使用AVR的USART进行自发自收(将发送引脚RXD短接到接收引脚TXD),发出数据:0,1,2。。。数据,能接收到自己发出的数据:0,1,2。。。使用LED作出简单指示。 USART自发自收,使用PB口的LED指示接收到的数据,...
  • 在NVIC中配置USART中断优先级: 配置时钟树 STM32L4的最高主频到80M,所以配置PLL,最后使HCLK = 80Mhz即可: 生成工程设置 代码生成设置 最后设置生成独立的初始化文件: 生成代码 点击 ...
  • 4、修改HAL_UART_RxCpltCallback中断回调函数,处理接收的数据, 5 回调函数中要调用一次HAL_UART_Receive_IT函数,使得程序可以重新触发接收中断 函数流程图: 1 HAL_UART_Receive_IT(中断接收函数) 2 USART1_...
  • STM32的USART1接收中断例程,可直接编译,下载,运行
  • STM32F207Cube库函数USART中断接收

    万次阅读 2015-04-19 21:42:28
    USART初始化部分就不...首先,如果使用了串口接收中断,就需要在初始化中打开中断以及设定中断优先级等常规操作。 HAL_UART_Init(&UartHandle) -> HAL_UART_MspInit(huart)-> /* Set Interrupt Group Priority */
  • STM32 USART1 中断接收中断发送

    热门讨论 2011-03-23 14:13:15
    STM32 103VC 串口异步传输,中断接收中断发送。
  • gd32vf_usart_test0.zip

    2019-10-30 23:03:06
    使用NucleiStudio打开工程, 代码实现了GD32VF103串口0的发送, printf支持, 接收中断, DMA等, 具体参考我的博客: GD32VF103_串口发送_printf_接收中断_DMA
  • IDLE位不会再次被置高直到RXNE位被置起(即又检测到一次空闲总线)
  • STM32 HAL实现串口中断接收

    千次阅读 2020-03-28 17:20:58
    3. 中断使能 4. 生成代码如下 /* USART6 init function */ static void MX_USART6_UART_Init(void) { huart6.Instance = USART6; huart6.Init.BaudRate = 115200; huart6.Init.WordLength = UA...
  • usart中断就会把没处理完的数据上该覆盖掉。导致数据丢失。 2.这程序需要在main中处理4个usart口的数据,这样出错的概率会更大。 提出如下解决方案: 第一:规定每条完成的数据长度,步会超过256字节。 第二:...
  • STM32串口USART1中断接收和中断发送

    千次阅读 2019-07-11 16:01:00
    先贴出中断函数:   [plain] view plain copy  void USART1_IRQHandler(void){  IF (USART_GetiTStatus(USART1, USART_IT_RXNE) != RESET) {  USART_ClearITPendingBit(USART1, USART_IT_RXNE); ...
  • STM32 USART中断

    千次阅读 2019-03-28 14:49:48
    以STM32F103系列为例: 管脚初始化: RX-----浮空输入 TX------复用推挽输出 USART初始化 USART_InitStructure.USART_... USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位数据位 USART_Ini...
  • 基于stm8的串口程序,程序用于实现stm8与上位机串口通讯
  • 上篇文章摸完了GD32F103调试小记(一)之ADC+DMA,接下来摸下GD32的USART。 DMA 容我对DMA再说几句,这玩意真的香。用32我死也要死在DMA里。虽然前期配置麻烦些,但用上后会省去CPU做很多事,减去许多不必要的程序逻辑...
  • LEC315系列北微陀螺仪stm32F1程序 usart2中断接收陀螺仪数据 usart1发送数据至终端pc 也可以通过电脑来设置传感器的相应设置,与串口连接
  • USART固件库函数介绍 usart0.c #include "usart0.h" #include "gd32vf103.h" #include "gd32vf103_libopt.h" // ************************************************************************************...
  • 改程序使用STM32F103对串口1发送使用printf函数,接收使用中断函数,可以接收字符串,整形数据等
  • STM32串口USART1的查询和中断方式程序

    热门讨论 2015-11-23 17:17:59
    资源介绍和使用方法见博客:http://www.cnblogs.com/zitech/p/4989001.html

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,848
精华内容 4,739
关键字:

usart中断接收