[技术问答] 关于m051系列

[复制链接]
1773|12
 楼主| 我系黄先森 发表于 2017-7-8 17:18 | 显示全部楼层 |阅读模式
本帖最后由 我系黄先森 于 2017-8-7 13:43 编辑

完全不会了
heisexingqisi 发表于 2017-7-8 19:59 | 显示全部楼层
16个字节后发生了中断?
heisexingqisi 发表于 2017-7-8 20:01 | 显示全部楼层
  1. /****************************************************************************
  2. * [url=home.php?mod=space&uid=288409]@file[/url]     main.c
  3. * [url=home.php?mod=space&uid=895143]@version[/url]  V1.00
  4. * $Revision: 8 $
  5. * $Date: 14/01/28 11:45a $
  6. * [url=home.php?mod=space&uid=247401]@brief[/url]    M051 Series UART Interface Controller Driver Sample Code
  7. *
  8. * @note
  9. * Copyright (C) 2011 Nuvoton Technology Corp. All rights reserved.
  10. *
  11. ******************************************************************************/
  12. #include <stdio.h>
  13. #include "M051Series.h"


  14. #define PLL_CLOCK           50000000


  15. #define RXBUFSIZE 1024

  16. /*---------------------------------------------------------------------------------------------------------*/
  17. /* Global variables                                                                                        */
  18. /*---------------------------------------------------------------------------------------------------------*/
  19. uint8_t g_u8SendData[12] = {0};
  20. uint8_t g_u8RecData[RXBUFSIZE]  = {0};
  21. volatile int32_t g_i32pointer = 0;

  22. /*---------------------------------------------------------------------------------------------------------*/
  23. /* Define functions prototype                                                                              */
  24. /*---------------------------------------------------------------------------------------------------------*/
  25. extern char GetChar(void);
  26. int32_t main(void);
  27. void AutoFlow_FunctionRxTest(void);


  28. void SYS_Init(void)
  29. {
  30.     /*---------------------------------------------------------------------------------------------------------*/
  31.     /* Init System Clock                                                                                       */
  32.     /*---------------------------------------------------------------------------------------------------------*/

  33.     /* Enable Internal RC 22.1184MHz clock */
  34.     CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);

  35.     /* Waiting for Internal RC clock ready */
  36.     CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);

  37.     /* Switch HCLK clock source to Internal RC and HCLK source divide 1 */
  38.     CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1));

  39.     /* Enable external XTAL 12MHz clock */
  40.     CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk);

  41.     /* Waiting for external XTAL clock ready */
  42.     CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk);

  43.     /* Set core clock as PLL_CLOCK from PLL */
  44.     CLK_SetCoreClock(PLL_CLOCK);

  45.     /* Enable UART module clock */
  46.     CLK_EnableModuleClock(UART0_MODULE);
  47.     CLK_EnableModuleClock(UART1_MODULE);

  48.     /* Select UART module clock source */
  49.     CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1));
  50.     CLK_SetModuleClock(UART1_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1));

  51.     /*---------------------------------------------------------------------------------------------------------*/
  52.     /* Init I/O Multi-function                                                                                 */
  53.     /*---------------------------------------------------------------------------------------------------------*/

  54.     /* Set P3 multi-function pins for UART0 RXD and TXD */
  55.     SYS->P3_MFP &= ~(SYS_MFP_P30_Msk | SYS_MFP_P31_Msk);
  56.     SYS->P3_MFP |= (SYS_MFP_P30_RXD0 | SYS_MFP_P31_TXD0);

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

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

  62. }

  63. void UART0_Init()
  64. {
  65.     /*---------------------------------------------------------------------------------------------------------*/
  66.     /* Init UART                                                                                               */
  67.     /*---------------------------------------------------------------------------------------------------------*/
  68.     /* Reset UART0 module */
  69.     SYS_ResetModule(UART0_RST);

  70.     /* Configure UART0 and set UART0 Baudrate */
  71.     UART_Open(UART0, 115200);
  72. }

  73. void UART1_Init()
  74. {
  75.     /*---------------------------------------------------------------------------------------------------------*/
  76.     /* Init UART                                                                                               */
  77.     /*---------------------------------------------------------------------------------------------------------*/
  78.     /* Reset UART1 module */
  79.     SYS_ResetModule(UART1_RST);

  80.     /* Configure UART1 and set UART1 Baudrate */
  81.     UART_Open(UART1, 115200);
  82. }

  83. /*---------------------------------------------------------------------------------------------------------*/
  84. /* MAIN function                                                                                           */
  85. /*---------------------------------------------------------------------------------------------------------*/

  86. int main(void)
  87. {

  88.     /* Unlock protected registers */
  89.     SYS_UnlockReg();

  90.     /* Init System, IP clock and multi-function I/O */
  91.     SYS_Init();

  92.     /* Lock protected registers */
  93.     SYS_LockReg();

  94.     /* Init UART0 for printf */
  95.     UART0_Init();

  96.     /* Init UART1 for testing */
  97.     UART1_Init();

  98.     /*---------------------------------------------------------------------------------------------------------*/
  99.     /* SAMPLE CODE                                                                                             */
  100.     /*---------------------------------------------------------------------------------------------------------*/

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

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

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

  105.     while(1);

  106. }

  107. /*---------------------------------------------------------------------------------------------------------*/
  108. /* ISR to handle UART Channel 1 interrupt event                                                            */
  109. /*---------------------------------------------------------------------------------------------------------*/
  110. void UART1_IRQHandler(void)
  111. {
  112.     volatile uint32_t u32IntSts = UART1->ISR;;

  113.     /* Rx Ready or Time-out INT*/
  114.     if(UART_GET_INT_FLAG(UART1, UART_ISR_RDA_INT_Msk) ||  UART_GET_INT_FLAG(UART1, UART_ISR_TOUT_INT_Msk))
  115.     {
  116.         /* Handle received data */
  117.         g_u8RecData[g_i32pointer] = UART_READ(UART1);
  118.         g_i32pointer++;
  119.     }
  120. }
  121. /*---------------------------------------------------------------------------------------------------------*/
  122. /*  AutoFlow Function Test (Slave)                                                                         */
  123. /*---------------------------------------------------------------------------------------------------------*/
  124. void AutoFlow_FunctionRxTest()
  125. {
  126.     uint32_t u32i;

  127.     printf("\n");
  128.     printf("+-----------------------------------------------------------+\n");
  129.     printf("|     Pin Configure                                         |\n");
  130.     printf("+-----------------------------------------------------------+\n");
  131.     printf("|    _______                                    _______     |\n");
  132.     printf("|   |       |                                  |       |    |\n");
  133.     printf("|   |Master |---TXD1(P1.3) <====> RXD1(P1.2)---| Slave |    |\n");
  134.     printf("|   |       |---CTS1(P0.0) <====> RTS1(P0.1)---|       |    |\n");
  135.     printf("|   |_______|                                  |_______|    |\n");
  136.     printf("|                                                           |\n");
  137.     printf("+-----------------------------------------------------------+\n");

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

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

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

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

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

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

  162.     /* Enable UART1 IRQ */
  163.     NVIC_EnableIRQ(UART1_IRQn);

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

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

  167.     /* Compare Data */
  168.     for(u32i = 0; u32i < RXBUFSIZE; u32i++)
  169.     {
  170.         if(g_u8RecData[u32i] != (u32i & 0xFF))
  171.         {
  172.             printf("Compare Data Failed\n");
  173.             while(1);
  174.         }
  175.     }
  176.     printf("\n Receive OK & Check OK\n");

  177.     /* Disable UART1 IRQ */
  178.     NVIC_DisableIRQ(UART1_IRQn);

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

  181. }
