OpenEdv-开源电子网

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

stm32f4 ADC采样频率是多少?

[复制链接]

8

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2013-8-5
在线时间
4 小时
发表于 2013-8-5 18:09:06 | 显示全部楼层 |阅读模式

  对于F4ADC配置有几点疑问希望大家帮忙解答一下:

问题1:这个表的意思是否是说明F4在供电电压大于2.4V时其最大时钟是36MHZ?当其时钟在30MHZ时,外部触发采样频率最大为1764KHZ?

 如果上面这个问题是对的话,那么对于库函数的几项操作有点疑问:

这个说明给出了ADC转换时间的计算方式,那么对应的我配置如下:
//ADC时钟为APB2的4分频->84/4=21MHZ(F407ADC在2.4-3.6V供电电压下最大速率36M,稳定速度为30M)
        ADC_CommonInitStructure.ADC_Prescaler=ADC_Prescaler_Div4;
//配置ADC1规则组(得出其单次采样时间为->(3+12)/21≈0.7us)
ADC_RegularChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_3Cycles);
//两次采样的间隔时间为5个ADC时钟周期(5/21≈0.24us)
        ADC_CommonInitStructure.ADC_TwoSamplingDelay=ADC_TwoSamplingDelay_5Cycles;
问题2:按照如上数据理论值计算其最大采样频率:0.7+0.24≈1us->1MHZ,是否是这样计算的?
问题3:我想用ADC+DMA+TIM触发的方式来做一个简易的示波器,方法就是通过TIM的定时触发ADC采样,将采样值装入DMA缓存中,DMA装满后触发LCD刷新程序。
有一个概念我不是很清楚,比如我一屏采100个点,要能显示400HZ的正弦信号,是不是说我ADC采样速率至少要100*400=40KHZ的速率呢?
补充内容 (2017-5-12 17:49): 更正一个几年前的错误, ADC_CommonInitStructure.ADC_TwoSamplingDelay=ADC_TwoSamplingDelay_5Cycles; 此项配置仅仅用于双重或三重交错模式下才有效,也就是说之前的计算是错误的
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-8-5 21:11:32 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2013-8-5
在线时间
4 小时
 楼主| 发表于 2013-8-5 21:19:47 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
现在实现了示波器功能,只能说感觉ADC采样速率很快,而且带有自动校准,比较强大。现在还未验证其采样频率的准确性
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2013-8-5
在线时间
4 小时
 楼主| 发表于 2013-8-6 10:24:08 | 显示全部楼层

再仔细看手册,发现其转换时间和转换位数也有关系。最开始我那个计算是按12位计算的,位数越少,转换越快


回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2013-8-5
在线时间
4 小时
 楼主| 发表于 2013-8-8 10:26:59 | 显示全部楼层
现在通过定时器触发AD采样,放入DMA缓存中。采样间隔是0.5us,12位采样精度,也就是2M的频率了,效果还是挺稳定的。已经能够满足我的要求了,结贴了。
回复 支持 反对

使用道具 举报

46

主题

329

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1544
金钱
1544
注册时间
2012-4-9
在线时间
80 小时
发表于 2014-4-23 23:58:24 | 显示全部楼层
回复【5楼】KC_CEC:
---------------------------------
我也在用STM32F4 DISCOVERY 的ADC1,对比F1,发现寄存器还是有一些差别,尤其在对照原子的例程时,发现有些寄存器找不到,比如
1,AD复位和校准这一句,怎么也找不到相应的寄存器的相应位,尤其是无法校准的话,岂不是精度很差?
2,配置中断为软件触发中断,这个也没找到配置方法。
请教高人解答!
STM32
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2013-8-5
在线时间
4 小时
 楼主| 发表于 2014-4-25 11:09:35 | 显示全部楼层
回复【6楼】jj123paopao:
---------------------------------
1、在f1中校准过程如下:
启动校准->检测校准是否结束
整个过程中,除了软件使能校准外,外部不需要人为的操作。就是说整个过程是自动的,
既然是自动的,又需要人来软件使能不是多此一举了吗?所以f4取消了这个功能,应该
是在使能ADC的时候就内部自动校准了。(我看了手册,并没有说这部分,仅仅是我的猜测呵呵)
2、配置中断的时候并没有软件触发这个选项,配置中断是配置ADC进入中断的条件。
你要控制ADC是否开始,就直接设置是否进行转换就行了
回复 支持 反对

使用道具 举报

46

主题

