精华内容
下载资源
问答
  • HAL库串口一直发送进入不进中断BU

    千次阅读 2019-06-16 20:19:45
    这个问题前两个月就碰到了,一直没有记载,再次记载一下。 问题复现: ... 发送周期是20ms,但发送段时间后,不进入串口中断。 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart...

    这个问题前两个月就碰到了,一直没有记载,再次记载一下。

    问题复现:

    开了串口中断,

    HAL_UART_Transmit(&huart1,(uint8_t*)buf,length,0xff);

    发送周期是20ms,但发送一段时间后,不进入串口中断。

    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

    {

        if(huart->Instance==USART2)//如果是串口2

        {

            mb_poll_byte_receive(aRxBuffer2[0]);

            if(HAL_UART_Receive_IT(&huart2, (uint8_t *)aRxBuffer2, RXBUFFERSIZE)==HAL_OK) // 重新使能串口接收中断

            {

    #if USE_DEBUG

    //          调试完后不用串口发送 SEGGER_RTT 速度更快

    //          HAL_UART_Transmit(&huart1,(uint8_t*)aRxBuffer2,RXBUFFERSIZE,0xFFFF);

    //          UsrLog("uart2 data is %x",aRxBuffer2[0]);

    #endif

            }

        }

    }

    可能原因是,串口接收中断标志位没有清零。

    解决方法是:

    在发送后面在又加上

    HAL_UART_Receive_IT(&huart3, (u8 *)aRxBuffer3, RXBUFFERSIZE);

    或者

    换成了串口中断接收,DMA 发送数据(没有测试)

    或者

    把发送函数也改成中断就ok了 原因大概是HAL_UART_Transmit执行过程中被HAL_UART_Receive_IT抢占,HAL_UART_Receive_IT检测到BUSY状态就不执行了所以没有开启下一次中断。

    哪位大佬更具体的解决方法求告知啊

    参考:

    http://www.stm32cube.com/question/688

    展开全文
  • ST推的HAL库,在整个接收过程中,是没有用到串口的接收空闲中断,它的处理有三种,分别是轮询,接收完成中断(每一个字节一次),DMA接收。 整个Hal库把接收和发送过程都封装好了,就用最简单的轮询方式看,先看...
  • STM32串口一直进中断解决方法

    万次阅读 多人点赞 2014-06-14 00:11:27
    在使用USART做串口通讯时,我只把接收中断打开,并设置抢占优先级为最低个级别,而接收中断个优先级处理事情比较多,可能占用了2ms时间。当我使用9600波特率往下位机发送数据,速度非常快,就是一直按回车发!...

    今天在使用USART模块,遇到了一些问题并解决了,于是发贴共享。

    问题描述:
    在使用USART做串口通讯时,我只把接收中断打开,并设置抢占优先级为最低一个级别,而接收中断上一个优先级处理事情比较多,可能占用了2ms时间。当我使用9600波特率往下位机发送数据,速度非常快,就是一直按回车发!问题就出来,不到1分钟时间,通讯没有反应了。USART配置代码如下:

    void uart_config(void)
    {
        USART_InitTypeDef USART_InitStructure;
        USART_InitStructure.USART_BaudRate = UART_GetBaud(BaudRate);
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        USART_InitStructure.USART_StopBits = USART_StopBits_1;
        USART_InitStructure.USART_Parity = USART_Parity_No;
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
        USART_InitStructure.USART_Clock = USART_Clock_Disable;
        USART_InitStructure.USART_CPOL = USART_CPOL_Low;
        USART_InitStructure.USART_CPHA = USART_CPHA_2Edge;
        USART_InitStructure.USART_LastBit = USART_LastBit_Enable;
        /* Configure USART1 */
        USART_Init(USART1, &USART_InitStructure);
        /* Enable USART1 receive interrupt */
        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
        /* Enable the USART1 */
        USART_Cmd(USART1, ENABLE);
    }

    分析问题:

    1.为什么没有通讯了?
    通过仿真器仿真,发现程序一直进入接收中断中,由于我没有使用中断发送,于是程序就死在了接收中断,也就没有数据发送到电脑上来。接收中断代码如下:

    void UART_Receive(void)
    {
       //正在处理上一条通讯,接收到数据不处理
        if(bRecieveOK)
        {
            if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
                USART_ClearITPendingBit(USART1, USART_IT_RXNE);
            return;//processing receive data,don't receive again
        }
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
        {
            if(MoudBusExpir == 0)
            {
                ucRcePtr = 0;
                MoudBusExpir = 20;//50ms
            }
            else
                MoudBusExpir = 20;
            /* Read one byte from the receive data register */
            ucRS485Buff[ucRcePtr++] = USART_ReceiveData(USART1);
            /* Clear the USART1 Receive interrupt */
            USART_ClearITPendingBit(USART1, USART_IT_RXNE);
        }
    }

    2.为什么会一直跑到接收中断?
    断点之后发现(USART_GetITStatus(USART1, USART_IT_RXNE)==RESET的,也就是说没有数据接收到也进了中断,而且在USART配置中我也只打开了接收中断!没有数据送过来应该是不可能进入中断的!

    3.响应了什么中断?
    我想通过函数(USART_GetITStatus()把所有中断状态都读出来,但失败了,USART_IT_XXX所有中断状态都是RESET!也就是说没有中断也进入到这个中断服务程序来了!?

    4.找资料
    STM32F10x微控制器参考手册(2009年12月第10版)P541发现如下说明:

    也就是说只要接收中断打开,即RXNEIE设置为1,那么ORE中断也自动打开了。
    可是USART_GetITStatus(USART1, USART_IT_ORE )== RESET!!!!
    找到USART_GetITStatus(USART1, USART_IT_RXNE)函数,发现只有当USART_IT_ERR中断使能时,才能读到ORE中断。
    在这里要指出这个BUG:产生ORE中断了,但使用USART_GetITStatus()函数却无法读到这个中断被SET起来!

    5.把ORE中断标志位清除
    既然找到了是什么中断,那么把相应的中断标志位清除,就应该可以了吧?
    USART_ClearITPendingBit(USART1, USART_IT_ORE);
    但是,结果是没有任何效果!清除之后,马上读ORE中断状态,USART_GetITStatus(USART1, USART_IT_ORE)==RESET.程序仍然跑死在接收中断。再使用另一个函数USART_GetFlagStatus(USART1, USART_FLAG_ORE) = SET,原来ORE标志位还没有清除。

    6.问题解决
    为什么清除不掉?头疼了,再找找资料,有发现,在P523页如下图:


    接收中断程序改为(注意这一句://注意!不能使用if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)来判断):

    void UART_Receive(void)
    {
        if (USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET)//注意!不能使用if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)来判断
        {
            USART_ReceiveData(USART1);
        }
       //正在处理上一条通讯,接收到数据不处理
        if(bRecieveOK)
        {
            if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
                USART_ClearITPendingBit(USART1, USART_IT_RXNE);
            return;//processing receive data,don't receive again
        }
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
        {
            if(MoudBusExpir == 0)
            {
                ucRcePtr = 0;
                MoudBusExpir = 20;//50ms
            }
            else
                MoudBusExpir = 20;
            /* Read one byte from the receive data register */
            ucRS485Buff[ucRcePtr++] = USART_ReceiveData(USART1);
            /* Clear the USART1 Receive interrupt */
            USART_ClearITPendingBit(USART1, USART_IT_RXNE);
        }
    }

    总结:
    注意问题: 1.USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);使能了接收中断,那么ORE中断也同时被开启了。
                   2.ORE中断只能使用USART_GetFlagStatus(USART1, USART_FLAG_ORE) 读到(没有使能USART_IT_ERR中断时)

    BUG建议: 1.在STM32库中,能不能修改USART_GetITStatus()函数对USART_IT_ORE中断的处理? 也就是我只要打开了接收中断,那么有ORE中断时,我也能使用USART_GetITStatus(USART1,USART_IT_ORE)读到.
           其它:在找资料的同时,发现STM32F10x微控制器参考手册(2009年12月第10版)中文翻译P538有错误,如下图:


    英文P696如下图:






    展开全文
  • STM32串口接收中断只执行了一次

    千次阅读 2021-06-01 17:55:38
    最近调试过程中遇到一个小问题,也是大问题 网上的资料很少,记录一下,...数据只能执行一次,估计是缓冲区被占位,必须读取出来才能继续接收 日后有时间再研究一下 解决方法 加上Res = UART_ReceiveData(UART2); ...

    最近调试过程中遇到一个小问题,也是大问题
    网上的资料很少,记录一下,欢迎评论佐证~
    插入代码
    在这里插入图片描述
    中断服务函数中去掉读取Res = UART_ReceiveData(UART2); 后
    数据只能执行一次,估计是缓冲区被占位,必须读取出来才能继续接收
    日后有时间再研究一下

    解决方法 加上Res = UART_ReceiveData(UART2);

    展开全文
  • 中断的方法和计数器的方法差不多,只是当计算器溢出时便产生一次中断,用户可以在中断程序中置标志,程序不断的查询该标志来决定是否发送或接收下一位,当然程序中需对中断进行初始化,同时编写中断程序。...
  • 问题:程序烧芯片后,第一次可以正常实现,但后续就无法再进入中断了。用硬件仿真模式观察发现第一次发完了数已经跳出中断回到main函数,再发数就不再进入中断了。 解决:各个功能都正常,但进入中断后“清除中断...

    环境:使用STR912FAW44芯片,用MAX487将UART转成485信号与上位机联接。欲实现功能是:当从串口调试助手发一个数,进入串口中断后,返回1~10十个数。

    问题:程序烧进芯片后,第一次可以正常实现,但后续就无法再进入中断了。用硬件仿真模式观察发现第一次发完了数已经跳出中断回到main函数,再发数就不再进入中断了。

    解决:各个功能都正常,但进入中断后“清除中断标志位”,发送完成标志位等待也都正常配置。最终是试验了将串口助手发出的数给从中断里发回来,发现正常,但屏蔽发原数的语句后,在中断里发送连续1~10个数,只能实现一次。通过试验,发现必须加入语句读取串口助手的数据,程序成功。

    STR912的库函数里的清除中断标志的语句是个虚假的语句,并没有真正清除中断标志,只有读出串口助手发送的数据,才能真的清除中断标志,第n次发送数据都可以正常回复数据。

     

    展开全文
  • STM32串口中断卡死主循环一直进中断问题分析

    万次阅读 多人点赞 2019-07-05 12:28:20
    项目中,使用STM32作为主控,程序运行段时间后概率出现主循环卡死现象。 问题分析如下: 1、程序USART2不停接收并处理串口数据,波特率115200; 2、主循环卡死; 3、USART1中断及TIM2中断响应函数运行...
  • STM32使用串口中断接收字符串,可重复接收,使用\r\n作为接收结束的标志,可以根据需要自定义结束的标志
  • TI DSP 28335 串口FIFO中断接收程序 打开后在工程添加文件中的comm_2int_fifo.c文件即可。 该文件已经本人调试成功可用。
  • 【STM32的HAL库开发】串口中断开发环境在main.c添加代码(1/2)在stm32f4xx_it.c添加代码(2/2)注意附代码 开发环境 cubemx V5.5.0 + MDK Keil V5.29.0.0 + STM32F429NIH 在main.c添加代码(1/2) 在main函数中,初始化...
  • 想写串口中断,在输入一些值的时候能跳入中断响应, 中断标志位,子中断标志位,中断屏蔽位,子中断屏蔽位都有定义, 在串口输入一些值后,能显示进入了中断并且能读到, 但是会一直循环进入串口中断, SRCPND1 ...
  • 现象:第一次从stop模式唤醒时串口能正常通信,判断一段时间后无数据则再一次进入stop mode,然后再一次唤醒,此时串口无法输出。后发现原因是串口重新初始化时HAL_UART_Init()函数中会判断if(huart->State =...
  • 我们在接收不定长数据时,常常会使用IDLE中断,但是在初始化完uart后,立即使能IDLE中断会马上进入IDLE中断,这个时候需要在初始化完uart后进行适当的延迟。 ...
  • 为了解决stm32f103串口一次接收不定长度且没有结束标志的数据,选择空闲中断接收。经过修改,目前收发稳定,仅供参考。
  • STM32串口空闲中断--我入的个坑

    千次阅读 2020-09-15 09:07:59
    串口使能后,如果关闭接收,再重新打开,空闲中断标志会被置位,再关闭接收,再重新打开,空闲中断标志又会被置位,如此反复。。。 切记重新打开串口接收,马上清空闲中断标志(如果要使用空闲中断),否则会一直进入...
  • 串口接收中断进不去,如何解决

    万次阅读 2017-03-21 09:12:58
    串口配置代码 void USART_Configuration(void) {  GPIO_InitTypeDef GPIO_InitStructure;  USART_InitTypeDef USART_InitStructure;  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA |RC
  • 串口接收中断不起作用的问题

    千次阅读 2020-01-08 00:14:30
    这两天重新开始学STM32, 调试串口,配置好了串口接收中断,却怎么也不起作用,后来经过检查师main函数结束了, 程序已经停止来, 在main函数的结尾加while(1)循环,串口中断正常了。 ...
  • STM32的CubeMX关于串口中断

    千次阅读 2018-07-15 16:23:03
    作为刚工作不久的小白,刚接触STM32的HAL库...1、关于串口的初始化函数:  MX_USART2_UART_Init()---波特率、奇偶校验等配置  HAL_UART_Init()---会将 huart->RxState = HAL_UART_STATE_READY;  HAL_U...
  • stm32L053 低功耗设计开发MCU,使用STM32 官方的驱动库HAL,采用串口中断接收方式,接收不定长数据,发送则采用DMA发送,项目中稳定使用的USART驱动方式。
  • 中断与字节中断混用的玄学BUG
  • ZYNQ基础----串口中断

    千次阅读 2020-07-03 10:40:52
    本篇博客介绍串口中断模式。 串口初始化流程 序号 流程 函数 1 查找GPIO配置结构体 XUartPs_LookupConfig() 2 根据结构体初始化GPIO XUartPs_CfgInitialize() 3 设置波特率 :115200 XUartPs_...
  • 模拟串口模拟串口中断接收和发送

    千次阅读 2020-06-08 17:54:41
    1、配置GPIO4为中断输入,GPIO5为输出。 2、中断接收代码: #define RECVSIZE 50 #define SET_GPIO5_HIGH GPIO_SetPins(GPIO_PIN_5); #define SET_GPIO5_LOW GPIO_ResetPins(GPIO_PIN_5); unsigned char receive...
  • STM32串口中断接收帧数据

    千次阅读 2021-01-03 22:52:57
    比如说给单片机一次发来1个字节,或者一次发来8个字节,这些一次发来的数据,就称为一帧数据,也可以叫做一包数据。因为只有接收到一帧数据以后,你才可以判断这次收了几个字节和每个字节的内容是否符合协议要求。...
  • STM32CubeMX之串口使用(中断方式)

    千次阅读 多人点赞 2020-07-07 00:40:56
    篇 说了 STM32CubeMX之串口的使用 (阻塞模式) ,这章来说说串口中断模式收发数据。 文章目录概述. 在STM32CubeMX 图形化中开启串口中断二. 串口中断相关函数介绍三. 串口中断函数使用实例四. HAL库中的串口...
  • STM32 串口中断总结

    万次阅读 多人点赞 2017-12-25 17:03:17
    本文以USART1为例,叙述串口中断的编程过程。 1、先来讲述一下在应用串口中断时涉及到的一些库文件。 首先对于STM32外设库文件的应用编程,misc.c和stm32f10x_rcc.c是肯定要添加到。 接下来就是我们要用到的相关...
  • 本例程通过PC机的串口调试助手将数据发送至STM32,接收数据后将所接收的数据又发送至PC机,具体下面详谈。 实例: void USART1_IRQHandler(u8 GetData) { u8 BackData; if(USART_GetITStatus(USART1, USART_IT_...
  • STM32 HAL CubeMX 串口IDLE接收空闲中断+DMA

    万次阅读 多人点赞 2020-03-22 11:01:56
    关于DMA原理部分讲解,及CubeMx配置部分,请参考该文章 【STM32】HAL库 STM32CubeMX...种是: IDLE 接收空闲中断+RXNE接收数据中断 都可完成串口数据的收发 知识点介绍: STM32 IDLE 接收空闲中断 功能: 在使用...
  • 在上一篇文章STM32单片机串口空闲中断接收不定长数据中介绍了利用串口空闲中断接收不定长数据,这种方式有一个问题就是串口每接收到一个字节就会进入一次中断,如果发送的数据比较频繁,那么串口中断就会不停打断主...
  • 在使用单片机的串口通信功能时,常用的接收数据方法是通过固定...在STM32单片机中串口提供了个更好用的功能,就是空闲中断功能。也就是说当帧数据发送结束后,就会产生个空闲中断。这样就可以利用这个空闲中断...
  • stm32串口中断接收帧数据

    万次阅读 多人点赞 2017-02-18 17:11:53
    最近用到stm32的串口中断一个字符个字符接收好心累,网上度了一下发现了篇好的帖子,和大家分享一下,原贴地址:http://www.51hei.com/bbs/dpj-39885-1.html 再次感谢原贴楼主的分享,为了方便大家,我把原文...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 31,535
精华内容 12,614
关键字:

串口进一次中断