打印
[技术问答]

NUC131只要写UART0->DATA,其TE_FLAG就一直保持0,数据也发出去

[复制链接]
1428|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tomcatimage|  楼主 | 2017-12-15 13:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
刚到手的NuTiny-EVB-NUC131的板子,用Keil烧写了官方库工程UART_TxRx_Function编译的程序,没有收到数据。调试发现只要写数据TE_FLAG就保持0,表示TX_FIFO不为空,数据也没有发出去。检查了UART0的管脚以及时钟都已经设置好了。
问题会在哪里,请大神指教。不然要看好久芯片手册了。
沙发
xixi2017| | 2017-12-15 14:22 | 只看该作者
你换个例子试试,其他例子里面也有串口0的printf

使用特权

评论回复
板凳
21mengnan| | 2017-12-15 15:01 | 只看该作者
初始化方法
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(void)
{
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init UART                                                                                               */
    /*---------------------------------------------------------------------------------------------------------*/
    /* Reset UART0 module */
    SYS_ResetModule(UART0_RST);

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

使用特权

评论回复
地板
tomcatimage|  楼主 | 2017-12-15 15:08 | 只看该作者
编译执行过4个工程了,都一样。如果没有定义NONBLOCK_PRINTF,就死在printf()调用的SendChar_ToUART()函数里,一直检查TXFIFO未满,因为没有发出去,所以一直都是满的。
NUC131是M0518的库吧。

使用特权

评论回复
5
tomcatimage|  楼主 | 2017-12-15 15:09 | 只看该作者
定义了NONBLOCK_PRINTF,不会死在printf()里,但是串口没有输出。我自己建了个工程,查看UART状态,就是TE_FLAG一直为0;

使用特权

评论回复
6
tomcatimage|  楼主 | 2017-12-15 15:12 | 只看该作者

初始化部分我没动过,刚才对比了一下,跟你贴的是一样的。

使用特权

评论回复
7
tomcatimage|  楼主 | 2017-12-15 15:19 | 只看该作者
我用的是NuTiny-EVB-NUC131-LQFP64这款,如果有串口可用的工程,发我一个试试。

使用特权

评论回复
8
tomcatimage|  楼主 | 2017-12-15 15:49 | 只看该作者
CLK_SetHCLK()函数里:
CLK->CLKSEL0 = (CLK->CLKSEL0 & (~CLK_CLKSEL0_HCLK_S_Msk)) | u32ClkSrc;
这条指令不能改变CLKSEL0寄存器的值,我写了句CLK->CLKSEL0 = 0x3A,调试时内存地址0x50000210出的值依旧是初始值0x3F!

使用特权

评论回复
9
xinpian101| | 2017-12-15 19:29 | 只看该作者
这个我也不懂啊,都是用printf函数做。

使用特权

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

本版积分规则

3

主题

10

帖子

0

粉丝