329

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1544
金钱
1544
注册时间
2012-4-9
在线时间
80 小时
发表于 2014-5-7 15:16:52 | 显示全部楼层
回复【7楼】KC_CEC:
---------------------------------
谢谢,我发现程序会死在这句:while(ADC1->SR & 1<<1);
这句话作用是等待转换结束,注释掉之后就正常在串口中打印电压值了,用PA1采样板子上的3.3V电压,采样得到的最低电压是3.295166V,最高电压是3.299194V.
请问为什么程序会卡死在那句话?
STM32
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2013-8-5
在线时间
4 小时
 楼主| 发表于 2014-5-8 10:27:16 | 显示全部楼层
回复【8楼】jj123paopao:
---------------------------------
while(ADC1->SR & (1<<1));
当ADC1->SR & (1<<1)为真时,就会卡在while循环。
当ADC转换完成时,EOC为就会被置一,所以就会一直卡在这里,你逻辑搞反了。
应该是:while(!((ADC1->SR) & (1<<1)));

给几点建议:
1.除非你很熟悉运算符优先级,不然最好运算之间用括号分明清楚。
2.为避免硬件错误导致整个系统瘫痪所以得加上硬件超时:
uint32_t u32_out=1000000;

while((!((ADC1->SR) & (1<<1)))&&(u32_out--));
3.在资源够用的情况下,ADC最好和DMA联合使用给CPU最大空间干其它事情。
回复 支持 反对

使用道具 举报

17

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
161
金钱
161
注册时间
2014-4-16
在线时间
5 小时
发表于 2014-5-14 15:01:38 | 显示全部楼层
楼主你好!(ADC+DMA) 我使用的是单个ADC多通道采集。 在配置的时候,使用了DMA 发送过半中断


这是stm32f4xx_it.c
中断程序
void DMA2_Stream0_IRQHandler(void)
{
//??????·???DMA·?????°?????
   if(DMA_GetFlagStatus(DMA2_Stream0,DMA_FLAG_HTIF0)==SET) 
   {  
     int i;
 printf("ok");
for(i=0;i<256;i++)
{
data= (ADC_ConvertedValue >> 8) & 0xff;
}
printf("%f ",Rx_Buffer*16*3.3*2/4096);
  SPI_FLASH_PageWrite(data, MyWriteAddr, 256);
MyWriteAddr+=256;
// printf("ok");
DMA_ClearFlag(DMA2_Stream0,DMA_FLAG_HTIF0);
}else if(DMA_GetFlagStatus(DMA2_Stream0,DMA_FLAG_TCIF0)==SET) 
    {  
int i;
for(i=256;i<512;i++)
{
data= (ADC_ConvertedValue >> 8) & 0xff;
}
SPI_FLASH_PageWrite(data, MyWriteAddr, 256);
MyWriteAddr+=256;
// printf("yes");
DMA_ClearFlag(DMA2_Stream0,DMA_FLAG_TCIF0);  

if(MyWriteAddr>=0x3fffff)
{
DMA_ITConfig(DMA2_Stream0,DMA_IT_TC | DMA_IT_HT,DISABLE);
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
printf("\r\n -------ADC×????á????????????????------\r\n");
}
}
贴过来乱码出无关紧要!

这个是ADC配置 用了DMA中断!

#include "adc.h"

#define ADC1_DR_Address    ((uint32_t)0x4001224C)
__IO uint16_t ADC_ConvertedValue[CH_NUM]={0};
//__IO u16 ADC_ConvertedValueLocal;


/*
 * ????????ADC1_GPIO_Config
 * ?è??  ??????ADC1??DMA2???±??????????PC.01
 * ????: ??
 * ????  ????
 * ?÷??  ???????÷??
 */



/* ????????ADC1_Mode_Config
 * ?è??  ??????ADC1???¤×÷??????DMA????
 * ????: ??
 * ????  ????
 * ?÷??  ???????÷??
 */
 
 
 
 /* ????????ADC1_Config
 * ?è??  ??????ADC1???¤×÷??????DMA????
 * ????: ??
 * ????  ????
 * ?÷??  ???????÷??
 */
 static void ADC1_Config(void)
{

GPIO_InitTypeDef GPIO_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;


/* Enable DMA clock */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);

/* Enable GPIOC clock */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);

/* Enable ADC1 clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);


/* DMA channel0 configuration */
DMA_DeInit(DMA2_Stream0);
DMA_InitStructure.DMA_Channel = DMA_Channel_0;  
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;  //ADC???·
DMA_InitStructure.DMA_Memory0BaseAddr = (u32)&ADC_ConvertedValue;//???????·
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
DMA_InitStructure.DMA_BufferSize = CH_NUM;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_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_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_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA2_Stream0, &DMA_InitStructure);
//DMA_ITConfig(DMA2_Stream0,DMA_IT_TC,ENABLE);
DMA_Cmd(DMA2_Stream0, ENABLE);


