MCUXpresso_LPC55S69/boards/lpcxpresso55s69/cmsis_driver_examples/usart/dma_transfer/cm33_core0/cmsis_usart_dma_transfer.c
Yilin Sun 6e8d03ec0a Updated to SDK v2.15.000
Signed-off-by: Yilin Sun <imi415@imi.moe>
2024-04-12 21:21:49 +08:00

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;
}
}
}