- /****************************************************************************
- * [url=home.php?mod=space&uid=288409]@file[/url] main.c
- * [url=home.php?mod=space&uid=895143]@version[/url] V1.00
- * $Revision: 4 $
- * $Date: 14/01/28 11:45a $
- * [url=home.php?mod=space&uid=247401]@brief[/url] M051 Series UART Interface Controller Driver Sample Code
- *
- * @note
- * Copyright (C) 2011 Nuvoton Technology Corp. All rights reserved.
- *
- ******************************************************************************/
- #include <stdio.h>
- #include "M051Series.h"
- #define PLL_CLOCK 50000000
- #define RXBUFSIZE 1024
- /*---------------------------------------------------------------------------------------------------------*/
- /* Global variables */
- /*---------------------------------------------------------------------------------------------------------*/
- uint8_t g_u8RecData[RXBUFSIZE] = {0};
- volatile uint32_t g_u32comRbytes = 0;
- volatile uint32_t g_u32comRhead = 0;
- volatile uint32_t g_u32comRtail = 0;
- volatile int32_t g_bWait = TRUE;
- /*---------------------------------------------------------------------------------------------------------*/
- /* Define functions prototype */
- /*---------------------------------------------------------------------------------------------------------*/
- int32_t main(void);
- void UART_TEST_HANDLE(void);
- void UART_FunctionTest(void);
- void SYS_Init(void)
- {
- /*---------------------------------------------------------------------------------------------------------*/
- /* Init System Clock */
- /*---------------------------------------------------------------------------------------------------------*/
- /* Enable Internal RC 22.1184MHz clock */
- CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);
- /* Waiting for Internal RC clock ready */
- CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);
- /* Switch HCLK clock source to Internal RC and HCLK source divide 1 */
- CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1));
- /* Enable external XTAL 12MHz clock */
- CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk);
- /* Waiting for external XTAL clock ready */
- CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk);
- /* Set core clock as PLL_CLOCK from PLL */
- CLK_SetCoreClock(PLL_CLOCK);
- /* Enable UART module clock */
- CLK_EnableModuleClock(UART0_MODULE);
- /* Select UART module clock source */
- CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1));
- /*---------------------------------------------------------------------------------------------------------*/
- /* Init I/O Multi-function */
- /*---------------------------------------------------------------------------------------------------------*/
- /* Set P3 multi-function pins for UART0 RXD and TXD */
- SYS->P3_MFP &= ~(SYS_MFP_P30_Msk | SYS_MFP_P31_Msk);
- SYS->P3_MFP |= (SYS_MFP_P30_RXD0 | SYS_MFP_P31_TXD0);
- }
- void UART0_Init()
- {
- /*---------------------------------------------------------------------------------------------------------*/
- /* Init UART */
- /*---------------------------------------------------------------------------------------------------------*/
- /* Reset IP */
- SYS_ResetModule(UART0_RST);
- /* Configure UART0 and set UART0 Baudrate */
- UART_Open(UART0, 115200);
- }
- /*---------------------------------------------------------------------------------------------------------*/
- /* UART Test Sample */
- /* Test Item */
- /* It sends the received data to HyperTerminal. */
- /*---------------------------------------------------------------------------------------------------------*/
- /*---------------------------------------------------------------------------------------------------------*/
- /* MAIN function */
- /*---------------------------------------------------------------------------------------------------------*/
- int main(void)
- {
- /* Unlock protected registers */
- SYS_UnlockReg();
- /* Init System, IP clock and multi-function I/O */
- SYS_Init();
- /* Lock protected registers */
- SYS_LockReg();
- /* Init UART0 for printf and testing */
- UART0_Init();
- /*---------------------------------------------------------------------------------------------------------*/
- /* SAMPLE CODE */
- /*---------------------------------------------------------------------------------------------------------*/
- printf("\n\nCPU [url=home.php?mod=space&uid=72445]@[/url] %dHz\n", SystemCoreClock);
- printf("\n\nUART Sample Program\n");
- /* UART sample function */
- UART_FunctionTest();
- }
- /*---------------------------------------------------------------------------------------------------------*/
- /* ISR to handle UART Channel 0 interrupt event */
- /*---------------------------------------------------------------------------------------------------------*/
- void UART0_IRQHandler(void)
- {
- UART_TEST_HANDLE();
- }
- /*---------------------------------------------------------------------------------------------------------*/
- /* UART Callback function */
- /*---------------------------------------------------------------------------------------------------------*/
- void UART_TEST_HANDLE()
- {
- uint8_t u8InChar = 0xFF;
- uint32_t u32IntSts = UART0->ISR;
- if(u32IntSts & UART_ISR_RDA_INT_Msk)
- {
- printf("\nInput:");
- /* Get all the input characters */
- while(UART_IS_RX_READY(UART0))
- {
- /* Get the character from UART Buffer */
- u8InChar = UART_READ(UART0);
- printf("%c ", u8InChar);
- if(u8InChar == '0')
- {
- g_bWait = FALSE;
- }
- /* Check if buffer full */
- if(g_u32comRbytes < RXBUFSIZE)
- {
- /* Enqueue the character */
- g_u8RecData[g_u32comRtail] = u8InChar;
- g_u32comRtail = (g_u32comRtail == (RXBUFSIZE - 1)) ? 0 : (g_u32comRtail + 1);
- g_u32comRbytes++;
- }
- }
- printf("\nTransmission Test:");
- }
- if(u32IntSts & UART_ISR_THRE_INT_Msk)
- {
- uint16_t tmp;
- tmp = g_u32comRtail;
- if(g_u32comRhead != tmp)
- {
- u8InChar = g_u8RecData[g_u32comRhead];
- UART_WRITE(UART0, u8InChar);
- g_u32comRhead = (g_u32comRhead == (RXBUFSIZE - 1)) ? 0 : (g_u32comRhead + 1);
- g_u32comRbytes--;
- }
- }
- }
- /*---------------------------------------------------------------------------------------------------------*/
- /* UART Function Test */
- /*---------------------------------------------------------------------------------------------------------*/
- void UART_FunctionTest()
- {
- printf("+-----------------------------------------------------------+\n");
- printf("| UART Function Test |\n");
- printf("+-----------------------------------------------------------+\n");
- printf("| Description : |\n");
- printf("| The sample code will print input char on terminal |\n");
- printf("| Please enter any to start (Press '0' to exit) |\n");
- printf("+-----------------------------------------------------------+\n");
- /*
- Using a RS232 cable to connect UART0 and PC.
- UART0 is set to debug port. UART0 is enable RDA and RLS interrupt.
- When inputing char to terminal screen, RDA interrupt will happen and
- UART0 will print the received char on screen.
- */
- /* Enable Interrupt and install the call back function */
- UART_ENABLE_INT(UART0, (UART_IER_RDA_IEN_Msk | UART_IER_THRE_IEN_Msk | UART_IER_RTO_IEN_Msk));
- NVIC_EnableIRQ(UART0_IRQn);
- while(g_bWait);
- /* Disable Interrupt */
- UART_DISABLE_INT(UART0, (UART_IER_RDA_IEN_Msk | UART_IER_THRE_IEN_Msk | UART_IER_RTO_IEN_Msk));
- NVIC_DisableIRQ(UART0_IRQn);
- g_bWait = TRUE;
- printf("\nUART Sample Demo End.\n");
- }
|