/******************************************************************************
* [url=home.php?mod=space&uid=288409]@file[/url] main.c
* [url=home.php?mod=space&uid=895143]@version[/url] V3.00
* $Revision: 3 $
* $Date: 18/05/30 3:53p $
* [url=home.php?mod=space&uid=247401]@brief[/url] Show how to use the UART Rx timeout function for receiving unknown data length package.
*
* SPDX-License-Identifier: Apache-2.0
* [url=home.php?mod=space&uid=17282]@CopyRight[/url] (C) 2018 Nuvoton Technology Corp. All rights reserved.
*
******************************************************************************/
#include <stdio.h>
#include "NuMicro.h"
#define FIFO_THRESHOLD 4
#define RX_BUFFER_SIZE 128
#define RX_TIMEOUT_CNT 60 //40~255
enum
{
eUART_RX_Received_Data_Finish = 0,
eUART_RX_Received_Data_NOT_Finish
};
volatile uint8_t g_au8UART_RX_Buffer[RX_BUFFER_SIZE] = {0}; // UART Rx received data Buffer (RAM)
volatile uint8_t g_bUART_RX_Received_Data_State = eUART_RX_Received_Data_NOT_Finish;
volatile uint8_t g_u8UART_RDA_Trigger_Cnt = 0; // UART RDA interrupt trigger times counter
volatile uint8_t g_u8UART_RXTO_Trigger_Cnt = 0; // UART RXTO interrupt trigger times counter
void UART02_IRQHandler(void)
{
uint8_t i;
static uint16_t u16UART_RX_Buffer_Index = 0;
if(UART_GET_INT_FLAG(UART0, UART_INTSTS_RDAINT_Msk))
{
/* UART receive data available flag */
/* Record RDA interrupt trigger times */
g_u8UART_RDA_Trigger_Cnt++;
/* Move the data from Rx FIFO to sw buffer (RAM). */
/* Every time leave 1 byte data in FIFO for Rx timeout */
for(i = 0 ; i < (FIFO_THRESHOLD - 1) ; i++)
{
g_au8UART_RX_Buffer[u16UART_RX_Buffer_Index] = UART_READ(UART0);
u16UART_RX_Buffer_Index ++;
if (u16UART_RX_Buffer_Index >= RX_BUFFER_SIZE)
u16UART_RX_Buffer_Index = 0;
}
}
else if(UART_GET_INT_FLAG(UART0, UART_INTSTS_RXTOINT_Msk))
{
/* When Rx timeout flag is set to 1, it means there is no data needs to be transmitted. */
/* Record Timeout times */
g_u8UART_RXTO_Trigger_Cnt++;
/* Move the last data from Rx FIFO to sw buffer. */
while(UART_GET_RX_EMPTY(UART0) == 0)
{
g_au8UART_RX_Buffer[u16UART_RX_Buffer_Index] = UART_READ(UART0);
u16UART_RX_Buffer_Index ++;
}
/* Clear UART RX parameter */
UART_DISABLE_INT(UART0, UART_INTEN_RDAIEN_Msk | UART_INTEN_RXTOIEN_Msk);
u16UART_RX_Buffer_Index = 0;
g_bUART_RX_Received_Data_State = eUART_RX_Received_Data_Finish;
}
}
void SYS_Init(void)
{
/* Unlock protected registers */
SYS_UnlockReg();
/*---------------------------------------------------------------------------------------------------------*/
/* Init System Clock */
/*---------------------------------------------------------------------------------------------------------*/
/* Enable HIRC and LIRC clock */
CLK_EnableXtalRC(CLK_PWRCTL_LIRCEN_Msk);
CLK_EnableXtalRC(CLK_PWRCTL_HIRCEN_Msk);
/* Wait for HIRC and LIRC clock ready */
CLK_WaitClockReady(CLK_STATUS_LIRCSTB_Msk);
CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk);
/* Select HCLK clock source as HIRC and HCLK clock divider as 1 */
CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HIRC, CLK_CLKDIV0_HCLK(1));
/* Enable UART module clock */
CLK_EnableModuleClock(UART0_MODULE);
/* Select UART module clock source as HIRC and UART module clock divider as 1 */
CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART0SEL_HIRC, CLK_CLKDIV0_UART0(1));
/*---------------------------------------------------------------------------------------------------------*/
/* Init I/O Multi-function */
/*---------------------------------------------------------------------------------------------------------*/
/* Set PB multi-function pins for UART0 RXD=PB.12 and TXD=PB.13 */
SYS->GPB_MFPH = ((SYS->GPB_MFPH & (~(SYS_GPB_MFPH_PB12MFP_Msk | SYS_GPB_MFPH_PB13MFP_Msk)))
| (SYS_GPB_MFPH_PB12MFP_UART0_RXD | SYS_GPB_MFPH_PB13MFP_UART0_TXD));
/* Lock protected registers */
SYS_LockReg();
}
void UART0_Init(void)
{
/*---------------------------------------------------------------------------------------------------------*/
/* Init UART */
/*---------------------------------------------------------------------------------------------------------*/
/* Reset UART0 */
SYS_ResetModule(UART0_RST);
/* Configure UART0 and set UART0 baud rate */
UART_Open(UART0, 115200);
/* Enable UART RDA and RX timeout interrupt */
UART_EnableInt(UART0, UART_INTEN_RDAIEN_Msk | UART_INTEN_RXTOIEN_Msk);
NVIC_EnableIRQ(UART02_IRQn);
/* Set RX Trigger Level as 4 bytes */
UART0->FIFO = ((UART0->FIFO & (~UART_FIFO_RFITL_Msk)) | UART_FIFO_RFITL_4BYTES);
/* Set Timeout time counter in 60 bit-time and enable time-out counter */
UART_SetTimeoutCnt(UART0, RX_TIMEOUT_CNT);
}
void DescriptionMessage(void)
{
printf("+----------------------------------------------------------------------+\n");
printf("| This sample code performs how to receive unknow data length package.|\n");
printf("| |\n");
printf("| (1) Please send data to UART0 Rx(PB.12) |\n");
printf("| (2) UART will receive data by UART Rx RDA and RXTO interrupt. |\n");
printf("| (3) User can modify the Rx Timeout counter RX_TIMEOUT_CNT for |\n");
printf("| diffirent timeout period. |\n");
printf("| |\n");
printf("| Description for RX_TIMEOUT_CNT : |\n");
printf("| -UART data = 8 bits |\n");
printf("| -UART Parity = None |\n");
printf("| -RX_TIMEOUT_CNT = 60 |\n");
printf("| If there is no data comes in 60 baudrate clock, |\n");
printf("| the UART Rx timeout interrupt flag will be set to 1. |\n");
printf("| RX_TIMEOUT_CNT = 60 = 6 * ( 1 start + 8 data bits + 1 stop bit ) |\n");
printf("| = 6 bytes data transmittion times |\n");
printf("+----------------------------------------------------------------------+\n\n");
UART_WAIT_TX_EMPTY(UART0);
}
/*---------------------------------------------------------------------------------------------------------*/
/* Main Function */
/*---------------------------------------------------------------------------------------------------------*/
int32_t main(void)
{
uint32_t u32ResetBufferIndex;
/* Init System, peripheral clock and multi-function I/O */
SYS_Init();
/* Init UART */
UART0_Init();
/* Print description message */
DescriptionMessage();
while(1)
{
/* Wait to receive UART data */
while(UART_RX_IDLE(UART0));
/* Start to received UART data */
g_bUART_RX_Received_Data_State = eUART_RX_Received_Data_NOT_Finish;
/* Wait for receiving UART message finished */
while(g_bUART_RX_Received_Data_State != eUART_RX_Received_Data_Finish);
printf("\nUART0 Rx Received Data : %s\n",g_au8UART_RX_Buffer);
printf("UART0 Rx RDA (Fifofull) interrupt times : %d\n",g_u8UART_RDA_Trigger_Cnt);
printf("UART0 Rx RXTO (Timeout) interrupt times : %d\n",g_u8UART_RXTO_Trigger_Cnt);
/* Reset SRAM Buffer */
u32ResetBufferIndex = 0;
while(g_au8UART_RX_Buffer[u32ResetBufferIndex] != '\0')
g_au8UART_RX_Buffer[u32ResetBufferIndex++] = '\0';
/* Reset UART interrupt parameter */
UART_EnableInt(UART0, UART_INTEN_RDAIEN_Msk | UART_INTEN_RXTOIEN_Msk);
g_u8UART_RDA_Trigger_Cnt = 0; // UART RDA interrupt times
g_u8UART_RXTO_Trigger_Cnt = 0; // UART RXTO interrupt times
}
}
|