/* Configure C.01  as analog input */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
GPIO_Init(GPIOC, &GPIO_InitStructure); // C0,PC1,PC2,?????±?????è??????



  /* ADC1 configuration */
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;//ADC?±??21MHz
  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
  ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
  ADC_CommonInit(&ADC_CommonInitStructure);


ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//????ADC????
ADC_InitStructure.ADC_ScanConvMode = ENABLE;   //?????¨?è???????¨?è?????????à?¨??????
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //????????×?????????????????????ADC×???
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//????????????·?×???
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Left;  //????????×ó????
ADC_InitStructure.ADC_NbrOfConversion = 4;   //??×??????¨??????4
ADC_Init(ADC1, &ADC_InitStructure);

 
/*????ADC1???¨??10,11,12??3?????ù???????ò????1,2,3,4 */ 
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_3Cycles);
ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_3Cycles);
ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 3, ADC_SampleTime_3Cycles);
ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 4, ADC_SampleTime_3Cycles);

//ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);
/* Enable ADC1 DMA */
ADC_DMACmd(ADC1, ENABLE);

/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);

/*??????×??????÷ */   
/*ADC_ResetCalibration(ADC1);*/
/*??????×??????÷?????ê?? */
/*while(ADC_GetResetCalibrationStatus(ADC1));*/

/* ADC??×? */
/*ADC_StartCalibration(ADC1);*/
/* ??????×??ê??*/
/*while(ADC_GetCalibrationStatus(ADC1));*/


}

void NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
  
/* Configure one bit for preemption priority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  
/* ????P[A|B|C|D|E]0???????? */
NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

}

/*
 * ????????ADC1_Init
 * ?è??  ????
 * ????  ????
 * ????  ????
 * ?÷??  ???????÷??
 */

 void ADC_start(void)
 {
 /* ??????????????????·????ù???????í????·?ADC×??? */ 
ADC_SoftwareStartConv(ADC1);
/* Enable ADC1 DMA */
ADC_DMACmd(ADC1, ENABLE);

/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);
/* Enable DMA channel0 */
DMA_Cmd(DMA2_Stream0, ENABLE);
DMA_ITConfig(DMA2_Stream0,DMA_IT_TC | DMA_IT_HT,ENABLE);
 }
void ADC1_Init(void)
{
ADC1_Config();
NVIC_Config();
}


求解为什么我的DMA中断进不去,还是我的ADC没有工作,本人做的是一个数据采集,其他led exti usart 均已调试成功!
跪求大神指点。
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2013-8-5
在线时间
4 小时
 楼主| 发表于 2014-5-15 10:33:44 | 显示全部楼层
回复【10楼】天使的诺言:
---------------------------------
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; 
可能是你没有使能DMA转换吧。

库函数里面可以读取很多标志位的,通过串口打印各个标志位就知道自己哪一步搞错了哦。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2015-1-30
在线时间
0 小时
发表于 2015-1-30 13:48:37 | 显示全部楼层
ADC_CommonInitStructure.ADC_TwoSamplingDelay=ADC_TwoSamplingDelay_5Cycles;
这里的采样延时只是在双重或者三重交叉下使用,不计算在采样频率中
回复 支持 反对

使用道具 举报

4

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2014-11-18
在线时间
0 小时
发表于 2015-1-30 14:16:04 | 显示全部楼层
你好,我也想做一个简易示波器,双ADC+DMA我已经调通不过用的是F1
我想问一下楼主是怎么把数据在LCD上还原成正弦曲线的。。。
我是伸手党 ←_←
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2013-8-5
在线时间
4 小时
 楼主| 发表于 2015-1-31 15:04:20 | 显示全部楼层
回复【13楼】球球~电子:
---------------------------------
1、根据你DMA缓存中的数据可以换算出电压
2、根据你LCD上所想表示的分辨率就可以算出一个像素代表的电压是多少了
回复 支持 反对

使用道具 举报

85

主题

169

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
413
金钱
413
注册时间
2015-2-1
在线时间
1 小时
发表于 2015-5-20 10:13:40 | 显示全部楼层
请问楼主,/ADC时钟为APB2的4分频->84/4=21MHZ(F407ADC在2.4-3.6V供电电压下最大速率36M,稳定速度为30M)
        ADC_CommonInitStructure.ADC_Prescaler=ADC_Prescaler_Div4;
//配置ADC1规则组(得出其单次采样时间为->(3+12)/21≈0.7us)
ADC_RegularChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_3Cycles);
//两次采样的间隔时间为5个ADC时钟周期(5/21≈0.24us)
        ADC_CommonInitStructure.ADC_TwoSamplingDelay=ADC_TwoSamplingDelay_5Cycles;
