148 lines
3.8 KiB
C
148 lines
3.8 KiB
C
/*
|
|
* Copyright (c) 2016, Freescale Semiconductor, Inc.
|
|
* Copyright 2016-2017 NXP
|
|
* All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
|
|
#include "pin_mux.h"
|
|
#include "board.h"
|
|
|
|
#include <stdbool.h>
|
|
#include "fsl_power.h"
|
|
#include "fsl_usart_cmsis.h"
|
|
/*******************************************************************************
|
|
* Definitions
|
|
******************************************************************************/
|
|
#define DEMO_USART Driver_USART0
|
|
#define ECHO_BUFFER_LENGTH 8
|
|
|
|
/*******************************************************************************
|
|
* Prototypes
|
|
******************************************************************************/
|
|
|
|
/*******************************************************************************
|
|
* Variables
|
|
******************************************************************************/
|
|
|
|
uint8_t g_tipString[] = "USART DMA example\r\nSend back received data\r\nEcho every 8 characters\r\n";
|
|
uint8_t g_txBuffer[ECHO_BUFFER_LENGTH] = {0};
|
|
uint8_t g_rxBuffer[ECHO_BUFFER_LENGTH] = {0};
|
|
volatile bool rxBufferEmpty = true;
|
|
volatile bool txBufferFull = false;
|
|
volatile bool txOnGoing = false;
|
|
volatile bool rxOnGoing = false;
|
|
|
|
/*******************************************************************************
|
|
* Code
|
|
******************************************************************************/
|
|
uint32_t USART0_GetFreq(void)
|
|
{
|
|
return CLOCK_GetFlexCommClkFreq(0U);
|
|
}
|
|
uint32_t USART1_GetFreq(void)
|
|
{
|
|
return CLOCK_GetFlexCommClkFreq(1U);
|
|
}
|
|
uint32_t USART2_GetFreq(void)
|
|
{
|
|
return CLOCK_GetFlexCommClkFreq(2U);
|
|
}
|
|
uint32_t USART3_GetFreq(void)
|
|
{
|
|
return CLOCK_GetFlexCommClkFreq(3U);
|
|
}
|
|
uint32_t USART4_GetFreq(void)
|
|
{
|
|
return CLOCK_GetFlexCommClkFreq(4U);
|
|
}
|
|
uint32_t USART5_GetFreq(void)
|
|
{
|
|
return CLOCK_GetFlexCommClkFreq(5U);
|
|
}
|
|
uint32_t USART6_GetFreq(void)
|
|
{
|
|
return CLOCK_GetFlexCommClkFreq(6U);
|
|
}
|
|
uint32_t USART7_GetFreq(void)
|
|
{
|
|
return CLOCK_GetFlexCommClkFreq(7U);
|
|
}
|
|
uint32_t USART8_GetFreq(void)
|
|
{
|
|
return CLOCK_GetHsLspiClkFreq();
|
|
}
|
|
|
|
/* USART callback */
|
|
void USART_Callback(uint32_t event)
|
|
{
|
|
if (event == ARM_USART_EVENT_SEND_COMPLETE)
|
|
{
|
|
txBufferFull = false;
|
|
txOnGoing = false;
|
|
}
|
|
|
|
if (event == ARM_USART_EVENT_RECEIVE_COMPLETE)
|
|
{
|
|
rxBufferEmpty = false;
|
|
rxOnGoing = false;
|
|
}
|
|
}
|
|
|
|
/*!
|
|
* @brief Main function
|
|
*/
|
|
int main(void)
|
|
{
|
|
/* set BOD VBAT level to 1.65V */
|
|
POWER_SetBodVbatLevel(kPOWER_BodVbatLevel1650mv, kPOWER_BodHystLevel50mv, false);
|
|
/* attach 12 MHz clock to FLEXCOMM0 (debug console) */
|
|
CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
|
|
|
|
USART0_InitPins();
|
|
BOARD_BootClockPLL150M();
|
|
|
|
DMA_Init(DMA0);
|
|
DEMO_USART.Initialize(USART_Callback);
|
|
DEMO_USART.PowerControl(ARM_POWER_FULL);
|
|
|
|
/* Set baudrate. */
|
|
DEMO_USART.Control(ARM_USART_MODE_ASYNCHRONOUS, BOARD_DEBUG_UART_BAUDRATE);
|
|
|
|
/* Send g_tipString out. */
|
|
txOnGoing = true;
|
|
|
|
DEMO_USART.Send(g_tipString, sizeof(g_tipString) - 1);
|
|
|
|
/* Wait send finished */
|
|
while (txOnGoing)
|
|
{
|
|
}
|
|
|
|
while (1)
|
|
{
|
|
/* If RX is idle and g_rxBuffer is empty, start to read data to g_rxBuffer. */
|
|
if ((!rxOnGoing) && rxBufferEmpty)
|
|
{
|
|
rxOnGoing = true;
|
|
DEMO_USART.Receive(g_rxBuffer, ECHO_BUFFER_LENGTH);
|
|
}
|
|
|
|
/* If TX is idle and g_txBuffer is full, start to send data. */
|
|
if ((!txOnGoing) && txBufferFull)
|
|
{
|
|
txOnGoing = true;
|
|
DEMO_USART.Send(g_txBuffer, ECHO_BUFFER_LENGTH);
|
|
}
|
|
|
|
/* If g_txBuffer is empty and g_rxBuffer is full, copy g_rxBuffer to g_txBuffer. */
|
|
if ((!rxBufferEmpty) && (!txBufferFull))
|
|
{
|
|
memcpy(g_txBuffer, g_rxBuffer, ECHO_BUFFER_LENGTH);
|
|
rxBufferEmpty = true;
|
|
txBufferFull = true;
|
|
}
|
|
}
|
|
}
|