你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

分享一个ADC的DMA

[复制链接]
hhhhhhhaa 发布时间:2018-12-13 14:34
只做了一路,多路的话自己扩展
  1. #include "adc.h"
  2. #include "delay.h"
  3. //////////////////////////////////////////////////////////////////////////////////         
  4. //本程序只供学习使用,未经作者许可,不得用于其它任何用途
  5. //ALIENTEK miniSTM32开发板
  6. //ADC 代码          
  7. //正点原子@ALIENTEK
  8. //技术论坛:www.openedv.com
  9. //修改日期:2012/9/7
  10. //版本:V1.0
  11. //版权所有,盗版必究。
  12. //Copyright(C) 广州市星翼电子科技有限公司 2009-2019
  13. //All rights reserved                                                                          
  14. //////////////////////////////////////////////////////////////////////////////////
  15.           
  16. __IO uint16_t ADC_ConvertedValue;  
  17. //初始化ADC
  18. //这里我们仅以规则通道为例
  19. //我们默认将开启通道0~3                                                                                                                                          
  20. void  Adc_Init(void)
  21. {        
  22.         ADC_InitTypeDef ADC_InitStructure;
  23.         GPIO_InitTypeDef GPIO_InitStructure;
  24. /*--------------------------DMA部分---------------------------*/
  25.         DMA_InitTypeDef DMA_InitStructure;       
  26.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);// 打开DMA时钟
  27.         DMA_DeInit(DMA1_Channel1);// 复位DMA控制器
  28.         DMA_InitStructure.DMA_PeripheralBaseAddr = ( uint32_t ) ( & ( ADC1->DR ) );        // 配置 DMA 初始化结构体        // 外设基址为:ADC 数据寄存器地址
  29.         DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC_ConvertedValue;// 存储器地址,实际上就是一个内部SRAM的变量
  30.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;// 数据源来自外设
  31.         DMA_InitStructure.DMA_BufferSize = 1;// 缓冲区大小为1,缓冲区的大小应该等于存储器的大小
  32.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;// 外设寄存器只有一个,地址不用递增
  33.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable; // 存储器地址固定
  34.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;// 外设数据大小为半字,即两个字节
  35.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;// 存储器数据大小也为半字,跟外设数据大小相同
  36.         DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;        // 循环传输模式
  37.         DMA_InitStructure.DMA_Priority = DMA_Priority_High;// DMA 传输通道优先级为高,当使用一个DMA通道时,优先级设置不影响
  38.         DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;// 禁止存储器到存储器模式,因为是从外设到存储器
  39.         DMA_Init(DMA1_Channel1, &DMA_InitStructure);// 初始化DMA
  40.         DMA_Cmd(DMA1_Channel1 , ENABLE);// 使能 DMA 通道
  41.         /*--------------------------DMA结束---------------------------*/
  42.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1        , ENABLE );          //使能ADC1通道时钟
  43.         RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M

  44.        
  45.         //PA1 作为模拟通道输入引脚                        
  46.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  47.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                //模拟输入引脚
  48.         GPIO_Init(GPIOA, &GPIO_InitStructure);       

  49.         ADC_DeInit(ADC1);  //复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值

  50.         ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;        //ADC工作模式:ADC1和ADC2工作在独立模式
  51.         ADC_InitStructure.ADC_ScanConvMode =DISABLE ;        //模数转换工作在单通道模式
  52.         ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;        //模数转换工作在单次转换模式
  53.         ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;        //转换由软件而不是外部触发启动
  54.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;        //ADC数据右对齐
  55.         ADC_InitStructure.ADC_NbrOfChannel = 1;        //顺序进行规则转换的ADC通道的数目
  56.         ADC_Init(ADC1, &ADC_InitStructure);        //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器   
  57.   ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5 );
  58.         ADC_DMACmd(ADC1, ENABLE);        // 使能ADC DMA 请求
  59.        
  60.         ADC_Cmd(ADC1, ENABLE);        //使能指定的ADC1
  61.         ADC_ResetCalibration(ADC1);        //使能复位校准  
  62.         while(ADC_GetResetCalibrationStatus(ADC1));        //等待复位校准结束
  63.         ADC_StartCalibration(ADC1);         //开启AD校准
  64.         while(ADC_GetCalibrationStatus(ADC1));         //等待校准结束
  65.         ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //使能指定的ADC1的软件转换启动功能
  66. }                                  
  67. //获得ADC值
  68. //ch:通道值 0~3
  69. u16 Get_Adc(u8 ch)   
  70. {
  71.           //设置指定ADC的规则组通道,一个序列,采样时间
  72. //        ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );        //ADC1,ADC通道,采样时间为239.5周期                                      
  73. //  
  74. //        ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //使能指定的ADC1的软件转换启动功能       
  75. //         
  76. //        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束

  77.         return ADC_GetConversionValue(ADC1);        //返回最近一次ADC1规则组的转换结果
  78. }

  79. u16 Get_Adc_Average(u8 ch,u8 times)
  80. {
  81.         u32 temp_val=0;
  82.         u8 t;
  83.         for(t=0;t<times;t++)
  84.         {
  85. //                temp_val+=Get_Adc(ch);
  86.                 temp_val+=ADC_ConvertedValue;
  87.                 delay_ms(5);
  88.         }
  89.         return temp_val/times;
  90. }          
































  91. #ifndef __ADC_H
  92. #define __ADC_H       
  93. #include "sys.h"
  94. //本程序只供学习使用,未经作者许可,不得用于其它任何用途
  95. //ALIENTEK战舰STM32开发板
  96. //ADC 代码          
  97. //正点原子@ALIENTEK
  98. //技术论坛:www.openedv.com
  99. //修改日期:2012/9/7
  100. //版本:V1.0
  101. //版权所有,盗版必究。
  102. //Copyright(C) 广州市星翼电子科技有限公司 2009-2019
  103. //All rights reserved                                                                          
  104. //////////////////////////////////////////////////////////////////////////////////

  105. void Adc_Init(void);
  106. u16  Get_Adc(u8 ch);
  107. u16 Get_Adc_Average(u8 ch,u8 times);

  108. #endif
复制代码


收藏 评论2 发布时间:2018-12-13 14:34

举报

2个回答
hhhhhhhaa 回答时间:2018-12-13 14:39:05
说明一下,我是参考了正点原子的ADC和野火的DMA ADC来配置的,野火的例子总是重命名,对于我们这种初学者来说太复杂了,所以我就改了改
zccdyfw 回答时间:2019-1-17 10:59:00

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版