最大采样频率:0.7+0.24≈1us
和定时器设定的频率到底什么关系,如果ad用定时器设定了采样频率 ,那上面的1us是什么
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2013-8-5
在线时间
4 小时
 楼主| 发表于 2015-5-20 19:17:48 | 显示全部楼层
回复【15楼】liyunjiajia:
---------------------------------
设定了由定时器触发ADC的话,定时器频率就是ADC的采样间隔时间了。
当然采样频率就不会按照1us那样算了,但是单次的采样时间还是一样的
回复 支持 反对

使用道具 举报

85

主题

169

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
413
金钱
413
注册时间
2015-2-1
在线时间
1 小时
发表于 2015-5-21 09:37:59 | 显示全部楼层
谢谢你,还有个问题,我用定时器中断进行ad转换, ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; 模数转换工作在连续转换模式
为什么工作在连续模式?应该是单次采样,中断触发啊?
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2013-8-5
在线时间
4 小时
 楼主| 发表于 2015-5-21 11:16:26 | 显示全部楼层
回复【17楼】liyunjiajia:
---------------------------------
你这样做有点非主流,用中断触发ADC,效率会很低下。
并且不能精确控制ADC的采样率了。
应该是:
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_TRGO;
通过定时器时基来触发ADC,与DMA联立。
这样ADC会根据你设置的定时器溢出频率自动循环采样,并且将采样的结果放入DMA缓存,
你只需要判断DMA缓存装满以后将缓存读出来即可。
回复 支持 反对

使用道具 举报

85

主题

169

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
413
金钱
413
注册时间
2015-2-1
在线时间
1 小时
发表于 2015-5-21 11:31:24 | 显示全部楼层
太谢谢你了,你有没有定时器触发ad转换的整个程序啊?我是初学者,有点蒙
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2013-8-5
在线时间
4 小时
 楼主| 发表于 2015-5-21 12:27:15 | 显示全部楼层
