#include <string.h> #include "board.h" /***************************************************************************** * Private types/enumerations/variables ****************************************************************************/ #ifdef __ICCARM__ #define ALIGNSTR(x) # x #define ALIGN(x) _Pragma(ALIGNSTR(data_alignment = ## x)) #else #define ALIGN(x) __attribute__ ((aligned(x))) #endif /* DMA descriptors must be aligned to 16 bytes */ ALIGN(16) static DMA_CHDESC_T dmaTXDesc[8]; #define UART_TX_PIN 6 #define UART_RX_PIN 0 char DMASEN = 'X'; /***************************************************************************** * Public types/enumerations/variables ****************************************************************************/ /***************************************************************************** * Private functions ****************************************************************************/ /* Clear an error on a DMA channel */ static void dmaClearChannel(DMA_CHID_T ch) { Chip_DMA_DisableChannel(LPC_DMA, ch); while ((Chip_DMA_GetBusyChannels(LPC_DMA) & (1 << ch)) != 0) { } Chip_DMA_AbortChannel(LPC_DMA, ch); Chip_DMA_ClearErrorIntChannel(LPC_DMA, ch); } /***************************************************************************** * Public functions ****************************************************************************/ /** * @brief DMA Interrupt Handler * @return None */ void DMA_IRQHandler(void) { uint32_t errors, pending; /* Get DMA error and interrupt channels */ errors = Chip_DMA_GetErrorIntChannels(LPC_DMA); pending = Chip_DMA_GetActiveIntAChannels(LPC_DMA); /* Check DMA interrupts of UART 0 TX channel */ if ((errors | pending) & (1 << DMAREQ_USART0_TX)) { /* Clear DMA interrupt for the channel */ Chip_DMA_ClearActiveIntAChannel(LPC_DMA, DMAREQ_USART0_TX); /* Handle errors if needed */ if (errors & (1 << DMAREQ_USART0_TX)) { /* DMA error, channel needs to be reset */ dmaClearChannel(DMAREQ_USART0_TX); } } Board_LED_Toggle(2); //Visualize DMA-Interrupt } ///** // * @brief Handle interrupt from PININT0 // * @return Nothing // */ void PIN_INT0_IRQHandler(void) { Chip_PININT_ClearIntStatus(LPC_PININT, PININTCH0); //Clear Pin-Interrupt-Status-Flag Board_LED_Toggle(0); //Visualize PinInterrupt } /** * @brief Main UART/DMA program body * @return Does not exit */int main(void) { int i = 0; char tmp[64]; SystemCoreClockUpdate(); Board_Init(); sprintf(tmp, "%c[2J", 27); //Clear Screen Board_UARTPutSTR(tmp); sprintf(tmp, "Board Initialized\r\n"); Board_UARTPutSTR(tmp); //========= Initialize UART for DMA ============================== Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_SWM); //Enable the clock to the Switch Matrix /* Disable the fixed pins assigned to 0 and 6 */ Chip_SWM_DisableFixedPin(SWM_FIXED_ACMP_I1); Chip_SWM_DisableFixedPin(SWM_FIXED_ADC1); /* Connect the U0_TXD_O and U0_RXD_I signals to port pins (see define above) */ Chip_SWM_MovablePinAssign(SWM_U0_TXD_O, UART_TX_PIN); Chip_SWM_MovablePinAssign(SWM_U0_RXD_I, UART_RX_PIN); /* Disable the clock to the Switch Matrix to save power */ Chip_Clock_DisablePeriphClock(SYSCTL_CLOCK_SWM); /* Configure UART-Module */ Chip_UART_Init(LPC_USART0); Chip_UART_ConfigData(LPC_USART0, UART_CFG_DATALEN_8 | UART_CFG_PARITY_NONE | UART_CFG_STOPLEN_1); Chip_UART_SetBaud(LPC_USART0, 115200); Chip_UART_Enable(LPC_USART0); Chip_UART_TXEnable(LPC_USART0); //========= GPIO-Interrupt for Wake-Up-Switch (PIO0_4) ===================== Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_SWM); Chip_SWM_DisableFixedPin(SWM_FIXED_ADC11); Chip_GPIO_SetPinDIRInput(LPC_GPIO_PORT, 0, 4); //!< Configure GPIO pin as input pin Chip_SYSCTL_SetPinInterrupt(0, 4); //!< Configure interrupt channel 0 for the GPIO pin in SysCon block Chip_Clock_DisablePeriphClock(SYSCTL_CLOCK_SWM); /* Configure channel 1 interrupt as edge sensitive and falling edge interrupt */ Chip_PININT_SetPinModeEdge(LPC_PININT, PININTCH0); Chip_PININT_EnableIntLow(LPC_PININT, PININTCH0); NVIC_EnableIRQ(PIN_INT0_IRQn); //Enable PIN-Interrupt //========= Configure DMA Support for UART-TX ============================== Chip_DMA_Init(LPC_DMA); /* Map PINT0 to DMA_USART0_TX */ Chip_DMATRIGMUX_SetInputTrig(LPC_DMATRIGMUX, DMAREQ_USART0_TX, DMATRIG_PINT0); /* Enable DMA controller and use driver provided DMA table for current descriptors */ Chip_DMA_Enable(LPC_DMA); Chip_DMA_SetSRAMBase(LPC_DMA, DMA_ADDR(Chip_DMA_Table)); /* Create a descriptor for the data */ dmaTXDesc[0].source = DMA_ADDR(&DMASEN); // Write DMASEN dmaTXDesc[0].dest = DMA_ADDR(&LPC_USART0->TXDATA); // To USART0_TX dmaTXDesc[0].xfercfg = DMA_XFERCFG_CFGVALID | DMA_XFERCFG_RELOAD | DMA_XFERCFG_CLRTRIG | DMA_XFERCFG_WIDTH_8 | DMA_XFERCFG_SRCINC_0 | DMA_XFERCFG_DSTINC_0 | DMA_XFERCFG_XFERCOUNT(1); // Just 1 value dmaTXDesc[0].next = DMA_ADDR(&(dmaTXDesc[0])); /* Setup transfer descriptor and validate it */ Chip_DMA_SetupTranChannel(LPC_DMA, DMAREQ_USART0_TX, &dmaTXDesc[0]); /* Setup data transfer */ Chip_DMA_SetupChannelTransfer(LPC_DMA, DMAREQ_USART0_TX, dmaTXDesc[0].xfercfg); /* Setup DMA UART TX support*/ Chip_DMA_EnableChannel(LPC_DMA, DMAREQ_USART0_TX); //Enable Channel 1 Chip_DMA_EnableIntChannel(LPC_DMA, DMAREQ_USART0_TX); //Enable DMA Interrupt for Channel 1 Chip_DMA_SetupChannelConfig(LPC_DMA, DMAREQ_USART0_TX, DMA_CFG_HWTRIGEN | DMA_CFG_TRIGPOL_HIGH | DMA_CFG_TRIGTYPE_EDGE | DMA_CFG_TRIGBURST_SNGL | DMA_CFG_CHPRIORITY(2)); Chip_DMA_SetChannelValid(LPC_DMA, DMAREQ_USART0_TX); NVIC_EnableIRQ(DMA_IRQn); //Enable DMA-Interrupt //========= Print Debug-Informations ============================== sprintf(tmp, "Application started\r\n"); Board_UARTPutSTR(tmp); sprintf(tmp, "System Clock: %uMHz\r\n", (uint) (SystemCoreClock / 1000000)); Board_UARTPutSTR(tmp); sprintf(tmp, "Main Clock: %uMHz\r\n", (uint) (Chip_Clock_GetMainClockRate() / 1000000)); Board_UARTPutSTR(tmp); sprintf(tmp, "Device ID: 0x%04X\r\n", (uint) Chip_SYSCTL_GetDeviceID()); Board_UARTPutSTR(tmp); while (1) { //Blink a LED to visualise th if (i++ > 1000000) { Board_LED_Toggle(1); i = 0; } //Chip_PININT_ClearIntStatus(LPC_PININT, PININTCH0); asm("NOP"); } } |