专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
STM32
请问如何方便可靠的暂停ADC+DMA 的连续扫描模式?
2019-12-10 18:08
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
STM32/STM8
7983
9
10
扫描CH0 CH1 CH2 CH3 4个通道,用ADC+DMA 连续扫描循环。 设置总的搬运buf大小为4*128 ,即每个通道都采集到了128个值。 也开启了DMA传送完成中断,想在中断中暂停传送等数据处理完毕后再次传送。
有没有什么好的方法当传输完进入中断后可以暂停传输?想到的笨办法是关闭ADC,关闭DMA,处理完后再次初始化打开。
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
Earthman
1楼-- · 2019-12-10 20:54
仔细阅读手册。
如果允许ADC继续采样,可以关闭ADC的DMA传送使能位。
如果不允许继续采样,暂停ADC,关闭ADC后再次启用一般要校正的吧
加载中...
XA144F
2楼-- · 2019-12-10 22:21
精彩回答 2 元偷偷看……
加载中...
gaolf_2012
3楼-- · 2019-12-11 02:20
buffer开大一倍,dma用半中断
加载中...
fnems
4楼-- · 2019-12-11 03:46
XA144F 发表于 2019-10-20 09:01
产生中断后把adc软件触发关掉即可,如果是定时器驱动的就关掉定时器。
正确做法
加载中...
icoyool
5楼-- · 2019-12-11 08:01
说出来你可能不信, 直接开着不用动就行, 甚至中断都不要用, 定时去处理Buffer就可以; 因为dma操作是原子操作, 无论你什么时候去读缓存都是最新的缓存,
加载中...
icoyool
6楼-- · 2019-12-11 09:16
#define ADC1_BUFF_SIZE (USER_ADC_ADC1_CH_NUM*AI_MAX_COLLECT)
#define ADC2_BUFF_SIZE (USER_ADC_ADC2_CH_NUM*AI_MAX_COLLECT)
uint16 ADC1_DATA_BUFF[AI_MAX_COLLECT][USER_ADC_ADC1_CH_NUM];
uint16 ADC2_DATA_BUFF[USER_ADC_ADC2_CH_NUM][AI_MAX_COLLECT];
void ADC_Initial(void) {
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2, ENABLE);
ADC_DeInit(ADC1);
ADC_DeInit(ADC2);
ADC_StructInit(&ADC_InitStructure);
ADC_InitStructure.ADC_PRESCARE = ADC_PCLK2_PRESCARE_8; //96M/8=12M
//ADC_InitStructure.ADC_Mode = ADC_Mode_Single_Period;
//ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_Mode = ADC_Mode_Continuous_Scan;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_CC2; //ADC1
ADC_Init(ADC1, &ADC_InitStructure);
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_EXTI_15; //ADC1
ADC_Init(ADC2, &ADC_InitStructure);
/*屏蔽所有通道*/
/*使能选中通道,后面参数保留*/
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 0, ADC_SampleTime_239_5Cycles);
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239_5Cycles);
ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 2, ADC_SampleTime_239_5Cycles);
ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 3, ADC_SampleTime_239_5Cycles);
ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 4, ADC_SampleTime_239_5Cycles);
ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 5, ADC_SampleTime_239_5Cycles);
ADC_RegularChannelConfig(ADC2, ADC_Channel_2, 6, ADC_SampleTime_239_5Cycles);
ADC_RegularChannelConfig(ADC2, ADC_Channel_3, 6, ADC_SampleTime_239_5Cycles);
ADC_RegularChannelConfig(ADC2, ADC_Channel_4, 6, ADC_SampleTime_239_5Cycles);
ADC_RegularChannelConfig(ADC2, ADC_Channel_5, 6, ADC_SampleTime_239_5Cycles);
// ADC_ExternalTrigConvCmd(ADC1, ENABLE);
ADC_ExternalTrigConvCmd(ADC1, DISABLE);
ADC_ExternalTrigConvCmd(ADC2, DISABLE);
ADC_DMACmd(ADC1, ENABLE); //开DMA
ADC_DMACmd(ADC2, ENABLE); //开DMA
ADC_Cmd(ADC1, ENABLE);
ADC_Cmd(ADC2, ENABLE);
}
加载中...
1
2
下一页
一周热门
更多
>
相关问题
STM32F4上I2C(在PROTEUS中模拟)调试不通的问题
6 个回答
芯片供应紧张,准备换个MCU,MM32L系列替换STM32L系列的怎么样?
7 个回答
STM32同时使用两个串口进行数据收发时数据丢包的问题
5 个回答
STM32F103串口通信死机问题
4 个回答
STM32WLE5CC连接SX1268在LoRa模式下能与 SX1278互通吗?
2 个回答
STM32开发板免费用活动
7 个回答
stm32 处理 DHT11占用太多时间,大家程序是怎么设计的
8 个回答
分享一个STM32单片机做的离线编程器代码
9 个回答
相关文章
ST公司第一款无线低功耗单片机模块有效提高物联网设计生产效率
0个评论
如何实现对单片机寄存器的访问
0个评论
通过USB用STM32片内自带Bootloader下载程序及注意事项
0个评论
欲练此功必先自宫之STM32汇编启动,放慢是为了更好的前行
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
STM32
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
如果允许ADC继续采样,可以关闭ADC的DMA传送使能位。
如果不允许继续采样,暂停ADC,关闭ADC后再次启用一般要校正的吧
正确做法
#define ADC1_BUFF_SIZE (USER_ADC_ADC1_CH_NUM*AI_MAX_COLLECT)
#define ADC2_BUFF_SIZE (USER_ADC_ADC2_CH_NUM*AI_MAX_COLLECT)
uint16 ADC1_DATA_BUFF[AI_MAX_COLLECT][USER_ADC_ADC1_CH_NUM];
uint16 ADC2_DATA_BUFF[USER_ADC_ADC2_CH_NUM][AI_MAX_COLLECT];
void ADC_Initial(void) {
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2, ENABLE);
ADC_DeInit(ADC1);
ADC_DeInit(ADC2);
ADC_StructInit(&ADC_InitStructure);
ADC_InitStructure.ADC_PRESCARE = ADC_PCLK2_PRESCARE_8; //96M/8=12M
//ADC_InitStructure.ADC_Mode = ADC_Mode_Single_Period;
//ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_Mode = ADC_Mode_Continuous_Scan;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_CC2; //ADC1
ADC_Init(ADC1, &ADC_InitStructure);
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_EXTI_15; //ADC1
ADC_Init(ADC2, &ADC_InitStructure);
/*屏蔽所有通道*/
/*使能选中通道,后面参数保留*/
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 0, ADC_SampleTime_239_5Cycles);
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239_5Cycles);
ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 2, ADC_SampleTime_239_5Cycles);
ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 3, ADC_SampleTime_239_5Cycles);
ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 4, ADC_SampleTime_239_5Cycles);
ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 5, ADC_SampleTime_239_5Cycles);
ADC_RegularChannelConfig(ADC2, ADC_Channel_2, 6, ADC_SampleTime_239_5Cycles);
ADC_RegularChannelConfig(ADC2, ADC_Channel_3, 6, ADC_SampleTime_239_5Cycles);
ADC_RegularChannelConfig(ADC2, ADC_Channel_4, 6, ADC_SampleTime_239_5Cycles);
ADC_RegularChannelConfig(ADC2, ADC_Channel_5, 6, ADC_SampleTime_239_5Cycles);
// ADC_ExternalTrigConvCmd(ADC1, ENABLE);
ADC_ExternalTrigConvCmd(ADC1, DISABLE);
ADC_ExternalTrigConvCmd(ADC2, DISABLE);
ADC_DMACmd(ADC1, ENABLE); //开DMA
ADC_DMACmd(ADC2, ENABLE); //开DMA
ADC_Cmd(ADC1, ENABLE);
ADC_Cmd(ADC2, ENABLE);
}
一周热门 更多>