以stm32f4的ADC1为例,用TIM2做触发,模拟一个简单的示波器:
[mw_shl_code=c,true]#define ADC1_DR_Address ((uint32_t)ADC1_BASE+0x4c) __IO uint16_t ADC1OscConver[1000]; /* 功能:配置adc1IO口 */ static void Adc1IoConfig(void) { /* IO口配置 */ GPIO_InitTypeDef GPIO_InitStructure; //开C口时钟, RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); //复位配置 GPIO_StructInit(&GPIO_InitStructure); //设置为模拟输入模式 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AN; //不带上拉 GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL; //将以上设置应用于寄存器 GPIO_Init(GPIOC,&GPIO_InitStructure); } /* 功能:tim2触发器初始化 */ static void Tim2Config(void) { /* tim配置 */ TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; //打开TIM时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //初始化配置结构,不受其它配置干扰 TIM_TimeBaseStructInit(&TIM_TimeBaseInitStructure); //对APB1时钟不分频,由system_stm32f4xx.c可知 //APB1=AHB/4=SYSCLK/4=168M/4=42M,则TIM3=APB1*2=84M TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; //分频值=168M/(Prescaler+1)/2=0.5us TIM_TimeBaseInitStructure.TIM_Prescaler=42-1; //溢出时间确定 TIM_TimeBaseInitStructure.TIM_Period=44; //向上计数方式 TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //将以上配置应用于定时器 TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure); //数据更新作为触发源 TIM_SelectOutputTrigger(TIM2,TIM_TRGOSource_Update); } /* 功能:ADC1的示波器功能配置 备注:使用tim2做触发 */ void Adc1OscConfig(void) { /* dma配置 */ DMA_InitTypeDef DMA_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; //开启MDA2时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE); //初始化各寄存器配置 DMA_DeInit(DMA2_Stream0); DMA_StructInit( &DMA_InitStructure); //选取DMA通道0,数据流0 DMA_InitStructure.DMA_Channel=DMA_Channel_0; //数据传入地址->ADC基地址加上DR寄存器偏移地址 DMA_InitStructure.DMA_PeripheralBaseAddr=(uint32_t)ADC1_DR_Address; //数据送入地址 DMA_InitStructure.DMA_Memory0BaseAddr=(uint32_t)ADC1OscConver; //数据传送方向为外设到SRAM DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralToMemory; //数据缓冲区1 DMA_InitStructure.DMA_BufferSize=1000; //外设地址固定 DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable; //内存地址自增 DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable; //数据类型为半字 DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;//DMA_PeripheralDataSize_Byte;//DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;//DMA_MemoryDataSize_Byte;//DMA_MemoryDataSize_HalfWord; //循环传输 DMA_InitStructure.DMA_Mode=DMA_Mode_Circular; //高优先级 DMA_InitStructure.DMA_Priority=DMA_Priority_Low; //不使用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_DoubleBufferModeCmd(DMA2_Stream0, DISABLE); //将以上设置应用于DMA2,通道0,数据流0 DMA_Init(DMA2_Stream0,&DMA_InitStructure); //使能DMA DMA_Cmd(DMA2_Stream0, ENABLE); //选择DMA2通道数据流0 NVIC_InitStructure.NVIC_IRQChannel=DMA2_Stream0_IRQn;//DMA2_Stream0_IRQHandler; //抢占式优先级为0 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1; //响应式优先级为12 NVIC_InitStructure.NVIC_IRQChannelSubPriority=4; //通道使能 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //将以上配置应用于NVIC NVIC_Init(&NVIC_InitStructure); //使能DMA传输完成中断 DMA_ITConfig(DMA2_Stream0,DMA_IT_TC,ENABLE); /* 功能:ADC配置 */ ADC_InitTypeDef ADC_InitStructure; //开启ADC1时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //12位转换精度 ADC_InitStructure.ADC_Resolution=ADC_Resolution_12b;//ADC_Resolution_8b;//ADC_Resolution_12b; //使用单通道转换模式 ADC_InitStructure.ADC_ScanConvMode=DISABLE; //不使用多次转换模式 ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;//ENABLE;//DISABLE; //使用外部上升沿触发模式 ADC_InitStructure.ADC_ExternalTrigConvEdge=ADC_ExternalTrigConvEdge_Rising;//ADC_ExternalTrigConvEdge_Rising;//ADC_ExternalTrigConvEdge_None; //TIM3溢出触发 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_TRGO;//ADC_ExternalTrigConv_T1_CC1; //选择右对齐方式 ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right; //选用转换通道数为1个 ADC_InitStructure.ADC_NbrOfConversion=1; //将以上设置应用于对应寄存器 ADC_Init(ADC1,&ADC_InitStructure); //使能ADC在DMA模式下的连续转换 ADC_DMARequestAfterLastTransferCmd(ADC1,ENABLE); //使能ADC的DMA模式 ADC_DMACmd(ADC1,ENABLE); //配置ADC1规则组(得出其单次采样时间为3+12)/21≈0.7us)->12bit ADC_RegularChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_3Cycles);//ADC_SampleTime_3Cycles/ADC_SampleTime_480Cycles //使能ADC ADC_Cmd(ADC1,ENABLE); } /* 功能:各ADC共同功能配置 */ static void AdcSenCommConfig(void) { ADC_CommonInitTypeDef ADC_CommonInitStructure; //ADC为独立模式 ADC_CommonInitStructure.ADC_Mode=ADC_Mode_Independent; //ADC时钟为APB2的2分频->84/4=21MHZ(F407ADC在2.4-3.6V供电电压下最大速率36M,稳定速度为30M) ADC_CommonInitStructure.ADC_Prescaler=ADC_Prescaler_Div8; //使用ADC的DMA复用 ADC_CommonInitStructure.ADC_DMAAccessMode=ADC_DMAAccessMode_2; //两次采样的间隔时间为5个ADC时钟周期(5/21≈0.24us) ADC_CommonInitStructure.ADC_TwoSamplingDelay=ADC_TwoSamplingDelay_5Cycles; //将以上设置应用于对应的寄存器 ADC_CommonInit(&ADC_CommonInitStructure); } /* 功能:开始ADC1示波器采样 */ void StartAdc1OscSam(void) { TIM_Cmd(TIM2, ENABLE); } /* 功能:停止ADC1示波器采样 */ void StopAdc1OscSam(void) { TIM_Cmd(TIM2, DISABLE); }[/mw_shl_code]


如果要切换采样时间,可以:
[mw_shl_code=c,true]#define OSC_TIME(val) TIM_SetCounter(TIM2,0);TIM_SetAutoreload(TIM2,val)[/mw_shl_code]

回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2013-8-5
在线时间
4 小时
 楼主| 发表于 2015-5-21 12:29:37 | 显示全部楼层
回复【19楼】liyunjiajia:
---------------------------------
上面的代码中,DMA是单缓冲模式。
可以配置为双缓冲模式,这样就可以不用停止DMA来实现无间歇循环采样。
回复 支持 反对

使用道具 举报

85

主题

169

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
413
金钱
413
注册时间
2015-2-1
在线时间
1 小时
发表于 2015-5-21 19:43:32 | 显示全部楼层
太 谢谢你了
回复 支持 反对

使用道具 举报

85

主题

