在基本polling的基础上,将Rx设置为中断接收。
硬件环境:TG STK,将PD0,PD1短接,及usart1 的Tx,及Rx, 没有使用内部的loopback功能。对应 TG STK 20 pin 扩展口的第4脚与第6脚。
软件环境:在主循环中,不断发送数据,在Rx中断中,判断接收到的数据,如果是特殊的那个字,则将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 SPI_Initial(void)
{
CMU_ClockEnable(cmuClock_HFPER, true);
CMU_ClockEnable(cmuClock_GPIO, true);
CMU_ClockEnable(cmuClock_USART1, true);
USART_InitSync_TypeDef SPI_init = USART_INITSYNC_DEFAULT;
SPI_init.baudrate = 200000;
USART_InitSync(USART1, &SPI_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
GPIO_PinModeSet(gpioPortD,2,gpioModePushPull,1); //clk
GPIO_PinModeSet(gpioPortD,3,gpioModePushPull,1); //cs
USART1->ROUTE |= USART_ROUTE_CSPEN | USART_ROUTE_CLKPEN | USART_ROUTE_TXPEN | USART_ROUTE_RXPEN | USART_ROUTE_LOCATION_LOC1;
}
/**************************************************************************//**
* @brief Main function
*****************************************************************************/
/**************************************************************************//**
* @brief Main function
*****************************************************************************/
int main(void)
{
/* Chip errata */
CHIP_Init();
SystemCoreClockUpdate();
SPI_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);
}
}
效果如下: