[Atmel] SAML21走起27:SERCOM 串口DMA方式

[复制链接]
 楼主| ddllxxrr 发表于 2015-9-24 22:10 | 显示全部楼层 |阅读模式
DMA方式的难点我觉得就是在配置DMA的上面,不但要使能DMA还要指定DMA的源地址和目地地址。


  1. <P> </P>

从上边可见,是以一个string数组为源,以USART数据寄存器为目地的DMA传输。

具体的打开快速指导,并按内容形成程序。


具体程序如下:


  1. <P>#include <asf.h>
  2. struct usart_module usart_instance;
  3. struct dma_resource usart_dma_resource_rx;
  4. struct dma_resource usart_dma_resource_tx;</P>
  5. <P>#define BUFFER_LEN    8
  6. static uint16_t string[BUFFER_LEN];
  7. COMPILER_ALIGNED(16)
  8. DmacDescriptor example_descriptor_rx;
  9. DmacDescriptor example_descriptor_tx;</P>
  10. <P>
  11. static void transfer_done_rx(struct dma_resource* const resource )
  12. {    dma_start_transfer_job(&usart_dma_resource_tx);}
  13. static void transfer_done_tx(struct dma_resource* const resource )
  14. {    dma_start_transfer_job(&usart_dma_resource_rx);}
  15. static void configure_dma_resource_rx(struct dma_resource *resource)
  16. {   
  17. struct dma_resource_config config;
  18. dma_get_config_defaults(&config);
  19. config.peripheral_trigger = EDBG_CDC_SERCOM_DMAC_ID_RX;
  20. config.trigger_action = DMA_TRIGGER_ACTON_BEAT;
  21. dma_allocate(resource, &config);}
  22. static void setup_transfer_descriptor_rx(DmacDescriptor *descriptor)
  23. {    struct dma_descriptor_config descriptor_config;
  24.   dma_descriptor_get_config_defaults(&descriptor_config);
  25.   descriptor_config.beat_size = DMA_BEAT_SIZE_HWORD;
  26.   descriptor_config.src_increment_enable = false;
  27.   descriptor_config.block_transfer_count = BUFFER_LEN;
  28.   descriptor_config.destination_address =            (uint32_t)string + sizeof(string);
  29.   descriptor_config.source_address =            (uint32_t)(&usart_instance.hw->USART.DATA.reg);
  30.   dma_descriptor_create(descriptor, &descriptor_config);}
  31. static void configure_dma_resource_tx(struct dma_resource *resource)
  32. {    struct dma_resource_config config;
  33.   dma_get_config_defaults(&config);
  34.   config.peripheral_trigger = EDBG_CDC_SERCOM_DMAC_ID_TX;
  35.   config.trigger_action = DMA_TRIGGER_ACTON_BEAT;
  36.   dma_allocate(resource, &config);}
  37. static void setup_transfer_descriptor_tx(DmacDescriptor *descriptor)
  38. {    struct dma_descriptor_config descriptor_config;
  39.   dma_descriptor_get_config_defaults(&descriptor_config);
  40.   descriptor_config.beat_size = DMA_BEAT_SIZE_HWORD;
  41.   descriptor_config.dst_increment_enable = false;
  42.   descriptor_config.block_transfer_count = BUFFER_LEN;
  43.   descriptor_config.source_address = (uint32_t)string + sizeof(string);
  44.   descriptor_config.destination_address =        (uint32_t)(&usart_instance.hw->USART.DATA.reg);
  45.   dma_descriptor_create(descriptor, &descriptor_config);}
  46. static void configure_usart(void)
  47. {    struct usart_config config_usart;
  48.   usart_get_config_defaults(&config_usart);
  49.   config_usart.baudrate    = 9600;
  50.   config_usart.mux_setting = EDBG_CDC_SERCOM_MUX_SETTING;
  51.   config_usart.pinmux_pad0 = EDBG_CDC_SERCOM_PINMUX_PAD0;
  52.   config_usart.pinmux_pad1 = EDBG_CDC_SERCOM_PINMUX_PAD1;
  53.   config_usart.pinmux_pad2 = EDBG_CDC_SERCOM_PINMUX_PAD2;
  54.   config_usart.pinmux_pad3 = EDBG_CDC_SERCOM_PINMUX_PAD3;
  55.   while (usart_init(&usart_instance,            EDBG_CDC_MODULE, &config_usart) != STATUS_OK) {    }
  56.        usart_enable(&usart_instance);}
  57.   
  58. int main (void)
  59. {

  60.    
  61.    /* Initialize the system and console*/
  62.    system_init();
  63.      configure_usart();
  64.   configure_dma_resource_rx(&usart_dma_resource_rx);
  65.   configure_dma_resource_tx(&usart_dma_resource_tx);
  66.   setup_transfer_descriptor_rx(&example_descriptor_rx);
  67.   setup_transfer_descriptor_tx(&example_descriptor_tx);
  68.   dma_add_descriptor(&usart_dma_resource_rx, &example_descriptor_rx);
  69.   dma_add_descriptor(&usart_dma_resource_tx, &example_descriptor_tx);
  70.   dma_register_callback(&usart_dma_resource_rx, transfer_done_rx,            DMA_CALLBACK_TRANSFER_DONE);
  71.   dma_register_callback(&usart_dma_resource_tx, transfer_done_tx,            DMA_CALLBACK_TRANSFER_DONE);
  72.   dma_enable_callback(&usart_dma_resource_rx,            DMA_CALLBACK_TRANSFER_DONE);
  73.   dma_enable_callback(&usart_dma_resource_tx,            DMA_CALLBACK_TRANSFER_DONE);
  74.   
  75.    dma_start_transfer_job(&usart_dma_resource_rx);    while (true) {    }</P>
  76. <P>}
  77. </P>
以下是运行结果:

每当我键入8个字符后,就通过串口输出:



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

2403

主题

6994

帖子

68

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:http://shop34182318.taobao.com/ http://shop562064536.taobao.com

2403

主题

6994

帖子

68

粉丝
快速回复 在线客服 返回列表 返回顶部