/*********************************************************************//** * @brief c_entry: Main DAC program body * @param[in] None * @return int **********************************************************************/ int c_entry(void) { PINSEL_CFG_Type PinCfg; DAC_CONVERTER_CFG_Type DAC_ConverterConfigStruct; GPDMA_LLI_Type DMA_LLI_Struct; uint32_t tmp; uint32_t i; uint32_t sin_0_to_90_16_samples[16]={\ 0,1045,2079,3090,4067,\ 5000,5877,6691,7431,8090,\ 8660,9135,9510,9781,9945,10000\ }; uint32_t dac_sine_lut[NUM_SINE_SAMPLE]; /* * Init DAC pin connect * AOUT on P0.26 */ PinCfg.Funcnum = 2; PinCfg.OpenDrain = 0; PinCfg.Pinmode = 0; PinCfg.Pinnum = 26; PinCfg.Portnum = 0; PINSEL_ConfigPin(&PinCfg); //Prepare DAC sine look up table for(i=0;i<NUM_SINE_SAMPLE;i++) { if(i<=15) { dac_sine_lut[i] = 512 + 512*sin_0_to_90_16_samples[i]/10000; if(i==15) dac_sine_lut[i]= 1023; } else if(i<=30) { dac_sine_lut[i] = 512 + 512*sin_0_to_90_16_samples[30-i]/10000; } else if(i<=45) { dac_sine_lut[i] = 512 - 512*sin_0_to_90_16_samples[i-30]/10000; } else { dac_sine_lut[i] = 512 - 512*sin_0_to_90_16_samples[60-i]/10000; } dac_sine_lut[i] = (dac_sine_lut[i]<<6); } //Prepare DMA link list item structure DMA_LLI_Struct.SrcAddr= (uint32_t)dac_sine_lut; DMA_LLI_Struct.DstAddr= (uint32_t)&(LPC_DAC->DACR); DMA_LLI_Struct.NextLLI= (uint32_t)&DMA_LLI_Struct; DMA_LLI_Struct.Control= DMA_SIZE | (2<<18) //source width 32 bit | (2<<21) //dest. width 32 bit | (1<<26) //source increment ; /* GPDMA block section -------------------------------------------- */ /* Initialize GPDMA controller */ GPDMA_Init(); // Setup GPDMA channel -------------------------------- // channel 0 GPDMACfg.ChannelNum = 0; // Source memory GPDMACfg.SrcMemAddr = (uint32_t)(dac_sine_lut); // Destination memory - unused GPDMACfg.DstMemAddr = 0; // Transfer size GPDMACfg.TransferSize = DMA_SIZE; // Transfer width - unused GPDMACfg.TransferWidth = 0; // Transfer type GPDMACfg.TransferType = GPDMA_TRANSFERTYPE_M2P; // Source connection - unused GPDMACfg.SrcConn = 0; // Destination connection GPDMACfg.DstConn = GPDMA_CONN_DAC; // Linker List Item - unused GPDMACfg.DMALLI = (uint32_t)&DMA_LLI_Struct; // Setup channel with given parameter GPDMA_Setup(&GPDMACfg); DAC_ConverterConfigStruct.CNT_ENA =SET; DAC_ConverterConfigStruct.DMA_ENA = SET; DAC_Init(LPC_DAC); /* set time out for DAC*/ tmp = (PCLK_DAC_IN_MHZ*1000000)/(SINE_FREQ_IN_HZ*NUM_SINE_SAMPLE); DAC_SetDMATimeOut(LPC_DAC,tmp); DAC_ConfigDAConverterControl(LPC_DAC, &DAC_ConverterConfigStruct); // Enable GPDMA channel 0 GPDMA_ChannelCmd(0, ENABLE); while (1); return 1; }
/*********************************************************************//** * @brief c_entry: Main DAC program body * @param[in] None * @return None **********************************************************************/ void c_entry(void) { DAC_CONVERTER_CFG_Type DAC_ConverterConfigStruct; uint32_t dac_value = 0; volatile uint32_t i; /* GPDMA block section -------------------------------------------- */ /* Disable GPDMA interrupt */ NVIC_DisableIRQ(DMA_IRQn); /* preemption = 1, sub-priority = 1 */ NVIC_SetPriority(DMA_IRQn, ((0x01 << 3) | 0x01)); DAC_ConverterConfigStruct.CNT_ENA =SET; DAC_ConverterConfigStruct.DMA_ENA = SET; DAC_Init(0); /* set time out for DAC*/ DAC_SetDMATimeOut(0, 0xFFFF); DAC_ConfigDAConverterControl(0, &DAC_ConverterConfigStruct); /* Initialize GPDMA controller */ GPDMA_Init(); // Setup GPDMA channel -------------------------------- // channel 0 GPDMACfg.ChannelNum = 0; // Source memory GPDMACfg.SrcMemAddr = (uint32_t)(&dac_value); // Destination memory - unused GPDMACfg.DstMemAddr = 0; // Transfer size GPDMACfg.TransferSize = DMA_SIZE; // Transfer width - unused GPDMACfg.TransferWidth = 0; // Transfer type GPDMACfg.TransferType = GPDMA_TRANSFERTYPE_M2P; // Source connection - unused GPDMACfg.SrcConn = 0; // Destination connection GPDMACfg.DstConn = GPDMA_CONN_DAC; // Linker List Item - unused GPDMACfg.DMALLI = 0; // Setup channel with given parameter GPDMA_Setup(&GPDMACfg); /* Reset terminal counter */ Channel0_TC = 0; /* Reset Error counter */ Channel0_Err = 0; /* Enable GPDMA interrupt */ NVIC_EnableIRQ(DMA_IRQn); /* Wait for GPDMA processing complete */ while (1) { // Enable GPDMA channel 0 GPDMA_ChannelCmd(0, ENABLE); while ((Channel0_TC == 0) ); // Disable GPDMA channel 0 GPDMA_ChannelCmd(0, DISABLE); dac_value ++; if (dac_value == 0x3FF) dac_value = 0; //delay for(i=0;i<100000;i++); /* Reset terminal counter */ Channel0_TC = 0; // Re-setup channel GPDMA_Setup(&GPDMACfg); } }