打印
[STM8]

STM8L152 ADC_DMA读出数有移动

[复制链接]
3796|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
playerol|  楼主 | 2015-7-13 11:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#define ADC1_DR_ADDRESS        ((uint16_t)0x5344)
#define BUFFER_SIZE            ((uint8_t) 0x08)
#define BUFFER_ADDRESS         ((uint16_t)(&Buffer))
signed int Buffer[BUFFER_SIZE]  = {0,0,0,0,0,0,0,0};

void ADC_DMAInit(void)
{
     ADC_DeInit(ADC1);
     DMA_GlobalDeInit();
     CLK_PeripheralClockConfig(CLK_Peripheral_ADC1,ENABLE);
     CLK_PeripheralClockConfig(CLK_Peripheral_DMA1,ENABLE);
     ADC_Init(ADC1,ADC_ConversionMode_Continuous,ADC_Resolution_12Bit,ADC_Prescaler_2);
     ADC_SamplingTimeConfig(ADC1,ADC_Group_SlowChannels,ADC_SamplingTime_384Cycles);
     ADC_SamplingTimeConfig(ADC1, ADC_Group_FastChannels, ADC_SamplingTime_384Cycles);
     ADC_Cmd(ADC1, ENABLE);     
     ADC_ChannelCmd(ADC1,ADC_Channel_2,ENABLE);//电位器4
     ADC_ChannelCmd(ADC1,ADC_Channel_8,ENABLE);//电位器3
     ADC_ChannelCmd(ADC1,ADC_Channel_9,ENABLE);//电位器2
     ADC_ChannelCmd(ADC1,ADC_Channel_10,ENABLE);//电位器1
     ADC_ChannelCmd(ADC1,ADC_Channel_18,ENABLE);
     ADC_ChannelCmd(ADC1,ADC_Channel_19,ENABLE);
     ADC_ChannelCmd(ADC1,ADC_Channel_20,ENABLE);
     ADC_ChannelCmd(ADC1,ADC_Channel_21,ENABLE);

     SYSCFG_REMAPDMAChannelConfig(REMAP_DMA1Channel_ADC1ToChannel0);
     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_Cmd(DMA1_Channel0, ENABLE);
     DMA_ITConfig(DMA1_Channel0,DMA_ITx_TC,ENABLE);
    DMA_GlobalCmd(ENABLE);
    ADC_DMACmd(ADC1, ENABLE);
    ADC_SoftwareStartConv(ADC1);
   ADC_ExternalTrigConfig(ADC1, ADC_ExtEventSelection_Trigger2,
                        ADC_ExtTRGSensitivity_Falling);
}

程序是参照官方例程写的,中断里没有进行操作,只是程序里对读数Buffer数组里的数进行操作,上电运行刚开始正常,但过一些时间后出现读出来的Buffer[]与设置好的AD口不对应,如Buffer[0]可能是电位器2的读数,也可能电位器3等其他读数,请大神帮忙解决下

沙发
playerol|  楼主 | 2015-7-13 14:29 | 只看该作者
void EepromWrite(int RunTime,int Adress)    //写Eeprom
{
    int *p;
    p = (int *)Adress;
    do
    {
      FLASH->DUKR = 0xae;
      FLASH->DUKR = 0x56;
    }
   
    while((FLASH->IAPSR & 0x08) == 0);
    *p = RunTime;                     //写入时间
    while((FLASH->IAPSR & 0x04) == 0); //等待写操作成功
}
发现了这个问题不是ADC_DMA初始运行出错的问题,是写这个内部e2prom有冲突导致,只要这个一执行,DMA读ADC的数据顺序就出错,具体为何,如果处理作为菜鸟我不清楚

使用特权

评论回复
板凳
amanda_s| | 2015-7-14 17:25 | 只看该作者
这两部分程序有没有操作同一块内存?会不会是这里的问题。

使用特权

评论回复
地板
lyazk| | 2015-7-15 17:20 | 只看该作者
#define ADC1_DR_Address   0x5344        //ADC1 Peripheral address
#define DMA_BUF_SIZE 4

unsigned int  DMA_Bufer[DMA_BUF_SIZE] = {0};

