打印
[Atmel]

SAML21走起13:ADC DMA DAC

[复制链接]
1067|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
这个例子是通过ADC AIN4输入信号,不通过CPU尔直接通过DMA传给,DAC然后通过PA2输出。

打开上次的工和根据快速指导,建立相应的程序。



形文件后一定要注意在编译之前,一定要加入DAC和DMAC两个模块,并且点应用。否则编译器找不到文件:




程序如下:
#include <asf.h>

/* AC module software instance (must not go out of scope while in use) */
struct dac_module dac_instance;
struct adc_module adc_instance;
struct dma_resource example_resource;
COMPILER_ALIGNED(16)
DmacDescriptor example_descriptor SECTION_DMAC_DESCRIPTOR;

void configure_adc(void);
void configure_dac(void);
void configure_dac_channel(void);
void configure_dma_resource(struct dma_resource *resource);
void setup_transfer_descriptor(DmacDescriptor *descriptor);




void configure_adc(void)
{
        struct adc_config config_adc;
        adc_get_config_defaults(&config_adc);
        #if !(SAML21)
        config_adc.gain_factor     = ADC_GAIN_FACTOR_DIV2;
        config_adc.resolution      = ADC_RESOLUTION_10BIT;
        #endif
        config_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;
        adc_init(&adc_instance, ADC, &config_adc);
        adc_enable(&adc_instance);
}
void configure_dac(void)
{
        struct dac_config config_dac;
        dac_get_config_defaults(&config_dac);
        #if (SAML21)
        config_dac.reference = DAC_REFERENCE_INTREF;
        #else
        config_dac.reference = DAC_REFERENCE_AVCC;
        #endif
        dac_init(&dac_instance, DAC, &config_dac);
}
void configure_dac_channel(void)
{
        struct dac_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);
}
void configure_dma_resource(struct dma_resource *resource)
{
        struct dma_resource_config config;
        dma_get_config_defaults(&config);
        config.peripheral_trigger = ADC_DMAC_ID_RESRDY;
        config.trigger_action = DMA_TRIGGER_ACTON_BEAT;
        dma_allocate(resource, &config);
}
void setup_transfer_descriptor(DmacDescriptor *descriptor)
{
        struct dma_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);
        #else
        descriptor_config.destination_address = (uint32_t)(&dac_instance.hw->DATA.reg);
        #endif
        descriptor_config.next_descriptor_address = (uint32_t)descriptor;
        dma_descriptor_create(descriptor, &descriptor_config);
}




int main (void)
{
        system_init();
         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);
       
         adc_start_conversion(&adc_instance);
         dma_start_transfer_job(&example_resource);
         while (true) {
         }
       
}


相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:http://shop34182318.taobao.com/ http://shop562064536.taobao.com

2398

主题

6950

帖子

67

粉丝