打印
[技术问答]

NUC131SD2AE的uart有么有完整的六个串口的初始化和中断接受程序

[复制链接]
3886|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qiuchen0815|  楼主 | 2016-6-2 21:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我是新手,新塘的NUC131SD2AE片子刚到手,串口程序没有,不知道怎么调,贴子里面的uart初始化程序上面是定义PB13和14作为串口,可是这个片子的这两个脚不是串口引脚,而是PB0和1。就想有个程序可以中断接受数据
沙发
09kk小熊| | 2016-6-4 16:44 | 只看该作者
下载BSP包,里面有UART的例程
http://www.nuvoton.com.cn/opencms/system/modules/com.thesys.opencms.nuvoton/pages/download/download.jsp?file=http://www.nuvoton.com/hq/resource-download.jsp?tp_GUID=SW0120141104104958&version=V3.00.002

使用特权

评论回复
板凳
zhuotuzi| | 2016-6-5 20:11 | 只看该作者
你会找到那两个的配置吗,把配置修改到你这个芯片上的就行了啊。

使用特权

评论回复
地板
zhuotuzi| | 2016-6-5 20:12 | 只看该作者
/****************************************************************************
* [url=home.php?mod=space&uid=288409]@file[/url]     main.c
* [url=home.php?mod=space&uid=895143]@version[/url]  V3.00
* $Revision: 8 $
* $Date: 15/01/16 11:44a $
* [url=home.php?mod=space&uid=247401]@brief[/url]    Transmit and receive data from PC terminal through RS232 interface.
* @note
* Copyright (C) 2014 Nuvoton Technology Corp. All rights reserved.
*
******************************************************************************/
#include <stdio.h>
#include "NUC131.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 GPB multi-function pins for UART0 RXD(PB.0) and TXD(PB.1) */
    SYS->GPB_MFP &= ~(SYS_GPB_MFP_PB0_Msk | SYS_GPB_MFP_PB1_Msk);
    SYS->GPB_MFP |= SYS_GPB_MFP_PB0_UART0_RXD | SYS_GPB_MFP_PB1_UART0_TXD;

}

void UART0_Init()
{
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init UART                                                                                               */
    /*---------------------------------------------------------------------------------------------------------*/
    /* Reset UART0 module */
    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, peripheral 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();

    while(1);

}

/*---------------------------------------------------------------------------------------------------------*/
/* ISR to handle UART Channel 0 interrupt event                                                            */
/*---------------------------------------------------------------------------------------------------------*/
void UART02_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 inputting 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_EnableInt(UART0, (UART_IER_RDA_IEN_Msk | UART_IER_THRE_IEN_Msk | UART_IER_TOUT_IEN_Msk));
    while(g_bWait);

    /* Disable Interrupt */
    UART_DisableInt(UART0, (UART_IER_RDA_IEN_Msk | UART_IER_THRE_IEN_Msk | UART_IER_TOUT_IEN_Msk));
    g_bWait = TRUE;
    printf("\nUART Sample Demo End.\n");

}


使用特权

评论回复
5
zhuotuzi| | 2016-6-5 20:13 | 只看该作者
看系统初始化函数,有管脚初始化代码。
关于你要的那个串口配置为:
/* Set GPB multi-function pins for UART0 RXD(PB.0) and TXD(PB.1) */
    SYS->GPB_MFP &= ~(SYS_GPB_MFP_PB0_Msk | SYS_GPB_MFP_PB1_Msk);
    SYS->GPB_MFP |= SYS_GPB_MFP_PB0_UART0_RXD | SYS_GPB_MFP_PB1_UART0_TXD;

使用特权

评论回复
6
zhuotuzi| | 2016-6-5 20:18 | 只看该作者
关于串口中断的配置可以去二楼提供的BSP里面找到头文件,里面有关于串口中断的定义。

使用特权

评论回复
7
zhuotuzi| | 2016-6-5 20:19 | 只看该作者
/**
*    @brief        Enable specified UART interrupt
*
*    @param[in]    uart        The pointer of the specified UART module.
*    @param[in]    u32eIntSel  Interrupt type select
*                              - UART_IER_AERIEN_Msk       : Auto baud rate interrupt
*                              - UART_IER_WKDATIEN_Msk     : Data wakeup interrupt
*                              - UART_IER_LIN_IEN_Msk      : Lin bus interrupt
*                              - UART_IER_WKCTSIEN_Msk     : CTS wakeup interrupt
*                              - UART_IER_BUF_ERR_IEN_Msk  : Buffer Error interrupt
*                              - UART_IER_TOUT_IEN_Msk     : Rx time-out interrupt
*                              - UART_IER_MODEM_IEN_Msk    : Modem interrupt
*                              - UART_IER_RLS_IEN_Msk      : Rx Line status interrupt
*                              - UART_IER_THRE_IEN_Msk     : Tx empty interrupt
*                              - UART_IER_RDA_IEN_Msk      : Rx ready interrupt
*
*    [url=home.php?mod=space&uid=266161]@return[/url]       None
*
*    [url=home.php?mod=space&uid=1543424]@Details[/url]      This macro enable specified UART interrupt.
*/
#define UART_ENABLE_INT(uart, u32eIntSel)    ((uart)->IER |= (u32eIntSel))


