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

YunTu Forum

YTMicro.com
  1. 主页
  2. Discussion & Question
  3. YTM32B1L系列
  4. 关于LE05串口回显

关于LE05串口回显

已定时 已固定 已锁定 已移动 已解决 YTM32B1L系列
8 帖子 2 发布者 2.2k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • yishui66Y 离线
    yishui66Y 离线
    yishui66
    写于 最后由 yishui66 编辑
    #1
    此主題已被删除!
    1 条回复 最后回复
    0
    • yishui66Y 离线
      yishui66Y 离线
      yishui66
      写于 最后由 yishui66 编辑
      #4

      Diga 谢谢支持。回调函数里没有成功触发过UART_EVENT_TIMEOUT,可以提供一下具体用法吗?我在中断配置结构体对空闲中断进行使能了。即.idleErrorIntEnable=true,

      ①回调函数在接收到的字节数不满预期需接收的字节数时,只会触发UART_EVENT_ERROR事件,并且此时UART_DRV_GetReceiveStatus(INST_UART1, &g_rxRemainNum);获取到的剩余接收字节数是对的

      void uart1_RX_Callback(void *uartState, uart_event_t event, void *userData)
      {
          (void)uartState;
          (void)userData;
          if (event == UART_EVENT_END_TRANSFER)
          {
              g_rxComplete = true;
          }
          else if (event == UART_EVENT_TIMEOUT)
          {
              UART_DRV_GetReceiveStatus(INST_UART1, &g_rxRemainNum);
              g_TimeoutFlag = true;
          } 
         else 
         {
              UART_DRV_GetReceiveStatus(INST_UART1, &g_rxRemainNum);
      	PRINTF("Number of remaining received bytes is %d\r\n", g_rxRemainNum);
      	PRINTF("event is %x\r\n",event);
      	}
      		
      }
      

      ②这是我设置超时值的写法,有问题吗?我这么写后回调函数都无法正确触发了

          UART_Type *uartPtr;
      
          uint32_t ctrl1Value = uartPtr->CTRL1;
          // 清除IDLESZ位(18 - 16位)
          ctrl1Value &= ~(0x7 << 16);
          // 设置IDLESZ为011b(3)
          ctrl1Value |= (0x3 << 16);
          // 写回修改后的值到CTRL1寄存器
          uartPtr->CTRL1 = ctrl1Value;
      

      ③以下是我的main.c

      int main(void)
      {
      
          /* USER CODE BEGIN 1 */
          status_t status = STATUS_SUCCESS;
          UART_Type *uartPtr;
          /* USER CODE END 1 */ 
          Board_Init();
          /* USER CODE BEGIN 2 */
      
          PRINTF("Build %s %s\n", __DATE__, __TIME__);
          PRINTF("UART Idle Interrupt Demo!\r\n");
      
          // 读取CTRL1寄存器的值
          uint32_t ctrl1Value = uartPtr->CTRL1;
          // 清除IDLESZ位(18 - 16位)
          ctrl1Value &= ~(0x7 << 16);
          // 设置IDLESZ为011b(3)
          ctrl1Value |= (0x3 << 16);
          // 写回修改后的值到CTRL1寄存器
          uartPtr->CTRL1 = ctrl1Value;
      		
          UART_DRV_InstallRxCallback(INST_UART1, uart1_RX_Callback, NULL);
          UART_DRV_InstallTxCallback(INST_UART1, uart1_TX_Callback, NULL);
      		
          while (1)
          {
      	status |=UART_DRV_ReceiveData(INST_UART1, g_RecData, UART_TX_RX_SIZE);
              /* Wait for reception to complete */
              while ((!g_rxComplete) && (!g_TimeoutFlag))
                  ;
      
      	if (g_TimeoutFlag)
              {
                  PRINTF("Number of remaining received bytes is %d\r\n", g_rxRemainNum);
              }
              if (g_rxComplete)
              {
                  UART_DRV_GetReceiveStatus(INST_UART1, &g_rxRemainNum);
      
              }
      	status |=UART_DRV_SendData(INST_UART1, g_RecData,UART_TX_RX_SIZE - g_rxRemainNum);
      	while (!g_txComplete)
                  ;
              PRINTF("\r\n");
      				
      	g_rxComplete = false;
              g_txComplete = false;
      	g_TimeoutFlag = false;
      
              if (status != STATUS_SUCCESS)
              {
                  break;
              }
      
          }
      
          PRINTF("UART Idle Interrupt Demo End!\r\n");
          /* USER CODE END 2 */
      
          /* Infinite loop */
          /* USER CODE BEGIN WHILE */
          while (1)
          {
              /* USER CODE END WHILE */
              /* USER CODE BEGIN 3 */
          }
          /* USER CODE END 3 */
      }
      
      1 条回复 最后回复
      0
      • yishui66Y 离线
        yishui66Y 离线
        yishui66
        写于 最后由 yishui66 编辑
        #2

        大家好,问题已解决,是我的自己使用不规范的缘故;但是串口是否确定没有UART_EVENT_TIMEOUT事件?RM手册未找到相关描述,且UART_DRV_GetReceiveStatus函数也没有实际意义

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

          有个 idle 可以用来判断超时,即当前开始接收后,MCU 收到若干数据,后总线不发送数据,直到 IDLE 时间超过 IDLESZ,即会产生 IDLE 事件。
          这个 API 可以在异步传输时判断当前传输状态

          image.png

          image.png

          1 条回复 最后回复
          0
          • yishui66Y 离线
            yishui66Y 离线
            yishui66
            写于 最后由 yishui66 编辑
            #4

            Diga 谢谢支持。回调函数里没有成功触发过UART_EVENT_TIMEOUT,可以提供一下具体用法吗?我在中断配置结构体对空闲中断进行使能了。即.idleErrorIntEnable=true,

            ①回调函数在接收到的字节数不满预期需接收的字节数时,只会触发UART_EVENT_ERROR事件,并且此时UART_DRV_GetReceiveStatus(INST_UART1, &g_rxRemainNum);获取到的剩余接收字节数是对的

            void uart1_RX_Callback(void *uartState, uart_event_t event, void *userData)
            {
                (void)uartState;
                (void)userData;
                if (event == UART_EVENT_END_TRANSFER)
                {
                    g_rxComplete = true;
                }
                else if (event == UART_EVENT_TIMEOUT)
                {
                    UART_DRV_GetReceiveStatus(INST_UART1, &g_rxRemainNum);
                    g_TimeoutFlag = true;
                } 
               else 
               {
                    UART_DRV_GetReceiveStatus(INST_UART1, &g_rxRemainNum);
            	PRINTF("Number of remaining received bytes is %d\r\n", g_rxRemainNum);
            	PRINTF("event is %x\r\n",event);
            	}
            		
            }
            

            ②这是我设置超时值的写法,有问题吗?我这么写后回调函数都无法正确触发了

                UART_Type *uartPtr;
            
                uint32_t ctrl1Value = uartPtr->CTRL1;
                // 清除IDLESZ位(18 - 16位)
                ctrl1Value &= ~(0x7 << 16);
                // 设置IDLESZ为011b(3)
                ctrl1Value |= (0x3 << 16);
                // 写回修改后的值到CTRL1寄存器
                uartPtr->CTRL1 = ctrl1Value;
            

            ③以下是我的main.c

            int main(void)
            {
            
                /* USER CODE BEGIN 1 */
                status_t status = STATUS_SUCCESS;
                UART_Type *uartPtr;
                /* USER CODE END 1 */ 
                Board_Init();
                /* USER CODE BEGIN 2 */
            
                PRINTF("Build %s %s\n", __DATE__, __TIME__);
                PRINTF("UART Idle Interrupt Demo!\r\n");
            
                // 读取CTRL1寄存器的值
                uint32_t ctrl1Value = uartPtr->CTRL1;
                // 清除IDLESZ位(18 - 16位)
                ctrl1Value &= ~(0x7 << 16);
                // 设置IDLESZ为011b(3)
                ctrl1Value |= (0x3 << 16);
                // 写回修改后的值到CTRL1寄存器
                uartPtr->CTRL1 = ctrl1Value;
            		
                UART_DRV_InstallRxCallback(INST_UART1, uart1_RX_Callback, NULL);
                UART_DRV_InstallTxCallback(INST_UART1, uart1_TX_Callback, NULL);
            		
                while (1)
                {
            	status |=UART_DRV_ReceiveData(INST_UART1, g_RecData, UART_TX_RX_SIZE);
                    /* Wait for reception to complete */
                    while ((!g_rxComplete) && (!g_TimeoutFlag))
                        ;
            
            	if (g_TimeoutFlag)
                    {
                        PRINTF("Number of remaining received bytes is %d\r\n", g_rxRemainNum);
                    }
                    if (g_rxComplete)
                    {
                        UART_DRV_GetReceiveStatus(INST_UART1, &g_rxRemainNum);
            
                    }
            	status |=UART_DRV_SendData(INST_UART1, g_RecData,UART_TX_RX_SIZE - g_rxRemainNum);
            	while (!g_txComplete)
                        ;
                    PRINTF("\r\n");
            				
            	g_rxComplete = false;
                    g_txComplete = false;
            	g_TimeoutFlag = false;
            
                    if (status != STATUS_SUCCESS)
                    {
                        break;
                    }
            
                }
            
                PRINTF("UART Idle Interrupt Demo End!\r\n");
                /* USER CODE END 2 */
            
                /* Infinite loop */
                /* USER CODE BEGIN WHILE */
                while (1)
                {
                    /* USER CODE END WHILE */
                    /* USER CODE BEGIN 3 */
                }
                /* USER CODE END 3 */
            }
            
            1 条回复 最后回复
            0
            • DigaD 离线
              DigaD 离线
              Diga
              写于 最后由 编辑
              #5

              那个是 LINFlexD 模块的 UART 模式超时功能,YTM32B1LE0 是 UART 模块,没有这个 event

              yishui66Y 1 条回复 最后回复
              0
              • yishui66Y 离线
                yishui66Y 离线
                yishui66
                在 回复了 Diga 最后由 编辑
                #6

                Diga 所以LE0 的 UART 模块只能接收刚好是预期字节数的数据,对吧?

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

                  那倒不至于,模块内部 IDLE 事件就是用来接收不定长数据的,例如你设置接收 10 字节,实际发了 8 字节就结束了,等到 IDLE 事件置起,就可以断定此刻传输完成,即终止此次传输。

                  yishui66Y 1 条回复 最后回复
                  0
                  • yishui66Y 离线
                    yishui66Y 离线
                    yishui66
                    在 回复了 Diga 最后由 编辑
                    #8

                    Diga 感谢,功能已经实现。

                    1 条回复 最后回复
                    0
                    • ,FrankieF Frankie 将这个主题转为问答主题
                    • ,FrankieF Frankie 将这个主题标记为已解决

                  • 云途开发生态介绍

                    快速上手云途开发生态

                  • 云途论坛规则/Yuntu Forum Rules

                    发帖前请查看

                  • YT CONFIG TOOL调查问卷

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

                  • can
                    25
                    demo
                    22
                    lin stack
                    13
                    uds
                    13
                    md14
                    6
                    yt-link
                    6
                    fbl
                    5
                    adc模块
                    4
                    Online Users
                    马密源马
                    马密源
                    • 登录

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