My code:
#define MEMORY_BUFFER_SIZE 256
#define MEM_BUF_T uint16_t
MQX_TICK_STRUCT tick_last;
unsigned int counter = 0;
uint32_t timer[20];
dma_ch0_isr(void *ptr){
bool overflow;
MQX_TICK_STRUCT tick_temp;
DMA_CINT = DMA_CINT_CINT(0);//clear interrupt flag
if(counter < 20){//should use semophore
_time_get_ticks(&time_temp);
timer[counter++] = _time_diff_microseconds(&tick_temp);
tick_last = tick_temp;
}
}
void MAIN_task(uint32_t initial_data){
MEM_BUF_T dma_dst[MEMORY_BUFFER_SIZE] = {0};
unsigned int index;
_time_get_ticks(&tick_last);
//enable clocks
SIM_SCGC6 |= SIM_SCGC6_DMAMUX0_MASK;
SIM_SCGC3 |= SIM_SCGC3_ADC1_MASK;
_int_install_isr(16, dma_ch0_isr, NULL);
_bsp_int_init(16, 3, 0, TRUE);
ADC_SC2 = ADC_SC2_DMAEN_MASK;//DMA interrupt
ADC1_SC3 = ADC1_SC3_ADC0_MASK;//continuous
ADC1_CFG1 = ADC_CFG1_MODE(1);//12 bit
DMAMUX0_CHCFG0 = 0;//disable hardware DMA request while config
DMAMUX1_CHCFG0 = 0;
DMA_TCD0_SADDR = &ADC1_RA;//read from ADC
DMA_TCD0_SOFF = 0;
DMA_TCD0_SLAST = 0;
DMA_TCD0_DADDR = &dma_dst[0];//write to buffer
DMA_TCD0_DOFF = sizeof(MEM_BUF_T);//destination increment
DMA_TCD0_DLASTSGA = -sizeof(MEM_BUF_T) * MEMORY_BUFFER_SIZE;//reset addr
DMA_TCD0_NBYTES_MLNO = sizeof(MEM_BUF_T);//minor loop 2 bytes
DMA_TCD0_BITER_ELINKNO = MEMORY_BUFFER_SIZE;//256 iterations
DMA_TCD0_CITER_ELINKNO = MEMORY_BUFFER_SIZE;
DMA_TCD0_ATTR = DMA_ATTR_SSIZE(1) | DMA_ATTR_DSIZE(1);//2 bytes transfer size
DMA_TCD0_CSR = DMA_CSR_INTMAJOR_MASK;//interrupt after major loop
DMA_ERQ |= DMA_ERQ_ERQ0_MASK;//allow ADC to trigger DMA
//ADC1 triggers DMA
DMAMUX0_CHCFG0 = DMAMUX_CHCFG_ENBL_MASK | DMAMUX_CHCFG_SOURCE(41);
ADC1_SC1A = ADC_SC1_ADCH(20);//start reading ADC1 potentiometer
while(counter < 20){}
for(index = 1; index < 20; index++){printf(%4d: %6d\n\r", index, timer[index]);}
_mqx_exit(0);