169

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
413
金钱
413
注册时间
2015-2-1
在线时间
1 小时
发表于 2015-5-21 20:23:56 | 显示全部楼层
请问如何 为双缓冲模式,这样就可以不用停止DMA来实现无间歇循环采样。
为什么要开中断,来使能DMA传输完成?开中断有什么意义?
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2013-8-5
在线时间
4 小时
 楼主| 发表于 2015-5-22 09:48:30 | 显示全部楼层
回复【23楼】liyunjiajia:
---------------------------------
1、所谓的双缓冲,指的是DMA有两个目的缓存,比如A和B。
A/B各有1000个uint16_t型大小,DMA会在A装满后,自动切换到B缓存。
循环的交替下去,这样就可以在A装满后处理A缓存,而不需要先停止DMA了。
(为了保护数据)


2、当DMA传输完成后,就会中断提醒CPU来进行缓存即使处理。
当然也可以不开中断,用循环扫描的方式。你得根据你的实际应用而定
回复 支持 反对

使用道具 举报

85

主题

169

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
413
金钱
413
注册时间
2015-2-1
在线时间
1 小时
发表于 2015-5-23 21:33:03 | 显示全部楼层
你好,我做了一个ad,da转换的程序,给一个电压,串口调试助手里面显示不出来,您能不能帮我看下程序呢?

语音程序.zip

9.22 MB, 下载次数: 595

回复 支持 反对

使用道具 举报

18

主题

70

帖子

0

精华

高级会员

Rank: 4

积分
593
金钱
593
注册时间
2015-4-14
在线时间
47 小时
发表于 2015-7-2 15:18:30 | 显示全部楼层
回复【24楼】KC_CEC:
---------------------------------
楼主你好,我看了下您的帖子,非常厉害,我想请教一下,我想采集四个通道的ADC,采用速率要求是500KHz,采集的是四个通道的波形,要采集时间长一点,但是DMA所能传的的数据仅仅是65535个,传完了就会有要重新开始循环存储空间了,我现在想想你说的那个双缓存比较好,不知道怎么写程序你能帮我吗?
回复 支持 反对

使用道具 举报

7

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2015-2-2
在线时间
5 小时
发表于 2015-7-28 12:07:09 | 显示全部楼层
楼主你好,我最近也在用stm32做一个示波器。但是显示效果并不理想,有一些频率的正弦波可以显示,可是另一些却无法显示。我想问一下是不是跟采样间隔有关系,应该如何调整。
回复 支持 反对

使用道具 举报

26

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2015-7-24
在线时间
0 小时
发表于 2015-8-1 09:10:26 | 显示全部楼层
楼主,可不可以把你的示波器工程分享出来一下,我想深入参考学习,谢谢!
M4小白菜,求各位大牛多多指导
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2014-7-11
在线时间
0 小时
发表于 2015-8-12 16:19:03 | 显示全部楼层
回复【16楼】KC_CEC:
---------------------------------
问下你这里的ADC采样时间间隔指的是ADC_CommonInitStructure.ADC_TwoSamplingDelay=ADC_TwoSamplingDelay_5Cycles这个时间吗?
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2013-8-5
在线时间
4 小时
 楼主| 发表于 2015-8-20 12:20:04 | 显示全部楼层
回复【29楼】静秋:
---------------------------------
这个值在多重ADC模式下才有意义,比如ADC1和ADC2交替采样模式的交替间隔
回复 支持 反对

使用道具 举报

2

主题

21

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2015-3-31
在线时间
40 小时
发表于 2015-8-24 18:10:28 | 显示全部楼层
回复【13楼】球球~电子:
---------------------------------
借楼问个问题
我现在stm32f103双ADC连续采集8个通道,DMA中断,在定时器中使能,可以正常使用
但是我现在想改成循环采集5次,可是怎么修改程序都不能运行,有谁使用过双ADC连续循环采集功能没?可能会是哪里的问题呢?
余生请你指教!
回复 支持 反对

使用道具 举报

17

主题

98

帖子

0

精华

高级会员

Rank: 4

积分
658
金钱
658
注册时间
2015-12-22
在线时间
128 小时
发表于 2016-3-6 09:31:13 | 显示全部楼层
本帖最后由 elvin 于 2016-3-7 16:37 编辑
KC_CEC 发表于 2015-8-20 12:20
回复【29楼】静秋:
---------------------------------
这个值在多重ADC模式下才有意义,比如ADC1和ADC2交 ...

/** @defgroup ADC_delay_between_2_sampling_phases
  * @{
  */
#define ADC_TwoSamplingDelay_5Cycles               ((uint32_t)0x00000000)

  uint32_t ADC_TwoSamplingDelay;          /*!< Configures the Delay between 2 sampling phases.
                                               This parameter can be a value of
                                               @ref ADC_delay_between_2_sampling_phases */



