打印
[技术问答]

关于m051系列

[复制链接]
1535|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我系黄先森|  楼主 | 2017-7-8 17:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 我系黄先森 于 2017-8-7 13:43 编辑

完全不会了
沙发
heisexingqisi| | 2017-7-8 19:59 | 只看该作者
16个字节后发生了中断?

使用特权

评论回复
板凳
heisexingqisi| | 2017-7-8 20:01 | 只看该作者
/****************************************************************************
* [url=home.php?mod=space&uid=288409]@file[/url]     main.c
* [url=home.php?mod=space&uid=895143]@version[/url]  V1.00
* $Revision: 8 $
* $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_u8SendData[12] = {0};
uint8_t g_u8RecData[RXBUFSIZE]  = {0};
volatile int32_t g_i32pointer = 0;

/*---------------------------------------------------------------------------------------------------------*/
/* Define functions prototype                                                                              */
/*---------------------------------------------------------------------------------------------------------*/
extern char GetChar(void);
int32_t main(void);
void AutoFlow_FunctionRxTest(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);
    CLK_EnableModuleClock(UART1_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));

    /*---------------------------------------------------------------------------------------------------------*/
    /* 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);

    /* Set P1 multi-function pins for UART1 RXD and TXD */
    SYS->P1_MFP &= ~(SYS_MFP_P12_Msk | SYS_MFP_P13_Msk);
    SYS->P1_MFP |= (SYS_MFP_P12_RXD1 | SYS_MFP_P13_TXD1);

    /* Set P0 multi-function pins for UART1 RTS */
    SYS->P0_MFP = SYS->P0_MFP & (~SYS_MFP_P01_Msk) | SYS_MFP_P01_RTS1;

}

