OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7029|回复: 4

stm8l DMA 2路ADC

[复制链接]

3

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2013-7-3
在线时间
7 小时
发表于 2015-4-26 16:01:01 | 显示全部楼层 |阅读模式
5金钱
在做两路ADC的时候用DMA来取值,会出现这有时候两路对应寄存器的值对,有时候对应的值不对,不对的时候交换了,取值是在DMA中断里取的,下面是配置:
void DMAInit(void)
{
  /* Enable DMA1 clock */
  CLK_PeripheralClockConfig(CLK_Peripheral_DMA1, ENABLE);
  /* Connect ADC to DMA channel 0 */
  SYSCFG_REMAPDMAChannelConfig(REMAP_DMA1Channel_ADC1ToChannel0);
  DMA_GlobalDeInit();
  DMA_DeInit(DMA1_Channel0);
  
  DMA_Init(DMA1_Channel0, BUFFER_ADDRESS,
           ADC1_DR_ADDRESS,
           BUFFER_SIZE,
           DMA_DIR_PeripheralToMemory,
           DMA_Mode_Circular,
           DMA_MemoryIncMode_Inc,
           DMA_Priority_High,
           DMA_MemoryDataSize_HalfWord);

  /* DMA Channel0 enable */
  DMA_Cmd(DMA1_Channel0, ENABLE);

  /* Enable DMA1 channel0 Transfer complete interrupt */
  DMA_ITConfig(DMA1_Channel0, DMA_ITx_TC, ENABLE);
  
  /* DMA enable */
  DMA_GlobalCmd(ENABLE);
  
}

void ADCInit(void)
{
  CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, ENABLE);
   // de-initialize ADC
  ADC_DeInit(ADC1);

  // ADC configuration ---------------------------------------//
  ADC_Init(ADC1, ADC_ConversionMode_Continuous,
           ADC_Resolution_12Bit, ADC_Prescaler_1);
   // SampleTime: 384 cycles
  ADC_SamplingTimeConfig(ADC1,ADC_Group_SlowChannels, ADC_SamplingTime_384Cycles);
  
  ADC_ChannelCmd(ADC1,ADC_Channel_16,ENABLE);
  ADC_ChannelCmd(ADC1,ADC_Channel_17,ENABLE);
  ADC_DMACmd(ADC1,ENABLE);
  
  ADC_VrefintCmd(ENABLE);
  // enable ADC
  ADC_Cmd(ADC1,ENABLE);
  ADC_SoftwareStartConv(ADC1);
  // start ADC convertion by software
  //ADC1->CR1 |= ADC_CR1_START;
  // wait until end-of-covertion
  //while( ADC_GetFlagStatus(ADC_FLAG_EOC) == 0 ) ;
//value = ADC_GetConversionValue();

}

是我配置不对还是取值不对?

INTERRUPT_HANDLER(DMA1_CHANNEL0_1_IRQHandler,2)
{
    /* In order to detect unexpected events during development,
       it is recommended to set a breakpoint on the following instruction.
    */  
  
    /* Calculate RV2 voltage value*/
  RV16Voltage = (uint32_t)((uint32_t)Buffer[0] * (uint32_t)ADC_RATIO) / 1000;


  /* Calculate CN15 voltage value*/
  CN17Voltage = (uint32_t)((uint32_t)Buffer[1] * (uint32_t)ADC_RATIO) / 1000;
  /* Clear IT Pending Bit */
  DMA_ClearITPendingBit(DMA1_IT_TC0);
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-4-26 23:00:08 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2016-4-5
在线时间
10 小时
发表于 2016-8-24 14:48:32 | 显示全部楼层
我也遇到同样问题,请问楼主解决了吗
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2016-8-24 19:53:14 | 显示全部楼层
帮顶
回复

使用道具 举报

15

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2020-3-12
在线时间
23 小时
发表于 2017-3-11 13:35:09 | 显示全部楼层
我也遇到了。。。。我用了6路AD,数据存到BUFFER[6]中,结果不是第一路AD对应的BUFFER[0],整个错位了。当然也能用
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 23:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表