[其他MCU] 串口通信

[复制链接]
1049|5
 楼主| 追逐浪花 发表于 2015-12-18 20:36 | 显示全部楼层 |阅读模式
其实lpc800与1114编程基本差不多啦,基本熟悉1114的,800上手还是蛮容易的

lpc800有 3组USART:USART0,USART1,USART2



首先初始化系统时钟,这个本身mdk中已经有了对应的函数,在system_LPC8xx.c
  1. SystemInit();


 楼主| 追逐浪花 发表于 2015-12-18 20:37 | 显示全部楼层
  1. void SystemInit (void) {
  2.   volatile uint32_t i;

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

  8. #if ((SYSPLLCLKSEL_Val & 0x03) == 1)
  9.   LPC_IOCON->PIO0_8 &= ~(0x3 << 3);
  10.   LPC_IOCON->PIO0_9 &= ~(0x3 << 3);
  11.   LPC_SWM->PINENABLE0 &= ~(0x3 << 4);
  12.   LPC_SYSCON->PDRUNCFG     &= ~(0x1 << 5);        /* Power-up System Osc      */
  13.   LPC_SYSCON->SYSOSCCTRL    = SYSOSCCTRL_Val;
  14.   for (i = 0; i < 200; i++) __NOP();
  15. #endif
  16. #if ((SYSPLLCLKSEL_Val & 0x03) == 3)
  17.   LPC_IOCON->PIO0_1 &= ~(0x3 << 3);
  18.   LPC_SWM->PINENABLE0 &= ~(0x1 << 7);
  19.   for (i = 0; i < 200; i++) __NOP();
  20. #endif
 楼主| 追逐浪花 发表于 2015-12-18 20:40 | 显示全部楼层
  1. LPC_SYSCON->SYSPLLCLKSEL  = SYSPLLCLKSEL_Val;   /* Select PLL Input         */
  2.   LPC_SYSCON->SYSPLLCLKUEN  = 0x01;                                                                /* Update Clock Source      */
  3.   while (!(LPC_SYSCON->SYSPLLCLKUEN & 0x01));     /* Wait Until Updated       */
  4. #if ((MAINCLKSEL_Val & 0x03) == 3)                /* Main Clock is PLL Out    */
  5.   LPC_SYSCON->SYSPLLCTRL    = SYSPLLCTRL_Val;
  6.   LPC_SYSCON->PDRUNCFG     &= ~(0x1 << 7);        /* Power-up SYSPLL          */
  7.   while (!(LPC_SYSCON->SYSPLLSTAT & 0x01));              /* Wait Until PLL Locked    */
  8. #endif

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

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

  17.   LPC_SYSCON->SYSAHBCLKDIV  = SYSAHBCLKDIV_Val;
  18. #endif
  19.   SystemCoreClockUpdate();
  20. }
 楼主| 追逐浪花 发表于 2015-12-18 20:41 | 显示全部楼层
所以这部分应用时记得调用就好

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

  9.         LPC_USART0->BRG = SystemCoreClock / 16 / UART_BPS - 1;
  10.         LPC_USART0->CFG = (1 << 0) |
  11.                                        (1 << 2) |
  12.                                        (0 << 4) |
  13.                                        (0 << 6);
  14.       
  15.         LPC_USART0->INTENSET = (1 << 0);
  16.         NVIC_EnableIRQ(UART0_IRQn);
  17.     }
 楼主| 追逐浪花 发表于 2015-12-18 20:41 | 显示全部楼层
  1. void UART0_IRQHandler (void)
  2. {
  3.     if (LPC_USART0->STAT & 0x01) {
  4.         GuiNum++;
  5.         GucRcvBuf[GuiIn] = LPC_USART0->RXDATA;
  6.         GuiIn = (GuiIn + 1) % BUFFSIZE;
  7.         if (GuiNum == 1) {
  8.             LPC_USART0->INTENSET |= (1 << 2);
  9.         }
  10.     }
  11.     if (LPC_USART0->STAT & 0x04) {
  12.         GuiNum--;
  13.         LPC_USART0->TXDATA = GucRcvBuf[GuiOut];
  14.         GuiOut = (GuiOut + 1) % BUFFSIZE;
  15.         if (GuiNum == 0) {
  16.             LPC_USART0->INTENCLR |= (1 << 2);
  17.         }
  18.     }
  19. }

然后串口中断就可以了
编译烧录
可是无法接受呀当发送数据时,果断查找原因
quray1985 发表于 2015-12-19 19:47 | 显示全部楼层
lpc、KL系列以及stm32的内部flash的读写有什么区别呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

256

帖子

1

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