爱问知识人 爱问教育 医院库

stm32f4的DAC的DMA传输地址是什么?

首页

stm32f4的DAC的DMA传输地址是什么?

stm32f4的DAC的DMA传输地址是什么?

提交回答

全部答案

    2017-10-06 04:58:09
  •   ADC采集到的数据都存储在一个固定的寄存器中。当常规采样方式采样多个通道时候,使用DMA可以较好地避免将采集到的数据丢失。当ADC的DMA功能被使能的时候,每个通道转换完毕时都会发出一个DMA请求。DMA方式也不能完全避免数据丢失问题,要实现数据不丢失需要在DMA的同时开启OVERRUN模式,当数据丢失时就停止数据转换。
      我们只需要检测是否有OVR时间发生,就能解决采样数据丢失造成的问题。比如,通道错位什么的。
    在STM32F4的Reference?manual中可以查到ADC1?的DMA映射在DMA1、CH0、Stream0上。
    【实验1、DMA方式采集单一通道数据】
    ???????配置ADC1的DMA初始化设置如下:
    //DMA初始化
    DMA_InitStructure。
      DMA_BufferSize?=?4;
    DMA_InitStructure。DMA_Channel?=?DMA_Channel_0;
    DMA_InitStructure。DMA_DIR?=?DMA_DIR_PeripheralToMemory;
    DMA_InitStructure。
      DMA_FIFOMode?=?DMA_FIFOMode_Disable;
    DMA_InitStructure。DMA_Memory0BaseAddr?=?(uint32_t)&adcvalue1;???//目标数据位
    DMA_InitStructure。
      DMA_MemoryBurst?=?DMA_MemoryBurst_Single;
    DMA_InitStructure。DMA_MemoryDataSize?=?DMA_MemoryDataSize_HalfWord;
    DMA_InitStructure。
      DMA_MemoryInc?=?DMA_MemoryInc_Disable;
    DMA_InitStructure。DMA_Mode?=?DMA_Mode_Circular;
    DMA_InitStructure。
      DMA_PeripheralBaseAddr?=?ADC1_BASE 0x4C;??//ADC->DR地址
    DMA_InitStructure。DMA_PeripheralBurst?=DMA_PeripheralBurst_Single;
    DMA_InitStructure。
      DMA_PeripheralDataSize?=?DMA_PeripheralDataSize_HalfWord;
    DMA_InitStructure。DMA_PeripheralInc?=?DMA_PeripheralInc_Disable;
    DMA_InitStructure。
      DMA_Priority?=?DMA_Priority_High;
    DMA_Init(DMA2_Stream0,&DMA_InitStructure);
    DMA_Cmd(DMA2_Stream0,ENABLE);
    在ADC寄存器中开启DMA传输,使用两个函数一个是设置CR2的DDS位,使得每次ADC数据更新时开启DMA传输;
    另一个是设置ADC?CR2的DMA位,使能ADC的DMA传输。
      
    分别使用以下两个函数:
    ADC_DMARequestAfterLastTransferCmd(ADC1,ENABLE);?//源数据变化时开启DMA传输
    ADC_DMACmd(ADC1,ENABLE);//使能ADC的DMA传输
    最后,还是在adcvalue中读出ADC的采样值,可以看到,没有使用函数ADC_GetConversionValue来读ADC的DR寄存器,照样能输出ADC采样到的值:
    ??while(1)
    ??{
    ????for(i?=?0;i<10000;i )
    ????{
    ????????sum? =?adcvalue1;
    ??????if(i?==9999)
    ??????{
    ?????????avgvota?=?sum/10000;
    ?????????sum?=?0;
    ????????printf("avg?vota?is:?%d ",avgvota*3300/0xfff);
    ??????}
    ????}
    ??}
    【实验2、DMA方式采集4个通道数据】
    同时采样两路数据首先要将ADC_InitStructyre中的ADC_NbrOfConversion?改变。
      之后再用ADC_RegularChannelConfig将通道0添加到扫描通道序列即可。
    从一路变成4路,总共改了一行代码,添加3行代码:
    ADC_InitStructyre。ADC_NbrOfConversion?=?2;
    ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_144Cycles);
    ADC_RegularChannelConfig(ADC1,ADC_Channel_1,2,ADC_SampleTime_144Cycles);
    ADC_RegularChannelConfig(ADC1,ADC_Channel_2,3,ADC_SampleTime_144Cycles);
    ADC_RegularChannelConfig(ADC1,ADC_Channel_3,4,ADC_SampleTime_144Cycles);
    实验时候,将PA0、PA1、PA2、PA3的输入接地或者接3。
      3伏电源,可在电脑端看到两个数据在跳变:0和3300。说明采样到了数据。
    【附注】
    在进行这个实验时候,遇到了一个小插曲。
    在对PA端口进行初始化的时候,我是这样写的:
    GPIO_InitStructure。
      GPIO_Pin?=?GPIO_PinSource0?|?GPIO_PinSource1?|?GPIO_PinSource2?|?GPIO_PinSource3;
    这个问题导致了GPIO初始化的失败,是的ADC采样不到相应引脚的值。
      我一直在找DMA和ADC的配置问题,偶然才发现不能这么些。
    GPIO_PinSource0?和?GPIO_Pin_0?是不一样的。引脚初始化的时候应该用GPIO_Pin_0。查看库里边的宏定义,两个值是不一样的。
    GPIO_PinSource0?指的是引脚号,GPIO_Pin_0却是GPIo寄存器里边对应的位。
      一定要分清楚
    改过来之后就一切正常了,可以完美采样四路输入的数据。

    f***

    2017-10-06 04:58:09

  • 2017-10-06 04:58:09
  • 可以查看官方文件中关于外设的寄存器地址,AD中有一个专用寄存器用来存放转换结果的数据

    伱***

    2017-10-06 04:58:09

类似问题

换一换
  • 网站推荐 相关知识

  • 电脑网络技术
  • 电脑网络

相关推荐

正在加载...
最新问答 推荐信息 热门专题 热点推荐
  • 1-20
  • 21-40
  • 41-60
  • 61-80
  • 81-100
  • 101-120
  • 121-140
  • 141-160
  • 161-180
  • 181-200
  • 1-20
  • 21-40
  • 41-60
  • 61-80
  • 81-100
  • 101-120
  • 121-140
  • 141-160
  • 161-180
  • 181-200
  • 1-20
  • 21-40
  • 41-60
  • 61-80
  • 81-100
  • 101-120
  • 121-140
  • 141-160
  • 161-180
  • 181-200
  • 1-20
  • 21-40
  • 41-60
  • 61-80
  • 81-100
  • 101-120
  • 121-140
  • 141-160
  • 161-180
  • 181-200

热点检索

  • 1-20
  • 21-40
  • 41-60
  • 61-80
  • 81-100
  • 101-120
  • 121-140
  • 141-160
  • 161-180
  • 181-200
返回
顶部
帮助 意见
反馈

确定举报此问题

举报原因(必选):