[demo程序] NV32F101x--模数转换试验(FIFO模式软件触,采用DMA搬运数据)

[复制链接]
 楼主| 詹求实 发表于 2020-5-28 10:08 | 显示全部楼层 |阅读模式
  1. ************************************************************************/
  2. #include "common.h"
  3. #include "ics.h"
  4. #include "rtc.h"
  5. #include "uart.h"
  6. #include "adc.h"
  7. #include "dma.h"
  8. #include "pmc.h"
  9. #include "sysinit.h"

  10. /**********************************************************************/
  11. uint16_t u16ADC_ConversionBuff[16];
  12. int main (void);
  13. void DMA_Group0_Task(void);
  14. /******************************************************************************/

  15. int main (void)
  16. {
  17.     //uint8_t         u8Ch = 0;
  18.     ADC_ConfigType  sADC_Config = {0};
  19.     DMAMUX_ConfigType DMAMUX_Config;
  20.           DMA_ConfigType  DMA_Config={0};
  21.                
  22.     /*系统初始化*/
  23.           sysinit();
  24.           printf("\nRunning the ADC_DMA_demo project.\r\n");

  25.     UART_WaitTxComplete(TERM_PORT);
  26.     LED0_Init();        
  27.    
  28.                 /*DMA初始化*/
  29.     DMA_Config.sSetting.bEnableDebug=1;            /*在调试模式下,DMA会停新通道启动*/
  30.           DMA_int(DMA,&DMA_Config);  
  31.        
  32.                 /*设置DMAMUX,选择DMA通道,DMA传输触发模式及信号请求源*/
  33.           DMAMUX_Config.sSetting.bChannelEnable=1;        /*使能DMA通道*/
  34.           DMAMUX_Config.sSetting.bChannelTriggerEn=0;     /*通过设定的DMA触发源触发DMA传输*/
  35.           DMAMUX_Config.u8ChannelSource=ADC0_DMAREQ;   /*ADC转换完成信号请求DMA通道传输*/
  36.           DMAMUX_ChannelConfig(DMAMUX,&DMAMUX_Config,DMA_CHANNEL0);
  37.        
  38.                 /*配置DMA通道TCD*/
  39.           DMA_Config.sSetting.bEnRequest=1;               /*使能通道硬件请求信号*/
  40.                 DMA_Config.sSetting.bEnErrIn=1;                 /*使能DMA通道错误中断*/
  41.                
  42.                 DMA_Config.u32Saddr=(uint32_t)(&ADC0->R);       /*源地址*/
  43.                 DMA_Config.u8Ssize=DMA_DATA_TRANSFER_SIZE2;     /*每次r/w序列从源地址中读取2个字节*/
  44.                 DMA_Config.s16Soff=0;                           /*每次从源地址读取一次数据后,源地址加0*/
  45.                 DMA_Config.u8Smod=DMA_ModuloDisable;            /*禁用源地址模数功能*/
  46.           DMA_Config.s32Slast=0;                           /*主循环结束后源地址偏移量*/
  47.              
  48.     DMA_Config.u32Daddr=(uint32_t)u16ADC_ConversionBuff;   /*目标地址*/                               
  49.                 DMA_Config.u8Dsize=DMA_DATA_TRANSFER_SIZE2;       /*每次向目标地址写入2个字节*/
  50.                 DMA_Config.s16Doff=2;                           /*每次向目标地址写入一次数据后目标地址加2*/
  51.           DMA_Config.u8Dmod= DMA_ModuloDisable;           /*目标地址禁用模数功能*/
  52.                 DMA_Config.s32Dlastga=-16;                        /*主循环结束目标地址-16*/
  53.                
  54.           DMA_Config.u32Nbytes=16;                        /*每次次循环传输16个字节,注:次循环传输字节数,受次循环映射影响*/
  55.                 DMA_Config.u16Biter=1;                          /*主循环迭代次数为1,注:主循环迭代次数,受次循环结束后通道链功能影响*/
  56.                 DMA_Config.u8Bwc=0;                             /*DMA引擎不停转*/
  57.                 DMA_Config.sSetting.bDisableRequest=0;          /*主循环结束后不禁用通道硬件请求信号*/
  58.                
  59.                 DMATCD_ChannelConfig(DMA,&DMA_Config,DMA_CHANNEL0);
  60.                 DMA_INTConfig(DMA,DMA_INT_Major,DMA_EnInt,DMA_CHANNEL0); /*中断设置*/
  61.     DMA_SetCallback(DMA,DMA_IntGroup1,DMA_Group0_Task);  /*注册回调函数*/
  62.                
  63.                
  64.     /*初始化ADC模块*/
  65.     sADC_Config.u8ClockDiv = ADC_ADIV_DIVIDE_8;       /*!< ADC时钟源分频系数为8*/
  66.     sADC_Config.u8ClockSource = CLOCK_SOURCE_ADACK;   /*!< ADC时钟源选择异步时钟*/
  67.     sADC_Config.u8Mode = ADC_MODE_12BIT;              /*!< 12位转换*/
  68.           sADC_Config.sSetting.bDmaEn = 1;                  /*!< ADC转换完成触发DMA搬运数据*/
  69.     sADC_Config.sSetting.bIntEn = 1;                  /*!< 使能中断*/
  70.     sADC_Config.u8FiFoLevel = ADC_FIFO_LEVEL8;        /*!< 8级FIFO */
  71.     ADC_Init( ADC0, &sADC_Config);           /*!< 初始化ADC*/

  72.                
  73.         while(1)
  74.         {
  75.               /*选择通道开始转换*/
  76.         ADC_SetChannel(ADC0,ADC_CHANNEL_AD14_TEMPSENSOR);
  77.         ADC_SetChannel(ADC0,ADC_CHANNEL_AD29_VREFH);
  78.         ADC_SetChannel(ADC0,ADC_CHANNEL_AD30_VREFL);
  79.         ADC_SetChannel(ADC0,ADC_CHANNEL_AD14_TEMPSENSOR);
  80.         ADC_SetChannel(ADC0,ADC_CHANNEL_AD29_VREFH);
  81.         ADC_SetChannel(ADC0,ADC_CHANNEL_AD30_VREFL);
  82.         ADC_SetChannel(ADC0,ADC_CHANNEL_AD29_VREFH);
  83.         ADC_SetChannel(ADC0,ADC_CHANNEL_AD30_VREFL);

  84.         printf("input any character to start a new conversion!\r\n");
  85.         UART_GetChar(TERM_PORT);
  86.         }

  87. }


 楼主| 詹求实 发表于 2020-5-28 10:08 | 显示全部楼层
  1. /***************************************************************************
  2. +FUNCTION----------------------------------------------------------------
  3. *
  4. * [url=home.php?mod=space&uid=247401]@brief[/url]  DMA中断回调函数
  5. *        
  6. * @param  none
  7. *
  8. * [url=home.php?mod=space&uid=266161]@return[/url] none
  9. *

  10. *****************************************************************************/
  11. /********************************************************************/
  12. void DMA_Group0_Task(void)
  13. {
  14.           uint8_t resultnum;
  15.           LED0_Toggle();
  16.           printf("ADC conversion result as below:\r\n");
  17.           
  18.                 for( resultnum =0 ;resultnum< 8; resultnum ++)
  19.                 {
  20.                         printf("0x%x,",u16ADC_ConversionBuff[resultnum]);
  21.     }       
  22. }
