双极型adc与stm32_关于STM32 双ADC同步规则转换两路数据的问题?
因系统要求需升级ADC的采样方式(以前方式:扫描方式,TIMER2触发ADC软启动,2通道规则序列,DMA传完中断),为了进一步实现两路信号的同步性能,采样STM32 双ADC同步规则转换。(timer2触发ADC软启动,2个单通道规则序列,DMA完成中断)
问题:
1:只能看到ADC1通道的数据。ADC2通道的数据貌似在ADC1_DR中的高16位中无法看到。
============================
//初始化DMA_ADC
void ADCWithDMAInit(void)
{
//DMA init; Using DMA channel 1
DMA_InitTypeDef DMA_InitStructure;
/* 允许 DMA1 */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
/* DMA1 channel1 configuration ----------------------------------------------*/
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&VOLT_SIGNAL;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize =1;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;// 全字节
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word; // 全字节
DMA_InitStructure.DMA_Mode =DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
/* Enable DMA1 channel1 */
//DMA_Cmd(DMA1_Channel1, ENABLE);
DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE); //DMA1传输完成中断
DMA_Cmd(DMA1_Channel1, ENABLE); //正式允许DMA
}
void ADC_Config(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
// TIM_OCInitTypeDef TIM_OCInitStructure;
// DMA_InitTypeDef DMA_InitStructure;
ADCWithDMAInit();
//DMA 中断设置
NVIC_InitStructure.NVIC_IRQChannel=DMA1_Channel1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
/*******************TIM**************/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE); //GPIOAC时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //timer2时钟
TIM_TimeBaseStructure.TIM_Period =7031; //1.408khz
TIM_TimeBaseStructure.TIM_Prescaler = 9;
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
//TIM_TimeBaseStructure.TIM_RepetitionCounter =0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
/* Enable the TIM2 global Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 6;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 6;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//使能Time2 更新中断。即溢出中断
//TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
/* Configure and enable ADC interrupt */
//NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQn;
//NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
//NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
//NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//NVIC_Init(&NVIC_InitStructure);
/*******************ADC**************/
RCC_ADCCLKConfig(RCC_CFGR_ADCPRE_DIV6);//ADC时钟PLCK2的6分频 12M。ADC最大时钟不能超过14M!
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_ADC2, ENABLE);
//A口有1个通道
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult; //ADC1工作在独立模式 同步规则模式
ADC_InitStructure.ADC_ScanConvMode =DISABLE; //使能模数转换工作在扫描模式(多通道)
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //模数转换工作在正常模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //软启动触发启动
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1; //顺序进行规则转换的ADC通道的数目
ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStructure中指定的参数初始化外设ADC1的寄存?
//ADC_Init(ADC2, &ADC_InitStructure);
/* Enable ADC1 EOC interrupt */
//ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);
//设置指定ADC的规则组通道,设置它们的转化顺序和采样时间(取最大值)//增加通道到规则队列中
ADC_RegularChannelConfig(ADC1, ADC_Channel_1 , 1, ADC_SampleTime_239Cycles5); //PA1
//C口有1个通道
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult; //ADC1工作在独立模式 同步规则模式
ADC_InitStructure.ADC_ScanConvMode =DISABLE; //使能模数转换工作在扫描模式(多通道)
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //模数转换工作在正常模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //软启动触发启动
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1; //顺序进行规则转换的ADC通道的数目
\
ADC_Init(ADC2, &ADC_InitStructure); //根据ADC_InitStructure中指定的参数初始化外设ADC1的寄存?
ADC_RegularChannelConfig(ADC2, ADC_Channel_12 , 1, ADC_SampleTime_239Cycles5);//PC2
/* Enable ADC2 external trigger conversion */
ADC_ExternalTrigConvCmd(ADC2, ENABLE);
/* Enable ADC1 DMA*/
ADC_DMACmd(ADC1, ENABLE);
/* Enable ADC1 external trigger */
//ADC_ExternalTrigConvCmd(ADC1, ENABLE);
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);
/* Enable ADC2 */
ADC_Cmd(ADC2, ENABLE);
/* Enable ADC1 reset calibaration register */
ADC_ResetCalibration(ADC1);
/* Check the end of ADC1 reset calibration register */
while(ADC_GetResetCalibrationStatus(ADC1));
/* Start ADC1 calibaration */
ADC_StartCalibration(ADC1);
/* Check the end of ADC1 calibration */
while(ADC_GetCalibrationStatus(ADC1));
/* TIM1 counter enable */
TIM_Cmd(TIM2, ENABLE);
/* TIM1 main Output Enable */
//TIM_CtrlPWMOutputs(TIM2, ENABLE);
//for()
}
双极型adc与stm32_关于STM32 双ADC同步规则转换两路数据的问题?相关推荐
- STM32理论 —— ADC、存储、定时器、时钟、中断
文章目录 1. ADC 1.1 ADC相关寄存器 1.1.1 ADC 控制寄存器1(ADC_CR1) 1.1.2 ADC 控制寄存器2(ADC_CR2) 1.1.3 ADC 采样时间寄存器(ADC_S ...
- STM32多通道ADC采样获取MCP9701模拟温度传感器温度输出数据
STM32多通道ADC采样获取MCP9701模拟温度传感器温度输出数据 市面上常见的模拟温度传感器有TI的LM35系列,然后使用中并不简便.MCP9701是Microchip公司推出的相似的模拟温度传 ...
- 使用HAL库开发STM32:ADC基础使用
文章目录 目的 基础说明 基础使用 配置选项说明 轮询 单通道 单次 轮询 单通道 连续 轮询 多通道 扫描 中断 单通道 中断 多通道 扫描 DMA 单通道 单轮 DMA 单通道 连续 DMA 多通 ...
- stm32双adc电压采集
ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult; //ADC工做模式:ADC同步规则组模式 ADC_DMACmd(ADC1, ENABLE); ...
- STM32F4系列探究1——三重ADC扫描连续采样+DMA双缓冲区存储
文章目录 前言 一.STM32F4的ADC理论知识学习 1.基础知识 2.扫描模式与连续模式 3.单ADC模式下双缓存机制的实现 4.三重同步采样模式 二.由定时器触发的单缓冲区模式 1.时钟树配置 ...
- STM32双轴摇杆控制空心杯电机
STM32双轴摇杆控制空心杯电机 双轴摇杆传感器 PS2双轴按键游戏摇杆模块采用PS2游戏手柄上金属按键摇杆电位器.模块特设二路模拟输出和一路数字输出接口.输出值分别对应(×.Y双轴偏移量.其类型 ...
- 双极型三极管共集电极、共基极放大电路
双极型三极管共集电极.共基极放大电路 本文介绍的定义 共集电极放大电路 共基极放大电路 本文介绍的定义 双极型三极管放大电路的接法.共集电极放大电路.射极跟随器.带负载能力.共基极放大电路.改善频率响 ...
- HAL库版STM32双轮自平衡车(三) ———代码精讲
系列文章目录 编码电机测速 HAL库OLED的使用 HAL库版STM32双轮自平衡车(一) ---代码思路和PID基础精讲 HAL库版STM32双轮自平衡车(二) --- CubeMX的配置.原理图接 ...
- HAL库版STM32双轮自平衡车(一) ———代码思路和PID基础精讲
系列文章目录 HAL库版STM32双轮自平衡车(一) ---代码思路和PID的简单介绍(本篇) HAL库版STM32双轮自平衡车(二) --- CubeMX的配置.原理图接线.物料准备 HAL库版ST ...
最新文章
- ceph bluestore源码分析:admin_socket实时获取内存池数据
- 基于Grafana的监控数据钻取功能应用实践
- V4L2学习 二 ----视频打开与保存简单流程
- Java里try catch的简单用法
- jq 自动滑动轮换(向后插入小块)
- intel A20地址线
- php array_reduce 降维,使用array_reduce降维
- 【物理/数学】概念的理解 —— pivot、position
- Vim编辑器显示行号且定义tab键为4个空格
- unix操作系统图标大全
- amazon linux ami root 密码,Amazon Linux AMI 常见问题
- 编译器设计(二)——上下文无关文法及推导
- MacBook Pro 上网很慢
- 关于DSP的SCI通信学习
- 设计师悲剧:你一天内要完成100张海报
- 暗黑如何修改服务器爆率,暗黑破坏神百倍爆率补丁
- 生活污水处理厂工程脱水车间设计、果汁饮料厂工艺流程及车间平面布置CAD设计、水处理车间工艺图、氯乙烯分离车间平面布置图、乳品车间设备布置图、核桃乳饮料厂工艺流程及车间平面布置CAD设计……
- “no source“: Error: command-line: #564: cannot open embedded assembler outpu
- 自定义变量的一个有趣案例
- MySQL基础教程---创建、查询、备份数据库