定义在两个采样保持阶段中间的ADC的延迟
怎么理解成在多ADC模式下才有意义呢,这地方不太理解啊   @正点原子   原子哥求助@正点原子
回复 支持 反对

使用道具 举报

17

主题

98

帖子

0

精华

高级会员

Rank: 4

积分
658
金钱
658
注册时间
2015-12-22
在线时间
128 小时
发表于 2016-3-9 10:23:24 | 显示全部楼层
elvin 发表于 2016-3-6 09:31
/** @defgroup ADC_delay_between_2_sampling_phases
  * @{
  */

我搞明白了,这个延迟确实是在多重adc模式下的延迟。

1 他是在ADC通用配置里配置的

2从固件库提供的示例里,计算最高转换速率里能倒推出来。@正点原子
回复 支持 反对

使用道具 举报

5

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2015-7-21
在线时间
27 小时
发表于 2016-4-11 15:38:23 | 显示全部楼层
KC_CEC 发表于 2013-8-5 21:19
回复【2楼】正点原子:
---------------------------------
现在实现了示波器功能,只能说感觉ADC采样速率很 ...

请问楼主还在吗。。。我现在想采集AD的电压信号 用DMA传送 然后显示波形,能指点下不呢
回复 支持 反对

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2016-4-24
在线时间
7 小时
发表于 2016-4-27 23:23:31 | 显示全部楼层
楼主求分享工程
回复 支持 反对

使用道具 举报

10

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2016-7-12
在线时间
17 小时
发表于 2016-7-31 14:09:32 | 显示全部楼层
KC_CEC 发表于 2013-8-8 10:26
现在通过定时器触发AD采样,放入DMA缓存中。采样间隔是0.5us,12位采样精度,也就是2M的频率了,效果还是挺 ...

你好,感觉你对这块了解得应该挺深的,有几个疑问想咨询一下你?
//ADC时钟为APB2的4分频->84/4=21MHZ(F407ADC在2.4-3.6V供电电压下最大速率36M,稳定速度为30M)
        ADC_CommonInitStructure.ADC_Prescaler=ADC_Prescaler_Div4;
//配置ADC1规则组(得出其单次采样时间为->(3+12)/21≈0.7us)
ADC_RegularChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_3Cycles);
//两次采样的间隔时间为5个ADC时钟周期(5/21≈0.24us)
        ADC_CommonInitStructure.ADC_TwoSamplingDelay=ADC_TwoSamplingDelay_5Cycles;
你那问题1,装换一次需要的时间为7us,你定时器定的时间0.5us转换完了吗,不会出错?
12bit的ADC转换时间至少就需要15个周期,你能解释一下吗?
回复 支持 反对

使用道具 举报

10

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2016-7-12
在线时间
17 小时
发表于 2016-7-31 14:10:46 | 显示全部楼层
KC_CEC 发表于 2013-8-8 10:26
现在通过定时器触发AD采样,放入DMA缓存中。采样间隔是0.5us,12位采样精度,也就是2M的频率了,效果还是挺 ...

还有就是双重ADC或者三重ADC交替转换,这个采样率又该怎么算?
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2016-7-31
在线时间
4 小时
发表于 2016-7-31 15:11:29 | 显示全部楼层
请教大神一个问题:如何在STM32F4中使用中断来写ADC函数,我写的程序不知道哪里有问题 求指教
#include "adc.h"
#include "delay.h"
#include "led.h"

u32 ADCvalue = 0;

void ADCInitial(void)
{
        ADC_InitTypeDef                                        ADC_InitStructure;
        GPIO_InitTypeDef                                GPIO_InitStructure;
        ADC_CommonInitTypeDef                ADC_CommonInitStructure;
        NVIC_InitTypeDef                                NVIC_InitStructure;
       
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
       
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
        //GPIO_InitStructure.GPIO_OType =
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
       
        ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_ExternalTrigConv =
        ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
        ADC_InitStructure.ADC_NbrOfConversion = 1;
        ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
        ADC_InitStructure.ADC_ScanConvMode = DISABLE;       
        ADC_Init(ADC1,&ADC_InitStructure);
       
        ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
        ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
        ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;
        ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;//3¢ê&#212;&#187;&#187;2&#187;í&#172;μ&#196;Cycle
        ADC_CommonInit(&ADC_CommonInitStructure);
        ADC_Cmd(ADC1,ENABLE);
        ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE);
       
        ADC_RegularChannelConfig(ADC1,ADC_Channel_5,1,ADC_SampleTime_480Cycles);//3¢ê&#212;&#187;&#187;2&#187;í&#172;μ&#196;Cycle
        ADC_SoftwareStartConv(ADC1);
       
        NVIC_InitStructure.NVIC_IRQChannel = ADC_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
        NVIC_Init(&NVIC_InitStructure);
}

