打印
[技术问答]

求助:nano102的串口接受问题

[复制链接]
2974|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
用官方的例程串口没法收发收据,后来修改程序如下:
调试代码有点乱,PA14是led灯正常,首先加了PB0 和 PB1的MFP映射到UART的操作,死循环打印数据,结果用万用表测试PB0和PB1的电平都为0,接着用了下面的程序测试,结果不管怎样,PB0的电平都是0,PC0的电平可以正常高低,请问是哪里出现问题了?第一次用这个MCU
while(1){
        //UART_Write(UART0, (uint8_t *)"aaaaaa", 7);
        //SendChar_ToUART(0x5a);
        // printf("\n\nCPU @ %dHz\n", SystemCoreClock);
        PA14 = 0;
        PB0 = 0;
        PB1 = 0;
        PB2 = 0;
        PB3 = 0;
        PB4 = 0;
        PB5 = 0;
        PC0 = 0;
        delay_nnn();
        //UART_Write(UART0, (uint8_t *)"aaaaaa", 7);
        //SendChar_ToUART(0xaa);
        // printf("\n\nCPU @ %dHz\n", SystemCoreClock);
        PA14 = 1;
                PB0 = 1;
        PB1 = 1;
        PB2 = 1;
        PB3 = 1;
        PB4 = 1;
        PB5 = 1;
        PC0 = 1;

        delay_nnn();
}
沙发
Thethree| | 2016-2-23 22:56 | 只看该作者
这种问题确实没有遇到过,是不是没有初始化成功呢

使用特权

评论回复
板凳
along013|  楼主 | 2016-2-24 08:59 | 只看该作者
Thethree 发表于 2016-2-23 22:56
这种问题确实没有遇到过,是不是没有初始化成功呢

初始化看了例程,就一个UART_Open,和相关MFP的设置,这些都调用了的。

使用特权

评论回复
地板
09kk小熊| | 2016-2-24 09:12 | 只看该作者
初始化IO不对,例程应该能用才是啊

使用特权

评论回复
5
along013|  楼主 | 2016-2-24 09:13 | 只看该作者
09kk小熊 发表于 2016-2-24 09:12
初始化IO不对,例程应该能用才是啊

我直接使用的例程不可以的,需要怎么初始化?能不能提供几行初始化代码?

使用特权

评论回复
6
09kk小熊| | 2016-2-24 09:17 | 只看该作者
UART0的IO是复用的,例程上用的是PB13,PB14,而你想用的是PB0,PB1当然是不行了

使用特权

评论回复
7
along013|  楼主 | 2016-2-24 09:19 | 只看该作者
例程上直接是PB0和PB1的复用,下面例子是我用作IO口测试电平是否正常,修改之前是初始化程UART的,不管怎样,PB口都是低电平。

void SYS_Init(void)
{
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init System Clock                                                                                       */
    /*---------------------------------------------------------------------------------------------------------*/
    /* Unlock protected registers */
    SYS_UnlockReg();

    /* Enable External XTAL (4~24 MHz) */
    CLK->PWRCTL |= (0x1 << CLK_PWRCTL_HXT_EN_Pos); // HXT Enabled

    /* Waiting for 12MHz clock ready */
    CLK_WaitClockReady( CLK_CLKSTATUS_HXT_STB_Msk);

    /* Switch HCLK clock source to XTAL */
    CLK->CLKSEL0 &= ~CLK_CLKSEL0_HCLK_S_Msk;
    CLK->CLKSEL0 |= CLK_CLKSEL0_HCLK_S_HXT;

    /* Select IP clock source */
    CLK->CLKSEL1 &= ~CLK_CLKSEL1_UART_S_Msk;
    CLK->CLKSEL1 |= (0x0 << CLK_CLKSEL1_UART_S_Pos);// Clock source from external 12 MHz or 32 KHz crystal clock

    /* Enable IP clock */
    CLK->APBCLK |= CLK_APBCLK_UART0_EN; // UART0 Clock Enable

    /* Update System Core Clock */
    /* User can use SystemCoreClockUpdate() to calculate PllClock, SystemCoreClock and CycylesPerUs automatically. */
    SystemCoreClockUpdate();

    /*---------------------------------------------------------------------------------------------------------*/
    /* Init I/O Multi-function                                                                                 */
    /*---------------------------------------------------------------------------------------------------------*/
    /* Set PB multi-function pins for UART0 RXD and TXD  */
    //SYS->PB_L_MFP &= ~(SYS_PB_L_MFP_PB0_MFP_Msk|SYS_PB_L_MFP_PB1_MFP_Msk);
    //SYS->PB_L_MFP |=  (SYS_PB_L_MFP_PB0_MFP_UART0_TX|SYS_PB_L_MFP_PB1_MFP_UART0_RX);
    /* Lock protected registers */
    SYS_LockReg();

}

