// DMA channel #define DMA_CHANNEL UDMA_CHANNEL_TMR0A // buffer size #define DMA_BUF_SIZE 100 // quantisation frequency unsigned long ulFrequency = 8000; // input buffer to store values from port D uint16_t gpio_buf[DMA_BUF_SIZE]; // this is necessary #pragma data_alignment=1024 unsigned char ucControlTable[1024]; // -------------------------- subroutines ---------------------------------- void timer_init() { unsigned long ulPeriod; // switch TIMER clock on SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0); // full width timer TimerConfigure(TIMER0_BASE, TIMER_CFG_32_BIT_PER); // calculate the period ulPeriod = (80000000UL / ulFrequency); TimerLoadSet(TIMER0_BASE, TIMER_A, ulPeriod - 1); } void timer_enable() { // enable my timer TimerEnable(TIMER0_BASE, TIMER_A); } void dma_init(void) { // fill the buffer with a constant: I can watch transactions in the WatchWindow memset(gpio_buf, 0xFF, sizeof(gpio_buf)); // enable of the monitoring port SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD); GPIOPinTypeGPIOInput(GPIO_PORTD_BASE, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3); // switch DMA clock on SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA); uDMAEnable(); uDMAControlBaseSet(ucControlTable); // fill attributes uDMAChannelAttributeDisable(DMA_CHANNEL, UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST | UDMA_ATTR_REQMASK | UDMA_ATTR_HIGH_PRIORITY); // primary transaction set uDMAChannelControlSet(DMA_CHANNEL | UDMA_PRI_SELECT, UDMA_SIZE_16 | // word size UDMA_SRC_INC_NONE | // from register (GPIO_PORTD_BASE + GPIO_O_DATA) so constant UDMA_DST_INC_16 | // destination in memory so increment UDMA_ARB_1); // one word per transaction // primary transfer set uDMAChannelTransferSet(DMA_CHANNEL | UDMA_PRI_SELECT, UDMA_MODE_BASIC, // linear filling (void *)(GPIO_PORTD_BASE + GPIO_O_DATA), // GPIOD data register gpio_buf, // my buffer DMA_BUF_SIZE); // buffer size // enable DMA - waiting for the trigger event uDMAChannelEnable(DMA_CHANNEL); } // ------------------------- main application function ----------------------------- void board_init() { timer_init(); // setup a timer - it doesn't work now dma_init(); // setup DMA - it suspend for some events timer_enable(); // start my timer - since that all transactions happen IntMasterEnable(); }