2.8.3.1.2 Code
Add to the main application source file, outside of any functions:
structdac_module dac_instance;
structadc_module adc_instance;
structdma_resource example_resource;
Copy-paste the following setup code to your user application:COMPILER_ALIGNED(16)DmacDescriptor example_descriptor SECTION_DMAC_DESCRIPTOR;
Add to user application initialization (typically the start of main()):voidconfigure_adc(void){structadc_config config_adc;adc_get_config_defaults(&config_adc);#if !(SAML21)#if !(SAMC21)config_adc.gain_factor = ADC_GAIN_FACTOR_DIV2;#endifconfig_adc.resolution = ADC_RESOLUTION_10BIT;#endifconfig_adc.clock_prescaler = ADC_CLOCK_PRESCALER_DIV16;config_adc.reference = ADC_REFERENCE_INTVCC1;config_adc.positive_input = ADC_POSITIVE_INPUT_PIN4;config_adc.freerunning =true;config_adc.left_adjust =false;#if (SAMC21)adc_init(&adc_instance, ADC1, &config_adc);#elseadc_init(&adc_instance, ADC, &config_adc);#endifadc_enable(&adc_instance);}voidconfigure_dac(void){structdac_config config_dac;dac_get_config_defaults(&config_dac);#if (SAML21)config_dac.reference = DAC_REFERENCE_INTREF;#elseconfig_dac.reference = DAC_REFERENCE_AVCC;#endifdac_init(&dac_instance, DAC, &config_dac);}voidconfigure_dac_channel(void){structdac_chan_config config_dac_chan;dac_chan_get_config_defaults(&config_dac_chan);dac_chan_set_config(&dac_instance, DAC_CHANNEL_0, &config_dac_chan);dac_chan_enable(&dac_instance, DAC_CHANNEL_0);}voidconfigure_dma_resource(structdma_resource *resource){structdma_resource_config config;dma_get_config_defaults(&config);#if (SAMC21)config.peripheral_trigger = ADC1_DMAC_ID_RESRDY;#elseconfig.peripheral_trigger = ADC_DMAC_ID_RESRDY;#endifconfig.trigger_action = DMA_TRIGGER_ACTON_BEAT;dma_allocate(resource, &config);}voidsetup_transfer_descriptor(DmacDescriptor *descriptor){structdma_descriptor_config descriptor_config;dma_descriptor_get_config_defaults(&descriptor_config);descriptor_config.beat_size = DMA_BEAT_SIZE_HWORD;descriptor_config.dst_increment_enable =false;descriptor_config.src_increment_enable =false;descriptor_config.block_transfer_count = 1000;descriptor_config.source_address = (uint32_t)(&adc_instance.hw->RESULT.reg);#if (SAML21)descriptor_config.destination_address = (uint32_t)(&dac_instance.hw->DATA[DAC_CHANNEL_0].reg);#elsedescriptor_config.destination_address = (uint32_t)(&dac_instance.hw->DATA.reg);#endifdescriptor_config.next_descriptor_address = (uint32_t)descriptor;dma_descriptor_create(descriptor, &descriptor_config);}
configure_adc();configure_dac();configure_dac_channel();dac_enable(&dac_instance);configure_dma_resource(&example_resource);setup_transfer_descriptor(&example_descriptor);dma_add_descriptor(&example_resource, &example_descriptor);
