[技术问答] 新唐M453的串口DMA

[复制链接]
3407|9
 楼主| 晓枫VS枯叶 发表于 2015-2-7 11:07 | 显示全部楼层 |阅读模式
  1. #define PLLCTL_SETTING  CLK_PLLCTL_72MHz_HXT
  2. #define PLL_CLOCK       72000000
  3. uint32_t volatile u32IsTestOver = 0;
  4. void SYS_Init(void)
  5. {
  6.     /*---------------------------------------------------------------------------------------------------------*/
  7.     /* Init System Clock                                                                                       */
  8.     /*---------------------------------------------------------------------------------------------------------*/
  9.     /* Enable HIRC, HXT and LXT clock */
  10.     CLK_EnableXtalRC(CLK_PWRCTL_HIRCEN_Msk);
  11.     CLK_EnableXtalRC(CLK_PWRCTL_HXTEN_Msk);
  12.     CLK_EnableXtalRC(CLK_PWRCTL_LXTEN_Msk);

  13.     /* Wait for HIRC, HXT and LXT clock ready */
  14.     CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk);
  15.     CLK_WaitClockReady(CLK_STATUS_HXTSTB_Msk);
  16.     CLK_WaitClockReady(CLK_STATUS_LXTSTB_Msk);

  17.     /* Select HCLK clock source as HIRC and and HCLK clock divider as 1 */
  18.     CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HIRC, CLK_CLKDIV0_HCLK(1));

  19.     /* Set core clock as PLL_CLOCK from PLL */
  20.     CLK_SetCoreClock(PLL_CLOCK);
  21.     CLK_EnableModuleClock(UART0_MODULE);
  22.     CLK_EnableModuleClock(PDMA_MODULE);
  23.     /*---------------------------------------------------------------------------------------------------------*/
  24.     /* Init I/O Multi-function                                                                                 */
  25.     /*---------------------------------------------------------------------------------------------------------*/
  26.     /* Set PD multi-function pins for UART0 RXD and TXD */
  27.     SYS->GPD_MFPL &= ~(SYS_GPD_MFPL_PD0MFP_Msk | SYS_GPD_MFPL_PD1MFP_Msk);
  28.     SYS->GPD_MFPL |= (SYS_GPD_MFPL_PD0MFP_UART0_RXD | SYS_GPD_MFPL_PD1MFP_UART0_TXD);
  29. }
  30. uint16_t usart_dma_buf[100]= {0x00};
  31. uint8_t PDMA_TEST_LENGTH=100;
  32. int main()
  33. {
  34.     int8_t item[100];
  35.     uint8_t i;

  36.     /* Unlock protected registers */
  37.     SYS_UnlockReg();

  38.     SYS_Init();

  39.     /* Lock protected registers */
  40.     SYS_LockReg();
  41.     UART_Open(UART0, 115200);
  42.     for(i=0; i<100; i++)
  43.     {
  44.         usart_dma_buf[i]=i;
  45.     }
  46.     PDMA_Open(0x4);
  47.     PDMA_SetTransferCnt(2, PDMA_WIDTH_8, PDMA_TEST_LENGTH);
  48.     /* transfer width is one word(32 bit) */
  49.     PDMA_SetTransferAddr(2, (uint32_t)(&usart_dma_buf[PDMA_TEST_LENGTH]), PDMA_SAR_INC, UART0_BASE, PDMA_DAR_FIX);

  50.     PDMA_SetTransferMode(2, PDMA_UART0_TX, FALSE,  0);

  51.     //burst size is 4
  52.     PDMA_SetBurstType(2, PDMA_REQ_SINGLE, 0);

  53.     PDMA_EnableInt(2, PDMA_INT_TRANS_DONE);
  54.     NVIC_EnableIRQ(PDMA_IRQn);
  55.                 UART0->INTEN|=UART_INTEN_TXPDMAEN_Msk;
  56.                 u32IsTestOver=0;
  57.     Delay_Init();
  58.     EXTI_Init();
  59.                 printf("\r\n");
  60.                 while(u32IsTestOver == 0);

  61.     if(u32IsTestOver == 1)
  62.         printf("test done...\r\n");
  63.     else if(u32IsTestOver == 2)
  64.         printf("target abort...\r\n");
  65.    
  66.     printf("Simple Demo Code\r\n");

  67.     printf("Please Input Any Key\r\n");
  68.     GPIO_SetMode(PC, BIT9, GPIO_MODE_OUTPUT);
  69.     while(1)
  70.     {
  71.         /* Get input character */
  72.         scanf("%s",item);

  73.         /* Print input character back */
  74.         printf("%s\r\n", item);
  75.     }

  76. }
  77. void PDMA_IRQHandler(void)
  78. {
  79.    uint32_t status = PDMA_GET_INT_STATUS();

  80.     if (status & 0x1) { /* abort */
  81.         printf("target abort interrupt !!\n");
  82.         if (PDMA_GET_ABORT_STS() & 0x4)
  83.             u32IsTestOver = 2;
  84.         PDMA_CLR_ABORT_FLAG(PDMA_ABTSTS_ABTIFn_Msk);
  85.     } else if (status & 0x2) { /* done */
  86.         if ( PDMA_GET_TD_STS() & (1 << 2)) {
  87.             u32IsTestOver = 1;
  88.             PDMA_CLR_TD_FLAG(PDMA_TDSTS_TDIFn_Msk);
  89.         }
  90.     } else if (status & 0x300) { /* channel 2 timeout */
  91.         printf("timeout interrupt !!\n");
  92.         u32IsTestOver = 3;
  93.         PDMA_CLR_TMOUT_FLAG(0);
  94.         PDMA_CLR_TMOUT_FLAG(1);
  95.     } else
  96.         printf("unknown interrupt !!\n");
  97. }
按照例程写了一个串口DMA,UART0_TX的DMA,使能了中断,运行时也能进到中断,检测到了发送完成的标志,但是电脑的调试助手收不到DMA发送的数据,调试的数据都能收到,收到的数据如下图所示: QQ截图20150207110517.jpg
请问下这个问题怎么解决!



mintspring 发表于 2015-2-8 01:16 来自手机 | 显示全部楼层
你发送了什么?_?
 楼主| 晓枫VS枯叶 发表于 2015-2-8 11:52 | 显示全部楼层
  1. for(i=0; i<100; i++)
  2.     {
  3.         usart_dma_buf[i]=i;
  4.     }
gaoyang9992006 发表于 2015-2-18 12:07 | 显示全部楼层
完整的例程能否正常收发,还有,你收的是字符编码,你弄进去的123,是原始数据,你这样,usart_dma_buf[i]='0'+i;
598330983 发表于 2015-2-20 19:22 | 显示全部楼层
楼上说的有道理,一次我有Lcd1602就是这个原因,几天才发现。
mintspring 发表于 2015-2-28 07:43 来自手机 | 显示全部楼层
看(⊙o⊙),楼上说的很对
lovecat2015 发表于 2015-3-25 20:19 | 显示全部楼层
不知道楼主现在这个问题解决了没有
 楼主| 晓枫VS枯叶 发表于 2015-4-13 09:19 | 显示全部楼层
目前还没有!
qq2987 发表于 2017-10-16 09:40 | 显示全部楼层
楼主完整的程序可以给一份么,谢谢
huahuagg 发表于 2018-10-28 21:14 | 显示全部楼层
求经验,啥情况?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

82

帖子

2

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