K22中使用UART的IDLE Line功能

举报
TopSemic嵌入式 发表于 2021/10/19 00:07:46 2021/10/19
【摘要】 当UART接收的数据为不定长度时,那么该如何判断一帧数据的结束呢?我们可以使用IDLE LINE功能来判断。 同事Ji Cheng在其博客http://blog.chinaaet.com/detail/...

当UART接收的数据为不定长度时,那么该如何判断一帧数据的结束呢?我们可以使用IDLE LINE功能来判断。
同事Ji Cheng在其博客http://blog.chinaaet.com/detail/40378介绍了如何在KL26上使用这个功能,本博客在Freescale Cortex-M4核芯片K22上实现IDLE LINE功能。我这里完成的功能是:串口1使用中断方式接收数据,在接收中断服务函数中将接收到的数据再发送出去,当接收完一帧数据后,进入IDLE 中断并打印信息,以表示一帧数据的结束。
测试平台: FRDM_K22F + MQX4.2
BSP中改动的地方有:
1). user_config.h中,

打开UART1的中断功能

#define BSPCFG_ENABLE_ITTYB                       0        改为:         #define BSPCFG_ENABLE_ITTYB                       1 
  
 
  • 1

2). serial.h中,添加

#define IO_IOCTL_SERIAL_ENABLE_IDLE       _IO(IO_TYPE_SERIAL,0x1F)
  
 
  • 1

3). serl_pol_kuart.c中,_kuart_polled_ioctl()函数中添加:

  case IO_IOCTL_SERIAL_ENABLE_IDLE:
         if( *(bool *)param_ptr == TRUE )
         {
            /* enable idleline */
            sci_ptr->C2 |= UART_C2_ILIE_MASK;                                                                              sci_ptr->C1 |= UART_C1_ILT_MASK;
         }
         else
         {
            /* disable idleline */
            sci_ptr->C2 &= ~UART_C2_ILIE_MASK;
         }
 break;
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

本例程直接在hello.c文件中修改:

#include <mqx.h>
#include <bsp.h> 
#include <fio.h>


#if ! BSPCFG_ENABLE_IO_SUBSYSTEM
#error This application requires BSPCFG_ENABLE_IO_SUBSYSTEM defined non-zero in user_config.h. Please recompile BSP with this option.
#endif


#ifndef BSP_DEFAULT_IO_CHANNEL_DEFINED
#error This application requires BSP_DEFAULT_IO_CHANNEL to be not NULL. Please set corresponding BSPCFG_ENABLE_TTYx to non-zero in user_config.h and recompile BSP with this option.
#endif


/* Task IDs */
#define HELLO_TASK 5

extern void hello_task(uint32_t);


const TASK_TEMPLATE_STRUCT  MQX_template_list[] = 
{ 
    /* Task Index,   Function,   Stack,  Priority, Name,     Attributes,          Param, Time Slice */
    { HELLO_TASK,   hello_task, 1500,   8,        "hello",  MQX_AUTO_START_TASK, 0,     0 },
    { 0 }
};

void UART1_RX_ISR(void);
/*TASK*-----------------------------------------------------
* 
* Task Name    : hello_task
* Comments     :
*    This task prints " Hello World "
*
*END*-----------------------------------------------------*/
void hello_task
    (
        uint32_t initial_data
    )
{
    (void)initial_data; /* disable 'unused variable' warning */
    uint32_t result;
      MQX_FILE_PTR uart1_dev = NULL;
      bool enable_idleline = TRUE;

    printf("Hello World\n"); 

      uart1_dev=fopen( "ittyb:", NULL);
      if( uart1_dev == NULL )
    {
      /* device could not be opened */
      _task_block();
    }

     /* wait for transfer complete flag */
   result = ioctl( uart1_dev, IO_IOCTL_SERIAL_ENABLE_IDLE, &enable_idleline );
   if( result == IO_ERROR_INVALID_IOCTL_CMD )
   {
      /* ioctl not supported, use newer MQX version */
      _task_block();
   }

      _int_install_isr(INT_UART1_RX_TX, UART1_RX_ISR,NULL); 

    _task_block();
}

void UART1_RX_ISR(void)
{
    uint8_t Receive_data;
    /* Rx */
  if((UART1_BASE_PTR->S1 & UART_S1_RDRF_MASK))
  {
       Receive_data = UART1_BASE_PTR->D;
         while(!(UART1_BASE_PTR->S1 & UART_S1_TDRE_MASK));
       UART1_BASE_PTR->D = Receive_data;
    }

    /*  IDLE interrupt */
    if(UART1_S1&UART_S1_IDLE_MASK)// if IDLE Line interrupt occured
  {
        // clear interrupt flag; To clear IDLE, read UART status S1 with IDLE set and then read D
    UART1_S1 |= UART_S1_IDLE_MASK;
        Receive_data=(uint8_t)(UART1_BASE_PTR->D); 

    printf("\r\nGo to Idle line\r\n");
  }

}

/* EOF */

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93

最终实验现象为:
这里写图片描述

文章来源: blog.csdn.net,作者:TopSemic嵌入式,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/wangwenxue1989/article/details/46781545

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。