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
#include
#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);
  }
}

 

你可能感兴趣的:(EFM32片内外设--USART之UART Rx interrupt)