/**
*    @brief        Disable specified UART interrupt
*
*    @param[in]    uart        The pointer of the specified UART module.
*    @param[in]    u32eIntSel  Interrupt type select
*                              - UART_IER_AERIEN_Msk       : Auto baud rate interrupt
*                              - UART_IER_WKDATIEN_Msk     : Data wakeup interrupt
*                              - UART_IER_LIN_IEN_Msk      : Lin bus interrupt
*                              - UART_IER_WKCTSIEN_Msk     : CTS wakeup interrupt
*                              - UART_IER_BUF_ERR_IEN_Msk  : Buffer Error interrupt
*                              - UART_IER_TOUT_IEN_Msk     : Rx time-out interrupt
*                              - UART_IER_MODEM_IEN_Msk    : Modem interrupt
*                              - UART_IER_RLS_IEN_Msk      : Rx Line status interrupt
*                              - UART_IER_THRE_IEN_Msk     : Tx empty interrupt
*                              - UART_IER_RDA_IEN_Msk      : Rx ready interrupt
*    @return       None
*
*    @details      This macro enable specified UART interrupt.
*/
#define UART_DISABLE_INT(uart, u32eIntSel)    ((uart)->IER &= ~ (u32eIntSel))


/**
*    @brief        Get specified interrupt indicator status
*
*    @param[in]    uart            The pointer of the specified UART module.
*    @param[in]    u32eIntTypeFlag Interrupt Type Flag, should be
  *                                 - UART_ISR_LIN_INT_Msk      : Lin bus interrupt
*                                  - UART_ISR_BUF_ERR_INT_Msk  : Buffer Error interrupt
*                                  - UART_ISR_TOUT_INT_Msk     : Rx time-out interrupt
*                                  - UART_ISR_MODEM_INT_Msk    : Modem interrupt
*                                  - UART_ISR_RLS_INT_Msk      : Rx Line status interrupt
*                                  - UART_ISR_THRE_INT_Msk     : Tx empty interrupt
*                                  - UART_ISR_RDA_INT_Msk      : Rx ready interrupt
*
*    @retval       0 The specified interrupt is not happened.
*    @retval       1 The specified interrupt is happened.
*
*    @details      This macro get specified interrupt indicator status.
*/
#define UART_GET_INT_FLAG(uart,u32eIntTypeFlag)    (((uart)->ISR & (u32eIntTypeFlag))?1:0)


使用特权

评论回复
8
zhuomuniao110| | 2016-6-6 21:38 | 只看该作者
上面的例子程序讲解的不错。

使用特权

评论回复
9
qiuchen0815|  楼主 | 2016-6-7 13:45 | 只看该作者
首先感谢各位的回复,我就是因为看不明白官网给的范例程序才发的贴,可能功底比较薄,想各位能在代码部分有些注释或说明。

使用特权

评论回复
10
qiuchen0815|  楼主 | 2016-6-7 13:48 | 只看该作者
最好就是提供一个6个串口单独可以收发的程序,例如,我给串口0发送数据,串口0给我把数据返回给我,6个串口的范例都要,

使用特权

评论回复
11
gejigeji521| | 2016-6-7 16:46 | 只看该作者
void SYS_Init(void)
这个子函数内部的东西能看懂吗,这个是配置时钟与端口映射的,就是你选择哪个管脚的串口。

使用特权

评论回复
12
qiuchen0815|  楼主 | 2016-6-8 10:02 | 只看该作者
你好,我qq2394332911,是不是很慢啊,如果我要启用串口UART2是不是要在SYS函数里这样用啊

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);
    CLK_EnableModuleClock(UART1_MODULE);
    CLK_EnableModuleClock(UART2_MODULE);

    /* Select UART module clock source */
    CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1));
    CLK_SetModuleClock(UART1_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1));
    CLK_SetModuleClock(UART2_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1));

    /*---------------------------------------------------------------------------------------------------------*/
    /* Init I/O Multi-function                                                                                 */
    /*---------------------------------------------------------------------------------------------------------*/

    /* Set GPB multi-function pins for UART0 RXD(PB.0) and TXD(PB.1) */
    /* Set GPB multi-function pins for UART1 RXD(PB.4), TXD(PB.5), nRTS(PB.6) and nCTS(PB.7) */

    SYS->GPB_MFP &= ~(SYS_GPB_MFP_PB0_Msk | SYS_GPB_MFP_PB1_Msk |
                      SYS_GPB_MFP_PB4_Msk | SYS_GPB_MFP_PB5_Msk |
                      SYS_GPB_MFP_PB6_Msk | SYS_GPB_MFP_PB7_Msk |
                      SYS_GPD_MFP_PD14_Msk | SYS_GPD_MFP_PD15_Msk);

    SYS->GPB_MFP |= (SYS_GPB_MFP_PB0_UART0_RXD | SYS_GPB_MFP_PB1_UART0_TXD |
                     SYS_GPB_MFP_PB4_UART1_RXD | SYS_GPB_MFP_PB5_UART1_TXD |
                     SYS_GPB_MFP_PB6_UART1_nRTS | SYS_GPB_MFP_PB7_UART1_nCTS |
                     SYS_GPD_MFP_PD14_UART2_RXD | SYS_GPD_MFP_PD15_UART2_TXD);

}
void UART2_Init()
{
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init UART                                                                                               */
    /*---------------------------------------------------------------------------------------------------------*/
    /* Reset UART0 module */
    SYS_ResetModule(UART2_RST);

    /* Configure UART0 and set UART0 Baudrate */
    UART_Open(UART2, 115200);
}

使用特权

评论回复
13
王兴超| | 2019-4-23 20:27 | 只看该作者
OK,你现在是老手了,轮到你教我了,我想咨询下那个串口0和串口2的中断你当初是怎么区分开的?

使用特权

评论回复
14
condition| | 2019-4-26 19:41 | 只看该作者
调整一下端口配置就可以了啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

14

帖子

0

粉丝