void ADC_IRQHandler(void)
{
        u32 tempValue = 0;
        if(ADC_GetITStatus(ADC1,ADC_IT_EOC) == SET)
        {
                tempValue =  ADC_GetConversionValue(ADC1);
                delay_ms(5);
        }
        ADCvalue = tempValue;
        delay_ms(200);
        ADC_ClearITPendingBit(ADC1,ADC_IT_EOC);
}
回复 支持 反对

使用道具 举报

37

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
836
金钱
836
注册时间
2016-12-22
在线时间
165 小时
发表于 2017-5-6 19:15:07 | 显示全部楼层
楼主可不可以把你的代码贴出来,学习学习,我是个新手
回复 支持 反对

使用道具 举报

6

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2015-6-13
在线时间
19 小时
发表于 2017-5-11 17:18:56 | 显示全部楼层
楼主,你说的是2M的采样频率即0.5us采样一次,但是上面写的采样时间就需要0.7us,你是怎么处理这个问题的呢? 你做的示波器显示效果怎么样?200KHz的正弦波能够比较精确的还原出来么?
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2013-8-5
在线时间
4 小时
 楼主| 发表于 2017-5-12 18:06:43 | 显示全部楼层
隨颩洏過 发表于 2017-5-11 17:18
楼主,你说的是2M的采样频率即0.5us采样一次,但是上面写的采样时间就需要0.7us,你是怎么处理这个问题的呢?  ...

对不起,以前的工程记不起来了。
按照理论来说,这样应该会出问题的,数据都还不稳定。

我记得好像是我后来改成了2分频了,现在源码不见了,没法验证了。。。
回复 支持 反对

使用道具 举报

8

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2017-6-1
在线时间
18 小时
发表于 2017-6-9 15:30:59 | 显示全部楼层
KC_CEC 发表于 2013-8-8 10:26
现在通过定时器触发AD采样,放入DMA缓存中。采样间隔是0.5us,12位采样精度,也就是2M的频率了,效果还是挺 ...

楼主,您好。请问.F407的ADC在保证精度不太差的情况下,采样频率能到多大?我采200k正弦信号,设置好采样时间后(28个周期),发现结果误差很大,能帮帮回答一下吗?
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2016-10-14
在线时间
26 小时
发表于 2017-7-19 10:58:29 | 显示全部楼层
楼主大牛,我目前在做,声波测温,想用ADC+DMA检测两个脉冲的时间间隔?楼主有什么建议吗?不会发图
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2016-10-14
在线时间
26 小时
发表于 2017-7-19 11:12:43 | 显示全部楼层
该如何计算?我也遇到相同的程序了
回复 支持 反对

使用道具 举报

10

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2017-4-25
在线时间
28 小时
发表于 2017-8-21 10:49:35 | 显示全部楼层
KC_CEC 发表于 2015-5-21 11:16
回复【17楼】liyunjiajia:
---------------------------------
你这样做有点非主流,用中断触发ADC,效率会 ...

楼主    请问这个判断DMA缓存装满该怎么判断呢??  我最近在做ADC+DMA+以太网的    发现上位机接收到的数据有断点,而且采样率和我设置的采样率相差有点大,不知道是不是DMA和网口速率问题。不过,我把DMA搬运的数据是直接通过网口传给上位机的,好像没有进行判断DMA缓存是否装满。。请问你知不知道这是啥问题?
QQ截图20170820163654.png
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2017-4-14
在线时间
2 小时
发表于 2017-9-9 15:47:29 | 显示全部楼层
源码可否借鉴一下哎?
回复 支持 反对

使用道具 举报

16

主题

339

帖子

0

精华

高级会员

Rank: 4

积分
849
金钱
849
注册时间
2017-6-18
在线时间
166 小时
发表于 2017-9-9 18:48:38 来自手机 | 显示全部楼层
Anna 发表于 2017-8-21 10:49
楼主    请问这个判断DMA缓存装满该怎么判断呢??  我最近在做ADC+DMA+以太网的    发现上位机接收到的 ...

DMA的功能,当然DMA一页,DMA半传输,传输都是能检测的,ADC当然没有说DMA是否装满这一功能
回复 支持 反对

使用道具 举报

20

主题

93

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
420
金钱
420
注册时间
2010-12-16
在线时间
20 小时
发表于 2017-12-21 16:31:42 | 显示全部楼层
Anna 发表于 2017-8-21 10:49
楼主    请问这个判断DMA缓存装满该怎么判断呢??  我最近在做ADC+DMA+以太网的    发现上位机接收到的 ...

开 双缓存 去中断 读数据
我就是我,等待爆发那一刻......
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-19 14:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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