EFM32片内外设——USART之UART Rx interrupt
- UID
- 1029342
- 性别
- 男
|
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);
}
}
|
|
|
|
|
|