qcliu 发表于 2020-6-1 17:25 | 显示全部楼层
非常感谢楼主分享
tfqi 发表于 2020-6-1 17:25 | 显示全部楼层
代码很详细啊
wiba 发表于 2020-6-1 17:26 | 显示全部楼层
为什么叫fifo模式呢
zljiu 发表于 2020-6-1 17:26 | 显示全部楼层
感谢分享哈
coshi 发表于 2020-6-1 17:26 | 显示全部楼层
楼主辛苦了
gygp 发表于 2020-6-3 15:23 | 显示全部楼层
AD转换的DMA方式和非DMA方式有什么不同以及优缺点
chenci2013 发表于 2020-6-3 15:23 | 显示全部楼层
FIFO模式还是用了吗  
biechedan 发表于 2020-6-3 15:23 | 显示全部楼层
多通道 DMA 问题   
wangdezhi 发表于 2020-6-3 15:24 | 显示全部楼层
         
isseed 发表于 2020-6-3 15:24 | 显示全部楼层
DMA方式ADC转换   
xietingfeng 发表于 2020-6-3 15:24 | 显示全部楼层
扫描模式、连续转换模式  
suzhanhua 发表于 2020-6-3 15:25 | 显示全部楼层
最大的采样率可以到多少呢   
mituzu 发表于 2020-6-3 15:25 | 显示全部楼层
DMA其实只是做搬运工作的  
hellosdc 发表于 2020-6-3 15:25 | 显示全部楼层
         
uiint 发表于 2020-6-3 15:25 | 显示全部楼层
多通道采集可以不采用dma吗
wangdezhi 发表于 2020-6-3 15:26 | 显示全部楼层
谢谢楼主分享的资料了。   
biechedan 发表于 2020-6-3 15:26 | 显示全部楼层
传输完成标志得不到吗   
isseed 发表于 2020-6-3 15:26 | 显示全部楼层
这个的效率很高的。      
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

135

帖子

0

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