打印
[其他MCU]

串口通信

[复制链接]
801|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
追逐浪花|  楼主 | 2015-12-18 20:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
追逐浪花|  楼主 | 2015-12-18 20:37 | 只看该作者
void SystemInit (void) {
  volatile uint32_t i;

  /* System clock to the IOCON & the SWM need to be enabled or
  most of the I/O related peripherals won't work. */
  LPC_SYSCON->SYSAHBCLKCTRL |= ( (0x1 << 7) | (0x1 << 18) );
        
#if (CLOCK_SETUP)                                 /* Clock Setup              */

#if ((SYSPLLCLKSEL_Val & 0x03) == 1)
  LPC_IOCON->PIO0_8 &= ~(0x3 << 3);
  LPC_IOCON->PIO0_9 &= ~(0x3 << 3);
  LPC_SWM->PINENABLE0 &= ~(0x3 << 4);
  LPC_SYSCON->PDRUNCFG     &= ~(0x1 << 5);        /* Power-up System Osc      */
  LPC_SYSCON->SYSOSCCTRL    = SYSOSCCTRL_Val;
  for (i = 0; i < 200; i++) __NOP();
#endif
#if ((SYSPLLCLKSEL_Val & 0x03) == 3)
  LPC_IOCON->PIO0_1 &= ~(0x3 << 3);
  LPC_SWM->PINENABLE0 &= ~(0x1 << 7);
  for (i = 0; i < 200; i++) __NOP();
#endif

使用特权

评论回复
板凳
追逐浪花|  楼主 | 2015-12-18 20:40 | 只看该作者
LPC_SYSCON->SYSPLLCLKSEL  = SYSPLLCLKSEL_Val;   /* Select PLL Input         */
  LPC_SYSCON->SYSPLLCLKUEN  = 0x01;                                                                /* Update Clock Source      */
  while (!(LPC_SYSCON->SYSPLLCLKUEN & 0x01));     /* Wait Until Updated       */
#if ((MAINCLKSEL_Val & 0x03) == 3)                /* Main Clock is PLL Out    */
  LPC_SYSCON->SYSPLLCTRL    = SYSPLLCTRL_Val;
  LPC_SYSCON->PDRUNCFG     &= ~(0x1 << 7);        /* Power-up SYSPLL          */
  while (!(LPC_SYSCON->SYSPLLSTAT & 0x01));              /* Wait Until PLL Locked    */
#endif

#if (((MAINCLKSEL_Val & 0x03) == 2) )
  LPC_SYSCON->WDTOSCCTRL    = WDTOSCCTRL_Val;
  LPC_SYSCON->PDRUNCFG     &= ~(0x1 << 6);        /* Power-up WDT Clock       */
  for (i = 0; i < 200; i++) __NOP();
#endif

  LPC_SYSCON->MAINCLKSEL    = MAINCLKSEL_Val;     /* Select PLL Clock Output  */
  LPC_SYSCON->MAINCLKUEN    = 0x01;                                                                /* Update MCLK Clock Source */
  while (!(LPC_SYSCON->MAINCLKUEN & 0x01));       /* Wait Until Updated       */

  LPC_SYSCON->SYSAHBCLKDIV  = SYSAHBCLKDIV_Val;
#endif
  SystemCoreClockUpdate();
}

使用特权

评论回复
地板
追逐浪花|  楼主 | 2015-12-18 20:41 | 只看该作者
所以这部分应用时记得调用就好

所以主要是串口初始化这部分还有如果用中断还有中断处理这部分
    void UARTInit (void)
    {
        LPC_SWM->PINASSIGN0 &= ~( 0xFFFF << 0 );
        LPC_SWM->PINASSIGN0 |=  ( 4 << 0 );                                 /* P0.4 ~ UART0_TXD             */
        LPC_SWM->PINASSIGN0 |=  ( 0 << 8 );                                 /* P0.0 ~ UART0_RXD             */
      
        LPC_SYSCON->UARTCLKDIV     = 1;
        LPC_SYSCON->SYSAHBCLKCTRL |= (1<<14);

        LPC_USART0->BRG = SystemCoreClock / 16 / UART_BPS - 1;
        LPC_USART0->CFG = (1 << 0) |
                                       (1 << 2) |
                                       (0 << 4) |
                                       (0 << 6);
      
        LPC_USART0->INTENSET = (1 << 0);
        NVIC_EnableIRQ(UART0_IRQn);
    }

使用特权

评论回复
5
追逐浪花|  楼主 | 2015-12-18 20:41 | 只看该作者
void UART0_IRQHandler (void)
{
    if (LPC_USART0->STAT & 0x01) {
        GuiNum++;
        GucRcvBuf[GuiIn] = LPC_USART0->RXDATA;
        GuiIn = (GuiIn + 1) % BUFFSIZE;
        if (GuiNum == 1) {
            LPC_USART0->INTENSET |= (1 << 2);
        }
    }
    if (LPC_USART0->STAT & 0x04) {
        GuiNum--;
        LPC_USART0->TXDATA = GucRcvBuf[GuiOut];
        GuiOut = (GuiOut + 1) % BUFFSIZE;
        if (GuiNum == 0) {
            LPC_USART0->INTENCLR |= (1 << 2);
        }
    }
}

然后串口中断就可以了
编译烧录
可是无法接受呀当发送数据时,果断查找原因

使用特权

评论回复
6
quray1985| | 2015-12-19 19:47 | 只看该作者
lpc、KL系列以及stm32的内部flash的读写有什么区别呢?

使用特权

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

本版积分规则

25

主题

256

帖子

1

粉丝