heisexingqisi 发表于 2017-7-8 20:01 | 显示全部楼层
看看这个例子有没有帮助,我看有关于串口中断的设置
 楼主| 我系黄先森 发表于 2017-7-10 11:21 | 显示全部楼层
heisexingqisi 发表于 2017-7-8 20:01
看看这个例子有没有帮助,我看有关于串口中断的设置

这个例子有没有测试过呢?可以直接从uart1打印出这接收到的1k字节的数据吗?而且请问一下这个1k字节的数据是一次性发送过来的?
shen_hao 发表于 2017-7-10 20:30 | 显示全部楼层
我系黄先森 发表于 2017-7-10 11:21
这个例子有没有测试过呢?可以直接从uart1打印出这接收到的1k字节的数据吗?而且请问一下这个1k字节的数 ...

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

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

我发现问题了,我在线调试的时候在中断函数里面设置了断点,所以导致中断接收不完全,最大只能存放16个字节,之后就不再接收,因为被打断了,还有一个问题想请教一下,m051的中断优先级在哪里设置呢?
shen_hao 发表于 2017-7-12 09:17 | 显示全部楼层
一个NVIC_SetPriority 大概就是这个名字,core.c中吧,另外中断函数里设置断点什么意思?你不是说是源程序吗?
 楼主| 我系黄先森 发表于 2017-7-12 14:01 | 显示全部楼层
shen_hao 发表于 2017-7-12 09:17
一个NVIC_SetPriority 大概就是这个名字,core.c中吧,另外中断函数里设置断点什么意思?你不是说是源程序 ...

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

首先uart收发各有一个16bytes的FIFO缓存器,所以我觉得16这个数字肯定因为这。
另外请注意在uart handler中有个while(FIFO is ready),我觉得应该是这个原因
 楼主| 我系黄先森 发表于 2017-7-12 16:13 | 显示全部楼层
shen_hao 发表于 2017-7-12 15:02
首先uart收发各有一个16bytes的FIFO缓存器,所以我觉得16这个数字肯定因为这。
另外请注意在uart handler ...

我试过去掉这个while,还是一样,我在中断中只接收不做任何多余的处理,然后在主函数中才打印出来,还是只能打印前16个字节。但是他上面给的这个例程是接收1024个字节并且发送出来,你有测试过这个例程吗?我的硬件是urat1,urat0没接出来,然后把上面的例程改成urat1一点反应都没有,你有没有试过?
shen_hao 发表于 2017-7-12 17:45 | 显示全部楼层
这个没有,我用的是M453。你的uart中断程序是不是上面RDA接收中断,下面是THRE发送中断,你要不这样,把THRE那部分去掉,等接收全部完毕,再发。

我其实也是新手。
 楼主| 我系黄先森 发表于 2017-7-13 13:19 | 显示全部楼层
shen_hao 发表于 2017-7-12 17:45
这个没有,我用的是M453。你的uart中断程序是不是上面RDA接收中断,下面是THRE发送中断,你要不这样,把THR ...

我没有使用中断进行发送,我现在只是单纯的接收,接收完成之后做一个标志位,然后在主函数中发送。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

19

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部