跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
折叠
品牌标识

YunTu Forum

YTMicro.com
  1. 主页
  2. Discussion & Question
  3. YTM32B1H系列
  4. YTM32B1HA01 因没有清空中断标志位,导致串口中断一直触发的问题

YTM32B1HA01 因没有清空中断标志位,导致串口中断一直触发的问题

已定时 已固定 已锁定 已移动 未解决 YTM32B1H系列
12 帖子 2 发布者 47 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • huorunfaH 离线
    huorunfaH 离线
    huorunfa
    编写于 最后由 编辑
    #1

    测试现象:MCU没有任何日志输出,外设供电正常,看门狗正常喂狗(硬件定时器中断回调函数中喂狗),Ozone调试器连进去后显示 LINFlexD_UART_DRV_RxIRQHandler 中断回调函数一直在触发,但是isRxBusy 状态位处于false,导致中断flag没有清除,中断一直在触发。(已知MCU UART0 对端连接PC端,但是测试过程中 PC端没有向串口发送数据)。帮忙看下该问题应该如何修复。
    8ef69452-c82f-4cb7-bcf9-91057a808802-2eb115e01bd5f99cee21e9fd625909f.png
    9d5eae25-ebfc-4eb8-84a0-f81788bc8843-89a01268b02b7cdc70ffe463c46e13b.png
    串口中断状态寄存器如下:
    17e0de43-f414-4159-81ec-997084567156-6f816a50c160593e2189c5270ecdcf8.png

    1 条回复 最后回复
    0
    • DigaD 离线
      DigaD 离线
      Diga
      编写于 最后由 编辑
      #2

      有可能是你配置接收 8 个字节,实际收到超过 8 个字节

      1 条回复 最后回复
      0
      • huorunfaH 离线
        huorunfaH 离线
        huorunfa
        编写于 最后由 编辑
        #3
        1. 软件内部有接收动作,但是测试过程中对端没有发出过数据,为什么会触发接收中断?
        2. “配置接收 8 个字节,实际收到超过 8 个字节”出现这种情况会导致中断一直触发吗?实际开发过程中是避免不了有这种情况出现的。
        1 条回复 最后回复
        0
        • DigaD 离线
          DigaD 离线
          Diga
          编写于 最后由 编辑
          #4
          1. 看状态应该是有噪声,noise flag 有置起,建议用示波器看一下总线
          2. 如果你确定个数的,那就正确设置个数,上层协议应该是要规定的。如果不定长的帧,那就不能设置较小的接收值,采用不定长帧的接收方式,demo 里有不定长接收
          1 条回复 最后回复
          0
          • huorunfaH 离线
            huorunfaH 离线
            huorunfa
            编写于 最后由 编辑
            #5

            示波器看着没啥问题,这个也是偶发性的,当前SDK是不是没有处理这种情况?

            1 条回复 最后回复
            0
            • huorunfaH 离线
              huorunfaH 离线
              huorunfa
              编写于 最后由 编辑
              #6

              噪声会导致 DRF_RFE 接收中断标志置位吗?现场问题是 DRF_RFE 置位,但是 uartState->isRxBusy 没有置位,这个中断清不掉

              1 条回复 最后回复
              0
              • DigaD 离线
                DigaD 离线
                Diga
                编写于 最后由 编辑
                #7

                我猜测:在你的代码里,应该是 LINFlexD_UART_DRV_CompleteReceiveUsingInterrupts 这个函数去把 isRxBusy 设置成 false,但是在这之前,接收中断就已经关了。但现在你的状态是 isRxBusy 是 false,但中断仍使能,就会导致一直进接收中断,却没法接收数据。还是建议自查一下代码

                1 条回复 最后回复
                0
                • huorunfaH 离线
                  huorunfaH 离线
                  huorunfa
                  编写于 最后由 编辑
                  #8

                  image.png
                  如果此处触发串口异常中断调用 LINFlexD_UART_DRV_ErrIRQHandler -> LINFlexD_UART_DRV_CompleteReceiveUsingInterrupts 清除 isRxBusy 后,LINFlexD_UART_DRV_StartReceiveUsingInterrupts 继续运行,执行 /* Enable the receiver */
                  LINFlexD_SetReceiverState(base, true);

                      /* Enable receive data full interrupt */
                      LINFlexD_SetInterruptMode(base, LINFlexD_DATA_RECEPTION_COMPLETE_INT, true); 是否会导致这个问题
                  
                  1 条回复 最后回复
                  0
                  • huorunfaH 离线
                    huorunfaH 离线
                    huorunfa
                    编写于 最后由 编辑
                    #9

                    image.png

                    1 条回复 最后回复
                    0
                    • DigaD 离线
                      DigaD 离线
                      Diga
                      编写于 最后由 编辑
                      #10

                      image.png

                      1 条回复 最后回复
                      0
                      • DigaD 离线
                        DigaD 离线
                        Diga
                        编写于 最后由 编辑
                        #11

                        把你流程讲一下,正常流程是不可能出现 isRxBusy = false,中断仍使能的情况。你有异步调用开启接收,或者 abort 接收?

                        1 条回复 最后回复
                        0
                        • huorunfaH 离线
                          huorunfaH 离线
                          huorunfa
                          编写于 最后由 编辑
                          #12

                          我们当前的流程是任务A负责调用 LINFlexD_UART_DRV_ReceiveData 开启接收,之后等待接收回调函数触发。另有一个软件定时器监控接收超时,超时后会调用 LINFlexD_UART_DRV_AbortReceivingData 将接收abort。(已知软件定时器不会抢占 任务A 的时间片,因此不会出现任务A执行 LINFlexD_UART_DRV_ReceiveData 接口的同时被软件定时器回调函数打断)。
                          我刚刚的意思是任务A执行LINFlexD_UART_DRV_ReceiveData 的过程被LINFlexD_UART_DRV_ErrIRQHandler 打断进而有概率出现“状态是 isRxBusy 是 false,但中断仍使能”的情况

                          1 条回复 最后回复
                          0

                        • 云途开发生态介绍

                          快速上手云途开发生态

                        • 云途论坛规则/Yuntu Forum Rules

                          发帖前请查看

                        • YT CONFIG TOOL调查问卷

                          帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...

                        • can
                          28
                          demo
                          26
                          uds
                          14
                          lin stack
                          13
                          fbl
                          6
                          md14
                          6
                          yt-link
                          6
                          adc模块
                          4
                          Online Users
                          skai353535S
                          skai353535
                          JETTJ
                          JETT
                          李秉薇李
                          李秉薇
                          • 登录

                          • 登录或注册以进行搜索。
                          • 第一个帖子
                            最后一个帖子
                          0
                          • 版块
                          • 最新
                          • 标签
                          • 热门