void UART0_Init()
{
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init UART                                                                                               */
    /*---------------------------------------------------------------------------------------------------------*/
    /* Reset UART0 module */
    SYS_ResetModule(UART0_RST);

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

void UART1_Init()
{
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init UART                                                                                               */
    /*---------------------------------------------------------------------------------------------------------*/
    /* Reset UART1 module */
    SYS_ResetModule(UART1_RST);

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

/*---------------------------------------------------------------------------------------------------------*/
/* 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 */
    UART0_Init();

    /* Init UART1 for testing */
    UART1_Init();

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

    printf("\n\nCPU [url=home.php?mod=space&uid=72445]@[/url] %dHz\n", SystemCoreClock);

    printf("\n\nUART Sample Program\n");

    /* UART auto flow sample slave function */
    AutoFlow_FunctionRxTest();

    while(1);

}

/*---------------------------------------------------------------------------------------------------------*/
/* ISR to handle UART Channel 1 interrupt event                                                            */
/*---------------------------------------------------------------------------------------------------------*/
void UART1_IRQHandler(void)
{
    volatile uint32_t u32IntSts = UART1->ISR;;

    /* Rx Ready or Time-out INT*/
    if(UART_GET_INT_FLAG(UART1, UART_ISR_RDA_INT_Msk) ||  UART_GET_INT_FLAG(UART1, UART_ISR_TOUT_INT_Msk))
    {
        /* Handle received data */
        g_u8RecData[g_i32pointer] = UART_READ(UART1);
        g_i32pointer++;
    }
}
/*---------------------------------------------------------------------------------------------------------*/
/*  AutoFlow Function Test (Slave)                                                                         */
/*---------------------------------------------------------------------------------------------------------*/
void AutoFlow_FunctionRxTest()
{
    uint32_t u32i;

    printf("\n");
    printf("+-----------------------------------------------------------+\n");
    printf("|     Pin Configure                                         |\n");
    printf("+-----------------------------------------------------------+\n");
    printf("|    _______                                    _______     |\n");
    printf("|   |       |                                  |       |    |\n");
    printf("|   |Master |---TXD1(P1.3) <====> RXD1(P1.2)---| Slave |    |\n");
    printf("|   |       |---CTS1(P0.0) <====> RTS1(P0.1)---|       |    |\n");
    printf("|   |_______|                                  |_______|    |\n");
    printf("|                                                           |\n");
    printf("+-----------------------------------------------------------+\n");

    printf("\n");
    printf("+-----------------------------------------------------------+\n");
    printf("|       AutoFlow Function Test (Slave)                      |\n");
    printf("+-----------------------------------------------------------+\n");
    printf("|  Description :                                            |\n");
    printf("|    The sample code needs two boards. One is Master and    |\n");
    printf("|    the other is slave. Master will send 1k bytes data     |\n");
    printf("|    to slave.Slave will check if received data is correct  |\n");
    printf("|    after getting 1k bytes data.                           |\n");
    printf("|    Press any key to start...                              |\n");
    printf("+-----------------------------------------------------------+\n");
    GetChar();

    /* Enable RTS and CTS autoflow control */
    UART_EnableFlowCtrl(UART1);

    /* Set RTS Trigger Level as 8 bytes */
    UART1->FCR &= ~UART_FCR_RTS_TRI_LEV_Msk;
    UART1->FCR |= UART_FCR_RTS_TRI_LEV_8BYTES;

    /* Enable RDA\RLS\RTO Interrupt  */
    UART_ENABLE_INT(UART1, (UART_IER_RDA_IEN_Msk | UART_IER_RLS_IEN_Msk | UART_IER_RTO_IEN_Msk));

    /* Set RX Trigger Level as 8 bytes */
    UART1->FCR &= ~UART_FCR_RFITL_Msk;
    UART1->FCR |= UART_FCR_RFITL_8BYTES;

    /* Set Timeout time 0x3E bit-time and time-out counter enable */
    UART_SetTimeoutCnt(UART1, 0x3E);

    /* Enable UART1 IRQ */
    NVIC_EnableIRQ(UART1_IRQn);

    printf("\n Starting to receive data...\n");

    /* Wait for receive 1k bytes data */
    while(g_i32pointer < RXBUFSIZE);

    /* Compare Data */
    for(u32i = 0; u32i < RXBUFSIZE; u32i++)
    {
        if(g_u8RecData[u32i] != (u32i & 0xFF))
        {
            printf("Compare Data Failed\n");
            while(1);
        }
    }
    printf("\n Receive OK & Check OK\n");

    /* Disable UART1 IRQ */
    NVIC_DisableIRQ(UART1_IRQn);

    /* Disable RDA\RLS\RTO Interrupt */
    UART_DISABLE_INT(UART1, (UART_IER_RDA_IEN_Msk | UART_IER_RLS_IEN_Msk | UART_IER_RTO_IEN_Msk));

}

使用特权

评论回复
地板
heisexingqisi| | 2017-7-8 20:01 | 只看该作者
看看这个例子有没有帮助,我看有关于串口中断的设置

使用特权

评论回复
5
我系黄先森|  楼主 | 2017-7-10 11:21 | 只看该作者
heisexingqisi 发表于 2017-7-8 20:01
看看这个例子有没有帮助,我看有关于串口中断的设置

这个例子有没有测试过呢?可以直接从uart1打印出这接收到的1k字节的数据吗?而且请问一下这个1k字节的数据是一次性发送过来的?

使用特权

评论回复
6
shen_hao| | 2017-7-10 20:30 | 只看该作者
我系黄先森 发表于 2017-7-10 11:21
这个例子有没有测试过呢?可以直接从uart1打印出这接收到的1k字节的数据吗?而且请问一下这个1k字节的数 ...

我之前也遇到过这样的情况,把handler中的printf全部去掉,就可以了,上面那个程序我觉得应该可以。uart默认的是一个字节触发一次中断,不太清楚你这个一次性是什么意思?

我也是初学者

使用特权

评论回复
7
我系黄先森|  楼主 | 2017-7-11 10:08 | 只看该作者
shen_hao 发表于 2017-7-10 20:30
我之前也遇到过这样的情况,把handler中的printf全部去掉,就可以了,上面那个程序我觉得应该可以。uart ...

我发现问题了,我在线调试的时候在中断函数里面设置了断点,所以导致中断接收不完全,最大只能存放16个字节,之后就不再接收,因为被打断了,还有一个问题想请教一下,m051的中断优先级在哪里设置呢?

使用特权

评论回复
8
shen_hao| | 2017-7-12 09:17 | 只看该作者
一个NVIC_SetPriority 大概就是这个名字,core.c中吧,另外中断函数里设置断点什么意思?你不是说是源程序吗?

使用特权

评论回复
9
我系黄先森|  楼主 | 2017-7-12 14:01 | 只看该作者
shen_hao 发表于 2017-7-12 09:17
一个NVIC_SetPriority 大概就是这个名字,core.c中吧,另外中断函数里设置断点什么意思?你不是说是源程序 ...

设置断点是指在线debug仿真调试的时候,在中断服务函数里面设置断点,程序运行到接收字节的时候就会暂停在断点处,我想请教一下,为什么我每次发送指令超过16个字节的时候,中断接收服务函数进去之后一直到接收到16个字节就跳出中断,但是很明显应该是中断一次只接收到一个字节,假设在主函数再设置一个断点,它应该接收完一个字节之后就跳到主函数的断点处,但是我测试发现并没有,一直在中断函数里面直到接收够16个字节才会退出(假设我发送的指令超过16个字节),后面的字节就不再接收。这个到底是什么问题呢?

使用特权

评论回复
10
shen_hao| | 2017-7-12 15:02 | 只看该作者
我系黄先森 发表于 2017-7-12 14:01
设置断点是指在线debug仿真调试的时候,在中断服务函数里面设置断点,程序运行到接收字节的时候就会暂停 ...

首先uart收发各有一个16bytes的FIFO缓存器,所以我觉得16这个数字肯定因为这。
另外请注意在uart handler中有个while(FIFO is ready),我觉得应该是这个原因

使用特权

评论回复
11
我系黄先森|  楼主 | 2017-7-12 16:13 | 只看该作者
shen_hao 发表于 2017-7-12 15:02
首先uart收发各有一个16bytes的FIFO缓存器,所以我觉得16这个数字肯定因为这。
另外请注意在uart handler ...

我试过去掉这个while,还是一样,我在中断中只接收不做任何多余的处理,然后在主函数中才打印出来,还是只能打印前16个字节。但是他上面给的这个例程是接收1024个字节并且发送出来,你有测试过这个例程吗?我的硬件是urat1,urat0没接出来,然后把上面的例程改成urat1一点反应都没有,你有没有试过?

使用特权

评论回复
12
shen_hao| | 2017-7-12 17:45 | 只看该作者
这个没有,我用的是M453。你的uart中断程序是不是上面RDA接收中断,下面是THRE发送中断,你要不这样,把THRE那部分去掉,等接收全部完毕,再发。

我其实也是新手。

使用特权

评论回复
13
我系黄先森|  楼主 | 2017-7-13 13:19 | 只看该作者
shen_hao 发表于 2017-7-12 17:45
这个没有,我用的是M453。你的uart中断程序是不是上面RDA接收中断,下面是THRE发送中断,你要不这样,把THR ...

我没有使用中断进行发送,我现在只是单纯的接收,接收完成之后做一个标志位,然后在主函数中发送。

使用特权

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

本版积分规则

3

主题

19

帖子

0

粉丝