Board logo

标题: EFM32片内外设——USART之UART Rx interrupt [打印本页]

作者: yuyang911220    时间: 2014-7-26 12:53     标题: EFM32片内外设——USART之UART Rx interrupt

简介:USART集成了SPI及UART,所以仅仅只有SPI的demo是不够的。因此,才有了这段最简单的UART的运行例程。发送使用循环发送。接收使用中断接收。
硬件准备:TG STK , 将20pin 扩展口的4脚与6脚相连接。第4脚为PD0,Tx, 第6脚为PD1,Rx。
软件流程:UART配置完毕之后,在主函数中不停的发送0到9. 而接收中断中则判断是否接收到了5,如果是则翻转LED灯的状态。结果就可以看到LED灯不停的亮灭。
例程代码如下:
#include <stdint.h>
#include <stdbool.h>
#include "efm32.h"
#include "efm32_chip.h"
#include "efm32_cmu.h"
#include "efm32_gpio.h"
#include "efm32_usart.h"

void USART1_RX_IRQHandler(void)
{
    if(USART_Rx(USART1) == 0x5)
    {
        GPIO_PinOutToggle(gpioPortD, 7);
    }
}

void UART_Initial(void)
{
    CMU_ClockEnable(cmuClock_HFPER, true);
    CMU_ClockEnable(cmuClock_GPIO, true);
    CMU_ClockEnable(cmuClock_USART1, true);
   
    USART_InitAsync_TypeDef UART_init = USART_INITASYNC_DEFAULT;
    UART_init.baudrate = 9600;
   
    USART_InitAsync(USART1, &UART_init);
   
    USART1->IFC = _USART_IFC_MASK;
    NVIC_ClearPendingIRQ(USART1_RX_IRQn);
    NVIC_EnableIRQ(USART1_RX_IRQn);
    USART1->IEN = USART_IEN_RXDATAV;
   
    GPIO_PinModeSet(gpioPortD,0,gpioModePushPull,1); //tx
    GPIO_PinModeSet(gpioPortD,1,gpioModeInput,1);    //rx
   
    USART1->ROUTE |=  USART_ROUTE_TXPEN | USART_ROUTE_RXPEN | USART_ROUTE_LOCATION_LOC1;
}

/**************************************************************************//**
* @brief  Main function
*****************************************************************************/
/**************************************************************************//**
* @brief  Main function
*****************************************************************************/
int main(void)
{
  /* Chip errata */
  CHIP_Init();
  SystemCoreClockUpdate();
  
  UART_Initial();
  
  CMU_ClockEnable(cmuClock_GPIO, true);
  GPIO_PinModeSet(gpioPortD, 7, gpioModePushPull,0);
  
  unsigned char ucData = 0;
  /* Infinite blink loop */
  while(1)
  {
      unsigned long ulDelay = 100000;
      while(ulDelay--);
      if(ucData < 10)ucData++;
      else ucData = 0;
      USART_Tx(USART1,ucData);
  }
}





欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0