/*ADC init*/
ADC_DeInit(ADC1);
ADC_Cmd(ADC1, ENABLE);          //enable adc1
ADC_DMACmd(ADC1, ENABLE);       //enable the DMA transfer
ADC_Init(ADC1,
         ADC_ConversionMode_Continuous,
         ADC_Resolution_12Bit,
         ADC_Prescaler_1);   //continous mode; 12bit data; clk= system clk
ADC_SamplingTimeConfig(ADC1, ADC_Group_SlowChannels, ADC_SamplingTime_384Cycles);        //sample time setting
ADC_ChannelCmd(ADC1, ADC_Channel_19, ENABLE);    //channel setting
ADC_ChannelCmd(ADC1, ADC_Channel_20, ENABLE);    //channel setting
ADC_ChannelCmd(ADC1, ADC_Channel_21, ENABLE);    //channel setting
ADC_ChannelCmd(ADC1, ADC_Channel_22, ENABLE);    //channel setting
SYSCFG_REMAPDMAChannelConfig(REMAP_DMA1Channel_ADC1ToChannel0);

/*DMA Init*/
DMA_Init(DMA1_Channel0,
         (uint32_t)DMA_Bufer,
         ADC1_DR_Address,
         DMA_BUF_SIZE,
         DMA_DIR_PeripheralToMemory,
         DMA_Mode_Circular,
         DMA_MemoryIncMode_Inc,
         DMA_Priority_High,
         DMA_MemoryDataSize_HalfWord);
DMA_SetCurrDataCounter(DMA1_Channel0,DMA_BUF_SIZE);
DMA_ITConfig(DMA1_Channel0, DMA_ITx_TC, ENABLE);
DMA_ITConfig(DMA1_Channel0, DMA_ITx_HT, DISABLE);
DMA_Cmd(DMA1_Channel0, ENABLE);

在DMA中断中我将一个标志位置1,然后再main的while(1)里面检测该标志位,为1时通过串口输出,也出现和楼主一样的问题,而且ADC_SamplingTime_384Cycles这个不同时,DMA读到的数据顺序也会出现不一样,不知道是哪儿的问题,希望斑竹能帮忙解释一下。

使用特权

评论回复
5
hwh123| | 2015-7-16 12:39 | 只看该作者
有移动?电平不稳定呀

使用特权

评论回复
6
playerol|  楼主 | 2015-7-16 16:30 | 只看该作者
amanda_s 发表于 2015-7-14 17:25
这两部分程序有没有操作同一块内存?会不会是这里的问题。

有,但EEPROM写前只是对AD读数的读取,理论上不影响

使用特权

评论回复
7
playerol|  楼主 | 2015-7-16 16:33 | 只看该作者
hwh123 发表于 2015-7-16 12:39
有移动?电平不稳定呀

听某大神说写内部eeprom时,会拉其他外设的电压,我用写完EEPROM后再对AD初始化回避这个问题了,但这样浪费资源

使用特权

评论回复
8
zhou20062008| | 2016-8-10 15:23 | 只看该作者
playerol 发表于 2015-7-16 16:33
听某大神说写内部eeprom时,会拉其他外设的电压,我用写完EEPROM后再对AD初始化回避这个问题了,但这样浪 ...

你好,我也遇到同样的问题,每次写完EERPOM后重新对ADC_DMA初始化解决问题, 想问一下你现在知道写EEPROM对DMA数据错位真正原因了吗? 谢谢分享

使用特权

评论回复
9
playerol|  楼主 | 2016-8-15 11:36 | 只看该作者
zhou20062008 发表于 2016-8-10 15:23
你好,我也遇到同样的问题,每次写完EERPOM后重新对ADC_DMA初始化解决问题, 想问一下你现在知道写EEPROM对D ...

一年半的了,我记得是回避了,就没再找时间去找问题源头

使用特权

评论回复
10
HipHop_ELE| | 2017-1-6 10:44 | 只看该作者
playerol 发表于 2015-7-16 16:33
听某大神说写内部eeprom时,会拉其他外设的电压,我用写完EEPROM后再对AD初始化回避这个问题了,但这样浪 ...

我也遇到同样的问题,怀疑是DMA在搬运数据到内存中和Eeprom写入数据时发生了冲突,DMA工作的时候不受MCU影响自己搬运数据,我写Eeprom的时候把DMA disable关掉 写完打开就没问题了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

28

帖子

0

粉丝