OpenEdv-开源电子网

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

光敏 ADC DMA传输 溢出问题

[复制链接]

2

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2019-10-7
在线时间
26 小时
发表于 2020-5-5 01:22:27 | 显示全部楼层 |阅读模式
探索者,试着用DMA方式传输,ADC 采集,启动后LCD只显示一个定值,不会变化,查看了一下寄存器, ADC SR寄存器是0x00000030,  OVR 溢出了,
发现是   初始化 运行完最后一步 软件触发  ADC_SoftwareStartConv();   
SR寄存器就变成了 0x00000032,  ADC初始化完就直接溢出了.  请问是什么原因?
初始化程序:
DMA_InitTypeDef DMA_InitStructure;
        ADC_InitTypeDef ADC_InitStructure;
  ADC_CommonInitTypeDef ADC_CommonInitStructure;
       
  // 开启ADC时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3 , ENABLE);
  // 开启DMA时钟
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
        // 外设基址为:ADC 数据寄存器地址
        DMA_InitStructure.DMA_PeripheralBaseAddr = ADC_DR_ADDR;       
  // 存储器地址,实际上就是一个内部SRAM的变量       
        DMA_InitStructure.DMA_Memory0BaseAddr = (u32)&ADC_ConvertedValue;  
       
  // 数据传输方向为外设到存储器       
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;       
        DMA_InitStructure.DMA_BufferSize = 1;       
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
  // // 外设数据大小为半字
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  //        存储器数据大小也为半字
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;       
        // 循环传输模式
        DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  // DMA 传输通道优先级为高
        DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  // 禁止DMA FIFO
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;  
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;  
        // 选择 DMA 通道
  DMA_InitStructure.DMA_Channel = DMA_Channel_2;
  //初始化DMA流,流相当于一个大的管道,管道里面有很多通道
        DMA_Init(DMA2_Stream0, &DMA_InitStructure);
        // 使能DMA流
  DMA_Cmd(DMA2_Stream0, ENABLE);

        // 独立ADC模式
  ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
  // 时钟为fpclk x分频       
  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;
  // 禁止DMA直接访问模式       
  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
  // 采样时间间隔       
  ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;  
  ADC_CommonInit(&ADC_CommonInitStructure);
       

        ADC_StructInit(&ADC_InitStructure);
  // ADC 分辨率
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  // 禁止扫描模式,多通道采集才需要       
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  // 连续转换       
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  //禁止外部边沿触发
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  //外部触发通道,本例子使用软件触发,此值随便赋值即可
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
  //数据右对齐       
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  //转换通道 1个
  ADC_InitStructure.ADC_NbrOfConversion = 1;                                    
  ADC_Init(ADC3, &ADC_InitStructure);

       
  // 配置 ADC 通道转换顺序为1,第一个转换,采样时间为3个时钟周期
  ADC_RegularChannelConfig(ADC3, ADC_Channel_5, 1, ADC_SampleTime_3Cycles);
  // 使能DMA请求 after last transfer (Single-ADC mode)
  ADC_DMARequestAfterLastTransferCmd(ADC3, ENABLE);
  // 使能ADC DMA
  ADC_DMACmd(ADC3, ENABLE);
  // 使能ADC
  ADC_Cmd(ADC3, ENABLE);  
  //开始adc转换,软件触发
  ADC_SoftwareStartConv(ADC3);

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

使用道具 举报

0

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2015-12-27
在线时间
0 小时
发表于 2020-5-6 15:11:39 | 显示全部楼层
帮顶,懂的坛友可以帮忙解答一下
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 12:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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