void UART0_Init()
{
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init UART                                                                                               */
    /*---------------------------------------------------------------------------------------------------------*/
    UART_Open(UART0, 115200);
}


void delay_nnn(void)
{
        UINT32 i = 0, j=0;
        for(i=0;i<100;i++){
                for(j=0;j<10000;j++);
        }
}
/**
  * @brief  Main routine.
  * @param  None.
  * @return None.
  */
int32_t main(void)
{
    SYS_Init();

    //UART0_Init();
       
                GPIO_SetMode(PA, BIT14, GPIO_PMD_OUTPUT);
        GPIO_SetMode(PB, BIT0, GPIO_PMD_OUTPUT);
        GPIO_SetMode(PB, BIT1, GPIO_PMD_OUTPUT);
        GPIO_SetMode(PB, BIT2, GPIO_PMD_OUTPUT);
        GPIO_SetMode(PB, BIT3, GPIO_PMD_OUTPUT);
        GPIO_SetMode(PB, BIT4, GPIO_PMD_OUTPUT);
        GPIO_SetMode(PB, BIT5, GPIO_PMD_OUTPUT);
        GPIO_SetMode(PC, BIT0, GPIO_PMD_OUTPUT);

       
                PA14 = 0;

    /*---------------------------------------------------------------------------------------------------------*/
    /* SAMPLE CODE                                                                                             */
    /*---------------------------------------------------------------------------------------------------------*/
while(1){
        //UART_Write(UART0, (uint8_t *)"aaaaaa", 7);
        //SendChar_ToUART(0x5a);
        // printf("\n\nCPU @ %dHz\n", SystemCoreClock);
        PA14 = 0;
        PB0 = 0;
        PB1 = 0;
        PB2 = 0;
        PB3 = 0;
        PB4 = 0;
        PB5 = 0;
        PC0 = 0;
        delay_nnn();
        //UART_Write(UART0, (uint8_t *)"aaaaaa", 7);
        //SendChar_ToUART(0xaa);
        // printf("\n\nCPU @ %dHz\n", SystemCoreClock);
        PA14 = 1;
                PB0 = 1;
        PB1 = 1;
        PB2 = 1;
        PB3 = 1;
        PB4 = 1;
        PB5 = 1;
        PC0 = 1;

        delay_nnn();
}

使用特权

评论回复
8
09kk小熊| | 2016-2-24 09:33 | 只看该作者
/******************************************************************************
* @file     main.c
* @version  V1.00
* $Revision: 4 $
* $Date: 13/12/16 4:27p $
* @brief    UART project for Nano1X2 series MCU
*
* @note
* Copyright (C) 2013 Nuvoton Technology Corp. All rights reserved.
*****************************************************************************/

#include <stdio.h>
#include "Nano1X2Series.h"

#include "uart.h"

#define RXBUFSIZE 1024

/*---------------------------------------------------------------------------------------------------------*/
/* Global variables                                                                                        */
/*---------------------------------------------------------------------------------------------------------*/
uint8_t g_u8SendData[12] = {0};
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;
volatile int32_t g_i32pointer = 0;

/*---------------------------------------------------------------------------------------------------------*/
/* Define functions prototype                                                                              */
/*---------------------------------------------------------------------------------------------------------*/
int32_t main(void);
void UART1_TEST_HANDLE(void);
void UART_FunctionTest(void);


void SYS_Init(void)
{
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init System Clock                                                                                       */
    /*---------------------------------------------------------------------------------------------------------*/
    /* Unlock protected registers */
    SYS_UnlockReg();

    /* Enable External XTAL (4~24 MHz) */
    CLK->PWRCTL &= ~CLK_PWRCTL_HXT_EN_Msk;
    CLK->PWRCTL |= (0x1 << CLK_PWRCTL_HXT_EN_Pos); // HXT Enabled

    /* Waiting for 12MHz clock ready */
    CLK_WaitClockReady( CLK_CLKSTATUS_HXT_STB_Msk);

    /* Switch HCLK clock source to XTAL */
    CLK->CLKSEL0 &= ~CLK_CLKSEL0_HCLK_S_Msk;
    CLK->CLKSEL0 |= CLK_CLKSEL0_HCLK_S_HXT;

    /* Enable IP clock */
    CLK->APBCLK |= CLK_APBCLK_UART0_EN; // UART0 Clock Enable
    CLK->APBCLK |= CLK_APBCLK_UART1_EN; // UART1 Clock Enable

    /* Select IP clock source */
    CLK->CLKSEL1 &= ~CLK_CLKSEL1_UART_S_Msk;
    CLK->CLKSEL1 |= (0x0 << CLK_CLKSEL1_UART_S_Pos);// Clock source from external 12 MHz or 32 KHz crystal clock

    /* Update System Core Clock */
    /* User can use SystemCoreClockUpdate() to calculate PllClock, SystemCoreClock and CycylesPerUs automatically. */
    SystemCoreClockUpdate();

    /*---------------------------------------------------------------------------------------------------------*/
    /* Init I/O Multi-function                                                                                 */
    /*---------------------------------------------------------------------------------------------------------*/
    /* Set PB multi-function pins for UART0 RXD and TXD  */
    SYS->PB_H_MFP &= ~(SYS_PB_H_MFP_PB13_MFP_Msk | SYS_PB_H_MFP_PB14_MFP_Msk);
    SYS->PB_H_MFP |= (SYS_PB_H_MFP_PB13_MFP_UART0_RX | SYS_PB_H_MFP_PB14_MFP_UART0_TX);

    /* Set PB multi-function pins for UART1 RXD, TXD, RTS, CTS  */
    SYS->PB_L_MFP &= ~(SYS_PB_L_MFP_PB4_MFP_Msk | SYS_PB_L_MFP_PB5_MFP_Msk |
                       SYS_PB_L_MFP_PB6_MFP_Msk | SYS_PB_L_MFP_PB7_MFP_Msk);
    SYS->PB_L_MFP |= (SYS_PB_L_MFP_PB4_MFP_UART1_RTS | SYS_PB_L_MFP_PB5_MFP_UART1_RX |
                      SYS_PB_L_MFP_PB6_MFP_UART1_TX  | SYS_PB_L_MFP_PB7_MFP_UART1_CTS);

    /* Lock protected registers */
    SYS_LockReg();

}

void UART0_Init()
{
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init UART                                                                                               */
    /*---------------------------------------------------------------------------------------------------------*/
    UART_Open(UART0, 115200);
}

/*---------------------------------------------------------------------------------------------------------*/
/* UART Test Sample                                                                                        */
/* Test Item                                                                                               */
/* It sends the received data to HyperTerminal.                                                            */
/*---------------------------------------------------------------------------------------------------------*/

/*---------------------------------------------------------------------------------------------------------*/
/* MAIN function                                                                                           */
/*---------------------------------------------------------------------------------------------------------*/

int main(void)
{
    /* Init System, IP clock and multi-function I/O */
    SYS_Init();
    /* Init UART0 for printf */
    UART0_Init();

    /*---------------------------------------------------------------------------------------------------------*/
    /* SAMPLE CODE                                                                                             */
    /*---------------------------------------------------------------------------------------------------------*/

    printf("\n\nCPU @ %dHz\n", SystemCoreClock);

    printf("+---------------------+\n");
    printf("| UART function test  |\n");
    printf("+---------------------+\n");

    UART_FunctionTest();
}

/*---------------------------------------------------------------------------------------------------------*/
/* ISR to handle UART Channel 0 interrupt event                                                            */
/*---------------------------------------------------------------------------------------------------------*/
void UART1_IRQHandler(void)
{
    UART1_TEST_HANDLE();
}

/*---------------------------------------------------------------------------------------------------------*/
/* UART Callback function                                                                                  */
/*---------------------------------------------------------------------------------------------------------*/
void UART1_TEST_HANDLE()
{
    uint8_t u8InChar=0xFF;
    uint32_t u32IntSts= UART1->ISR;

    if(u32IntSts & UART_ISR_RDA_IS_Msk) {
        printf("\nInput:");

        /* Get all the input characters */
        while(UART_IS_RX_READY(UART1)) {
            /* Get the character from UART Buffer */
            u8InChar = UART_READ(UART1);           /* Rx trigger level is 1 byte*/

            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_IS_Msk) {
        uint16_t tmp;
        tmp = g_u32comRtail;
        if(g_u32comRhead != tmp) {
            u8InChar = g_u8RecData[g_u32comRhead];
            UART_WRITE(UART1,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_ENABLE_INT(UART0, (UART_IER_RDA_IE_Msk | UART_IER_THRE_IE_Msk | UART_IER_RTO_IE_Msk));
    NVIC_EnableIRQ(UART0_IRQn);
    while(g_bWait);

    /* Disable Interrupt */
    UART_DISABLE_INT(UART0, (UART_IER_RDA_IE_Msk | UART_IER_THRE_IE_Msk | UART_IER_RTO_IE_Msk));
    NVIC_DisableIRQ(UART0_IRQn);
    g_bWait =TRUE;
    printf("\nUART Sample Demo End.\n");

}

使用特权

评论回复
9
along013|  楼主 | 2016-2-24 09:49 | 只看该作者
09kk小熊 发表于 2016-2-24 09:33
/******************************************************************************
* @file     main.c
...

可以了,谢谢

使用特权

评论回复
10
ideafor| | 2016-2-24 22:41 | 只看该作者
IO口对应的对不对呢

使用特权

评论回复
11
Rooney30| | 2016-2-26 22:30 | 只看该作者
nano的串口在低功耗模式下最高的波特率可以设置成多少

使用特权

评论回复
12
along013|  楼主 | 2016-3-10 11:53 | 只看该作者
Rooney30 发表于 2016-2-26 22:30
nano的串口在低功耗模式下最高的波特率可以设置成多少

这个我没了解过,直接用的57600,

使用特权

评论回复
13
史迪威将军| | 2016-3-23 20:43 | 只看该作者
能够发送出去吗,你自发自收试一下呢

使用特权

评论回复
14
energyplants| | 2016-3-26 23:45 | 只看该作者
初始化函数写的有问题吧,请认真检查一下

使用特权

评论回复
15
zhuomuniao110| | 2016-3-27 11:11 | 只看该作者


如上图所示,你是说的哪个例程的问题?
你是官方的开发板吗?
看下图,官方开发板

使用特权

评论回复
16
along013|  楼主 | 2016-3-29 15:26 | 只看该作者
zhuomuniao110 发表于 2016-3-27 11:11
如上图所示,你是说的哪个例程的问题?
你是官方的开发板吗?
看下图,官方开发板

是官方的板子,早已解决了问题,谢谢大家。

使用特权

评论回复
17
Roderman_z| | 2016-3-29 20:50 | 只看该作者
这个问题感觉是没有初始化成功,或者波特率算的有问题

使用特权

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

本版积分规则

2

主题

16

帖子

1

粉丝