K22中使用UART的IDLE Line功能
【摘要】
当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)