K22中使用UART的IDLE Line功能

原创 2015年07月06日 23:52:38

当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 

2). serial.h中,添加

#define IO_IOCTL_SERIAL_ENABLE_IDLE       _IO(IO_TYPE_SERIAL,0x1F)

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;

本例程直接在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 */

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

STM32F10x 学习笔记6(USART实现串口通讯 2)

这次讲讲利用串口收发中断来进行串口通讯。STM32 上为每个串口分配了一个中断。也就是说无论是发送完成还是收到数据或是数据溢出都产生同一个中断。程序需在中断处理函数中读取状态寄存器(USART_SR)...
  • liyuanbhu
  • liyuanbhu
  • 2013年05月05日 12:00
  • 29709

STM32串口使用IDLE中断接收不定长数据原理与源程序

原文来自 http://www.51hei.com/bbs/dpj-39885-1.html今天说一下STM32单片机的接收不定长度字节数据的方法。由于STM32单片机带IDLE中断,所以利用这个中...
  • phker
  • phker
  • 2016年07月16日 18:20
  • 6984

STM32串口使用IDLE中断接收不定长数据原理与源程序

原文来自 http://www.51hei.com/bbs/dpj-39885-1.html今天说一下STM32单片机的接收不定长度字节数据的方法。由于STM32单片机带IDLE中断,所以利用这个中...
  • phker
  • phker
  • 2016年07月16日 18:20
  • 6984

Python Shell(command line模式和GUI模式)区别

http://www.crifan.com/how_to_do_python_development_under_windows_environment/
  • u010807846
  • u010807846
  • 2014年08月07日 14:28
  • 3723

零基础学python-1.2 什么是idle

(下面是摘自百度百科) IDLE是开发python程序的基本IDE(集成开发环境),具备基本的IDE的功能,是非商业Python开发的不错的选择。当安装好python以后,IDLE就自动安装好了,不需...
  • raylee2007
  • raylee2007
  • 2015年08月09日 16:20
  • 4464

RabbitMQ学习笔记

1. 应用场景    RabbitMQ,或者说AMQP解决了什么问题,或者说它的应用场景是什么? 对于一个大型的软件系统来说,它会有很多的组件或者说模块或者说子系统或者(subsystem or C...
  • doc_sgl
  • doc_sgl
  • 2016年01月31日 18:22
  • 3611

STM32F10x uart初始化以及寄存器说明

USART(Universal Synchronous Asynchronous Receiver Transmitter) 也就是通用同步异步收发。它根据NRZ非同步串行数据工业标准,提供了灵活的全...
  • hongzg1982
  • hongzg1982
  • 2017年02月22日 23:40
  • 701

写python使用IDLE如何实现调试功能

最近初学python,刚开始使用IDLE,觉得既小巧又好用,但是写代码难免不会遇到需要调试的情况,这时候查看网上的资料,基本没有详细说明IDLE的调试功能的,在这里好好总结下自己的发现。1. 进入调试...
  • u012814856
  • u012814856
  • 2017年02月09日 23:46
  • 3465

Ubuntu系统下,Python的使用和idle的安装使用

1.  Python 安装 得到所有 Python相关软件最直接的方法就是去访问它的网站(http://python.org),或者(http://corepython.com)。 Python的安装...
  • bingqilin_
  • bingqilin_
  • 2015年08月05日 11:02
  • 12342

动静结合学内核:linux idle进程和init进程浅析

退休的贵族进程 0号进程 所有进程的祖先叫做进程0 在系统初始化阶段由start_kernel()函数从无到有手工创建的一个内核线程 进程0最后的初始化工作创建init内核线程,此后运行cp...
  • titer1
  • titer1
  • 2015年03月19日 21:50
  • 3023
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:K22中使用UART的IDLE Line功能
举报原因:
原因补充:

(最多只允许输入30个字)