[活动专区] 【AutoChips MCU评测报告】+ADC+DMA多通道采样

[复制链接]
6749|2
 楼主| caizhiwei 发表于 2020-6-7 17:24 | 显示全部楼层 |阅读模式
      Ac7811这里用dma确实比较节省cpu资源,特别是多通道多路AD采样。
驱动代码如下:
  1. #include "ac78xx_adc.h"
  2. #include "ac78xx_gpio.h"
  3. #include "ac78xx.h"
  4. #include "ac78xx_dma.h"

  5. _Bool g_dmaFinish = 0;

  6. /**
  7. * ADCDMACallback
  8. *
  9. * @param[in]  DMAx:DMA Channel Pointer
  10. * @param[in]  wparam:DMA Channel status
  11. * @param[in]  lparam:DMA Channel status
  12. * [url=home.php?mod=space&uid=266161]@return[/url] no
  13. *
  14. * [url=home.php?mod=space&uid=247401]@brief[/url]  ADC DMA channel Complete Interrupt
  15. */
  16. int32_t ADCDMACallback(DMA_Type *DMAx, uint32_t wparam, uint32_t lparam)
  17. {
  18.     g_dmaFinish = 1;
  19.     return 0;
  20. }

  21. /**
  22. * DMA_Config
  23. *
  24. * @param[in]  no
  25. * @return no
  26. *
  27. * ADC0_Value = *(uint32_t *)0x20006000;
  28. * ADC1_Value = *(uint32_t *)0x20006004;
  29. * ADC2_Value = *(uint32_t *)0x20006008;
  30. * ADC3_Value = *(uint32_t *)0x2000600C;
  31. * ADC4_Value = *(uint32_t *)0x20006010;
  32. * ADC5_Value = *(uint32_t *)0x20006014;
  33. *
  34. * @brief  Setting DMA always work
  35. */
  36. void DMA_Config(void)
  37. {
  38.     uint32_t tmpMemStartAddr = 0x20006000;
  39.     uint32_t tmpMemEndAddr = 0x2000ff00;                    ///<Setting memory DMA address
  40.     DMA_ConfigType tmpDMAConfig = {0};

  41.     *(uint32_t *)(tmpMemStartAddr) = 0x44332211;
  42.     *(uint32_t *)(tmpMemStartAddr + 0x4) = 0xDDCCBBAA;
  43.     *(uint32_t *)(tmpMemStartAddr + 0x8) = 0x88776655;      ///<Just test address write

  44.     tmpDMAConfig.memStartAddr = tmpMemStartAddr;
  45.     tmpDMAConfig.memEndAddr = tmpMemEndAddr;
  46.     tmpDMAConfig.periphStartAddr = (uint32_t)(&(ADC->RDR)); ///<Move ADC DR to memory
  47.     tmpDMAConfig.setting.channelEn = 1;                     ///<Enable DMAx channel
  48.     tmpDMAConfig.setting.finishIntEn = 1;                   ///<Enable DMA transfer complete interrupt
  49.     tmpDMAConfig.setting.halfFinishIntEn = 0;               ///<Disable DMA transfer half complete interrupt
  50.     tmpDMAConfig.setting.errorIntEn = 1;
  51.     tmpDMAConfig.setting.channelPriority = 3;               ///<3: Very high priority
  52.     tmpDMAConfig.setting.circular = 1;                      ///<Circular mode enable,If want work one time disable
  53.     tmpDMAConfig.setting.direction = 0;                     ///<1: Read from peripheral
  54.     tmpDMAConfig.setting.MEM2MEM = 0;                       ///<Peripheral to memory
  55.     tmpDMAConfig.setting.memByteMode = 0;                   ///<1:16-bit[15:0]; 2:[23:16],[7:0]
  56.     tmpDMAConfig.setting.memIncrement = 1;                  ///<Memory address increment
  57.     tmpDMAConfig.setting.periphIncrement = 0;               ///<Peripheral address fixed
  58.     tmpDMAConfig.setting.memSize = 2;                       ///<2:32-bit
  59.     tmpDMAConfig.setting.periphSize = 1;                    ///<Fixed 1:16-bit
  60.     tmpDMAConfig.setting.transferNum = 6;               ///<As request

  61.     DMA_Initialize(DMA1, &tmpDMAConfig);                    ///<Use DMA1 channel
  62.     DMA_SetEventCallback(DMA1, ADCDMACallback);
  63.     NVIC_EnableIRQ(DMA1_IRQn);
  64.     ADC_DMACmd(ADC, ADC_ENABLE);
  65. }

  66. /**
  67. * ADC_Config
  68. *
  69. * @param[in]  no
  70. * @return no
  71. *
  72. * @brief  Setting ADC
  73. */
  74. void ADC_Config(void)
  75. {
  76.     ADC_InitType tempAdcConfig = {0, 0, 0, 0, 0, 0, 1};
  77.     ADC_TrigSourceType tempAdcTrigSource = {0, 0};
  78.     ADC_InitType* adcConfig;
  79.     ADC_TrigSourceType* adcTrigSource;
  80.     adcConfig = &tempAdcConfig;
  81.     adcTrigSource = &tempAdcTrigSource;
  82.     adcConfig->scanMode = 1;                       ///<ADC mode 5
  83.     adcConfig->continousMode = 1;
  84.     adcConfig->disContinousModeOnRegularGroup = 0;
  85.     adcConfig->disContinousModeOnInjectGroup = 0;
  86.     adcConfig->injectAutoMode = 0;

  87.     GPIO_SetFunc(7, 1);                            ///<ADC_IN0 Analog function enable
  88.     GPIO_SetFunc(8, 1);                            ///<ADC_IN1 Analog function enable
  89.     GPIO_SetFunc(9, 1);                            ///<ADC_IN2 Analog function enable
  90.     GPIO_SetFunc(10, 1);                           ///<ADC_IN3 Analog function enable
  91.     GPIO_SetFunc(11, 1);                           ///<ADC_IN4 Analog function enable
  92.     GPIO_SetFunc(12, 1);                           ///<ADC_IN5 Analog function enable

  93.     ADC_Init(ADC, adcConfig);                      ///<ADC works Mode Config
  94.     ADC_SetClockPrescaler(ADC, 4);                 ///<Set ADC Sample Rate 369K = 96M/2/(4+1)/(14+12)
  95.     ADC_TrigSourceInit(ADC, adcTrigSource);
  96.     ADC_SetRegularGroupLength(ADC, 6);             //setting 6 ADC channel sample

  97.     ADC_SetRegularGroupSequence(ADC, 1, ADC_CHANNEL_AD0); //set ADC_CHANNEL0 for AD Sample
  98.     ADC_SetRegularGroupSequence(ADC, 2, ADC_CHANNEL_AD1); //set ADC_CHANNEL1 for AD Sample
  99.     ADC_SetRegularGroupSequence(ADC, 3, ADC_CHANNEL_AD2); //set ADC_CHANNEL2 for AD Sample
  100.     ADC_SetRegularGroupSequence(ADC, 4, ADC_CHANNEL_AD3); //set ADC_CHANNEL3 for AD Sample
  101.     ADC_SetRegularGroupSequence(ADC, 5, ADC_CHANNEL_AD4); //set ADC_CHANNEL4 for AD Sample
  102.     ADC_SetRegularGroupSequence(ADC, 6, ADC_CHANNEL_AD5); //set ADC_CHANNEL5 for AD Sample
  103.     ADC_ChannelSampleTimeSel(ADC, ADC_CHANNEL_AD0, ADC_SampleTime_14Cycle); ///<Set ADC Sample Rate 369K = 96M/2/(4+1)/(14+12)
  104.     ADC_ChannelSampleTimeSel(ADC, ADC_CHANNEL_AD1, ADC_SampleTime_14Cycle); ///<Set ADC Sample Rate 369K = 96M/2/(4+1)/(14+12)
  105.     ADC_ChannelSampleTimeSel(ADC, ADC_CHANNEL_AD2, ADC_SampleTime_14Cycle); ///<Set ADC Sample Rate 369K = 96M/2/(4+1)/(14+12)
  106.     ADC_ChannelSampleTimeSel(ADC, ADC_CHANNEL_AD3, ADC_SampleTime_14Cycle); ///<Set ADC Sample Rate 369K = 96M/2/(4+1)/(14+12)
  107.     ADC_ChannelSampleTimeSel(ADC, ADC_CHANNEL_AD4, ADC_SampleTime_14Cycle); ///<Set ADC Sample Rate 369K = 96M/2/(4+1)/(14+12)
  108.     ADC_ChannelSampleTimeSel(ADC, ADC_CHANNEL_AD5, ADC_SampleTime_14Cycle); ///<Set ADC Sample Rate 369K = 96M/2/(4+1)/(14+12)
  109.     ADC_Cmd(ADC, ENABLE);
  110. }


如何调用呢?
只要在主循环之前初始化即可。
  1. ADC_Config();
  2.     DMA_Config();
  3.     ADC_SoftwareStartRegularConvCmd(ADC, ADC_ENABLE);
到这里就OK了,历程还是非常给力的!
WJY19950827 发表于 2021-8-19 14:21 | 显示全部楼层
本帖最后由 WJY19950827 于 2021-8-19 14:23 编辑

;;
duo点 发表于 2021-10-3 10:17 来自手机 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

100

主题

856

帖子

16

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