电子发烧友第一次pcb layout大赛
直播中

敖伟

11年用户 29经验值
擅长:可编程逻辑 嵌入式技术 控制/MCU
私信 关注
[william hill官网 活动]

【从零开始学STM32】ADC试验

本帖最后由 qiu123fly 于 2013-11-1 20:48 编辑

自从参加william hill官网 活动,拿到YY-STM32板子以来,就一直在学习。
学习的参考,主要是野火的教材和教程。
本ADC教程也来自对野火stm32的学习。
好了,下面简要介绍一下本工程说明:
1)工程采用的库,版本为3.5
2)本工程对ADC1的1、2通道进行采样,采样结果转化为电压
3)ADC采用DMA工作方式
4)采样结果通过stm32的串口1(uart1)输出,在电脑端用串口调试工具就可以看到(波特率 115200,其他设置默认)

关键代码:
1)ADC1的配置与启动
/* Enable DMA channel1 */
    DMA_Cmd(DMA1_Channel1, ENABLE);


    /* ADC1 configuration */
   
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;    //独立ADC模式
    ADC_InitStructure.ADC_ScanConvMode = ENABLE ;      //扫描模式,扫描模式用于多通道采集
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;    //开启连续转换模式,即不停地进行ADC转换
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;    //不使用外部触发转换
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;     //采集数据右对齐
    ADC_InitStructure.ADC_NbrOfChannel = 2;         //要转换的通道数目2
   
    ADC_Init(ADC1, &ADC_InitStructure);
  
   
    /*配置ADC时钟,为PCLK2的8分频,即9Hz*/
    RCC_ADCCLKConfig(RCC_PCLK2_Div8);
    /*配置ADC1的通道2为55.    5个采样周期,序列为1 */
    ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_55Cycles5);
    /*配置ADC1的通道1为55.    5个采样周期,序列为2 */
    ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5);
   
   
    /* Enable ADC1 */
    ADC_Cmd(ADC1, ENABLE);
   
    /*复位校准寄存器 */   
    ADC_ResetCalibration(ADC1);
    /*等待校准寄存器复位完成 */
    while(ADC_GetResetCalibrationStatus(ADC1));
   
    /* ADC校准 */
    ADC_StartCalibration(ADC1);
    /* 等待校准完成*/
    while(ADC_GetCalibrationStatus(ADC1));
   
    /* Enable ADC1 DMA */
    ADC_DMACmd(ADC1, ENABLE);
    /* 将ADC_DMACmd(ADC1, ENABLE);放在  ADC_GetCalibrationFactor (ADC1);的后面。否则会错位

    /* 由于没有采用外部触发,所以使用软件触发ADC转换 */
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);
2)DMA的配置
    /* DMA channel1 configuration */
    DMA_DeInit(DMA1_Channel1);
    DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;     //ADC地址
    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;//内存地址
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
    //BufferSize=2,因为ADC转换序列有2个通道
    //如此设置,使序列1结果放在AD_Value[0],序列2结果放在AD_Value[1]
    DMA_InitStructure.DMA_BufferSize = 2;
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址固定
    //DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;  //内存地址固定
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;    //当前存储器地址递增
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;    //半字
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;        //循环传输
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
    DMA_Init(DMA1_Channel1, &DMA_InitStructure);
附件: 您需要登录才可以下载或查看附件。没有帐号?注册

回帖(15)

敖伟

2013-11-1 20:47:51
还没有人看,自己顶一下。
举报

悠悠飞雪

2013-11-3 02:06:15
明天也该ADC了,晚一步。
举报

h1708587186.5347

2013-11-4 13:13:19
现在还没来得及看。。。。。过两天看。。。先mark一下。。。
举报

Robber·

2013-11-4 13:37:07
我也来顶下
举报

1652981125.048900

2013-11-4 20:42:53
学习了!!!!!!!

走过,路过,别错过!
举报

1652981125.048900

2013-11-4 20:58:31
jiayou回复,赚回来!!!!
举报

李东达

2013-11-5 19:13:22
顶一个  最近自己也在写ADC
举报

陈文胜

2013-11-5 19:53:29
走过,路过,别错过!
举报

周红伟

2013-11-8 13:35:32
{:1:}{:1:}
举报

love9999

2013-12-19 20:09:40
{:12:}{:12:}
举报

love9999

2013-12-19 20:09:52
{:12:}{:12:}{:8:}{:8:}
举报

早早XYT

2014-3-26 19:12:37
楼主,不全啊!工程在哪啊
举报

早早XYT

2014-3-26 19:16:37
我最近也在做STM32的DAC多通道,用的DMA,为什么数据读不出来啊?
举报

bidinghong

2014-4-11 13:46:54
学习学习,顶顶顶。
举报

王宁波

2016-1-26 21:51:40
彼此彼此彼此彼此不才不才不才不才不才
举报

更多回帖

发帖
×
20
完善资料,
赚取积分