STM32F303RE 芯片有4个ADC, 采样频率据说能达到5Mbsps 已经算是非常高的了.
比较适合做采样

参考文章
STM32三个ADC同步规则采样

参考上面的配置文章. 经过不断的失败和重复尝试, 最后终于搞通了.
其中遇到了好几个错误, 也许是 STM32F303RE 与其它的不一样, 也许是我用的固件库库版本不一样… 我目前用的是
STM32Cube FW_F3 V1.11.3 这个版本的 Firmware Package, 我的开发工具是 STM32CubeIDE

第一步配置ADC1


配置ADC1 的 DMA 这里一定要选择 Word, 为啥一定要是Word?

我也是被这个问题困扰了好久. 经过我一番好找, 查边各种文章, 最后终于搞明白了.

答案是, 在同步ADC模式中, ADC1是主ADC, ADC2是从ADC, 当模式为 [同步规则模式] 时 数据是存放在 ADC1_2 的 CDR 寄存器中的.

我是怎么知道的? 这是花了好长时间从寄存器参考手册中查到的.

Dual ADC modes
In devices with two ADCs or more, dual ADC modes can be used (see Figure 97):
• ADC1 and ADC2 can be used together in dual mode (ADC1 is master)
• ADC3 and ADC4 can be used together in dual mode (ADC3 is master)

译文如下:
双ADC模式
在有两个或多个ADC的设备中,可以使用双ADC模式(见图97):
•ADC1和ADC2双模式同时使用(ADC1为主)
•ADC3和ADC4双模式同时使用(ADC3为主)

In dual ADC mode, the converted data of the master and slave ADC can be read in parallel,
by reading the ADC common data register (ADCx_CDR). The status bits can be also read in
parallel by reading the dual-mode status register (ADCx_CSR).

译文如下
在双ADC模式下,通过读取ADC公共数据寄存器(ADCx_CDR),可以并行读取主、从ADC的转换数据。状态位也可以通过读取双模式状态寄存器(ADCx_CSR)来并行读取。

这里额外插一句, 我觉得 , 学习STM32 需要掌握的知识除了c语言之外,还需要手边放一个 [寄存器级别的 参考手册], 这个参考手册是芯片设计人员写给程序开发人员看的, 里面非常非常详细的介绍了每个寄存器的作用, 甚至还写了使用的注意事项和方法. 能看懂这个手册基本上就会用stm32了… 看起来也不是很难. stm32 参考手册好像还有中文版. 看参考手册要注意芯片型号要对应, 别看了半天最后发现型号都不一样的. 这个手册是可以从http://www.st.com 官方下载的. 怎么下载就不展开讲了.

另外这里要分享一个好东西, STM32CubeIDE 有寄存器查看窗口, 好像Kiel 也有. 能够查看寄存器的当前值, 基本上再根据寄存器的参考手册就知道当前的机器内部运行情况 . 而不是瞎猜了.

回到正题.
配置ADC2, 基本上跟ADC1一致,有几个选型因为ADC1选好之后ADC2就不能选了, 有些已经默认选好了.

选好通道, 再添加DMA

下面就是主代码


#define MAX_REC_COUNT  100//可随根据实际使用情况进行调整
#define MAX_ADC_COUNT  2000//可随根据实际使用情况进行调整volatile uint16_t Adc12_Values[MAX_ADC_COUNT*2]; // 这里是 uint16_t  类型的,下面用的时候是转换成 (uint32_t *) 的指针
volatile uint16_t Adc34_Values[MAX_ADC_COUNT*2]; // 这里是 uint16_t  类型的,下面用的时候是转换成 (uint32_t *) 的指针
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_DMA_Init();MX_USART2_UART_Init();MX_ADC1_Init();MX_ADC2_Init();MX_ADC3_Init();MX_ADC4_Init();MX_TIM4_Init();/* USER CODE BEGIN 2 *//* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE *///开启DMA接收命令//HAL_UART_Receive_DMA(&huart2, ReceiveBuffer, 10);HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED); //校准HAL_ADCEx_Calibration_Start(&hadc2, ADC_SINGLE_ENDED); //校准HAL_ADCEx_Calibration_Start(&hadc3, ADC_SINGLE_ENDED); //校准HAL_ADCEx_Calibration_Start(&hadc4, ADC_SINGLE_ENDED); //校准// 启动adc dma模式下面这几句就够了参考  https://www.stm32cube.com/article/212,HAL_StatusTypeDef state = HAL_OK;//  HAL_ADC_Start(&hadc1); //不能启动主ADC, 如果启动了, 后面的 HAL_ADCEx_MultiModeStart_DMA 就不能正常启动了.HAL_ADC_Start(&hadc2);//    HAL_ADC_Start(&hadc3); //不能启动主ADC, 如果启动了, 后面的 HAL_ADCEx_MultiModeStart_DMA 就不能正常启动了.HAL_ADC_Start(&hadc4);//启动ADCstate = HAL_ADCEx_MultiModeStart_DMA(&hadc1, (uint32_t*)Adc12_Values, MAX_ADC_COUNT);//启动同步规则模式及DMA,4个ADC state = HAL_ADCEx_MultiModeStart_DMA(&hadc3, (uint32_t*)Adc34_Values, MAX_ADC_COUNT);//启动同步规则模式及DMA,4个ADC //  state = HAL_ADC_Start_DMA(&hadc1, (uint32_t*)Adc1_4_Values[0], MAX_ADC_COUNT);  //这个不需要, 也不行.
//   state = HAL_ADC_Start_DMA(&hadc3, (uint32_t*)Adc1_4_Values[1], MAX_ADC_COUNT);  //这个不需要, 也不行.// 这里调试 state 的状态可以方便知道前面的配置是否正常..如果不是HAL_OK可以调试跟踪进去,看看是哪一步代码出错了.if(state == HAL_OK){int a=0;}HAL_TIM_Base_Start(&htim4);//启动TIM2,用于触发ADC采样HAL_UARTEx_ReceiveToIdle_DMA(&huart2, ReceiveBuffer, MAX_REC_COUNT);while (1){/* USER CODE END WHILE *///HAL_UART_Transmit(&huart2, (uint8_t *)SendBuffer, sizeof(SendBuffer),10);
//         if(DMA_Flag == 1)//AD转换完成标准
//          {//               DMA_Flag = 0;
//               HAL_TIM_Base_Stop(&htim4);
//               HAL_ADCEx_MultiModeStop_DMA(&hadc1);
//               HAL_ADC_Stop(&hadc1);//停止采样
//               HAL_ADC_Stop(&hadc2);//停止采样
//               HAL_ADC_Stop(&hadc3);//停止采样
//               HAL_ADC_Stop(&hadc4);//停止采样
//
//               for(uint8_t i=0;i<100;i++)
//               {                        sprintf(str,"$,%d,%d,%d",Adc_Values[i][0],Adc_Values[i][1],Adc_Values[i][2]);
                        HAL_UART_Transmit(&huart8, (uint8_t*)str,strlen(str),100);//串口发送到上位机
//               }
                 HAL_ADC_Start(&hadc1);
//               HAL_ADC_Start(&hadc2);
                 HAL_ADC_Start(&hadc3);
//               HAL_ADC_Start(&hadc4);
//
//               HAL_ADCEx_MultiModeStart_DMA(&hadc1,  (uint32_t*)Adc12_Values,  MAX_REC_COUNT/2);
//               HAL_ADCEx_MultiModeStart_DMA(&hadc3,  (uint32_t*)Adc34_Values,  MAX_REC_COUNT/2);
//
//               HAL_TIM_Base_Start(&htim4);//重新启动采样
//          //    ————————————————
//          //    版权声明:本文为CSDN博主「天外飞仙CUG」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
//          //    原文链接:https://blog.csdn.net/zhang062061/article/details/113735874
//          }HAL_UART_Transmit_DMA(&huart2, (uint8_t *)SendBuffer, sizeof(SendBuffer));//DMA model// HAL_UART_Transmit_DMA(&huart2, (uint8_t *)adc_vals, sizeof(SendBuffer));//DMA modelHAL_Delay(1000);/* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

ADC时钟的配置, 需要自己根据项目需求更改合适的数值. 前面的ADC时钟源要选这个Timer… 注意Trigger Event Selection TRGO 要选择 Update Event

注意事项:
前面的参考文章中并未说明, HAL_ADCEx_MultiModeStart_DMA 要求, 主ADC不能先启动, 只能先启动从属ADC2和ADC4,

//                HAL_ADC_Start(&hadc1);  // 这个不能启动, 否则下面的HAL_ADCEx_MultiModeStart_DMA(&hadc1, ..)  就不能正常启动.HAL_ADC_Start(&hadc2);
//               HAL_ADC_Start(&hadc3);  // 这个不能启动, 否则下面的HAL_ADCEx_MultiModeStart_DMA(&hadc3, ..)  就不能正常启动.HAL_ADC_Start(&hadc4);HAL_ADCEx_MultiModeStart_DMA(&hadc1,  (uint32_t*)Adc12_Values,  MAX_REC_COUNT/2);HAL_ADCEx_MultiModeStart_DMA(&hadc3,  (uint32_t*)Adc34_Values,  MAX_REC_COUNT/2);

我操这点功能搞了2天…

STM32F303RE 四个ADC同步规则采样相关推荐

  1. STM32三个ADC同步规则采样

    同步采样一般应用于交流信号中,是指多个ADC的采集时刻完全同步.在电力测量领域,经常会遇到需要同步采样的情况,比如同步采样电压电流信号,计算其相位差.阻抗分析时,也需要对输入输出信号进行同步采集,分析 ...

  2. 双极型adc与stm32_关于STM32 双ADC同步规则转换两路数据的问题?

    因系统要求需升级ADC的采样方式(以前方式:扫描方式,TIMER2触发ADC软启动,2通道规则序列,DMA传完中断),为了进一步实现两路信号的同步性能,采样STM32 双ADC同步规则转换.(time ...

  3. STM32 ADC 同步规则模式 ADC1与ADC2同用一个DMA

    STM32 ADC 支持同步规则模式 ,其官方解释为: 大致意思就是通道组的 ADC1 的多路开关(由 ADC1_CTLR2寄存器的 ETSRC[2:0]决定), ADC2 被同步触发.在 ADC1 ...

  4. STM32 ADC多通道规则采样和注入采样

    layout: post tags: [STM32] comments: true 文章目录 layout: post tags: [STM32] comments: true 什么是ADC? STM ...

  5. STM32的同步规则模式使用

    由于要采集电压.电流以计算功率.阻抗等信息,STM32的同步规则模式很适合于这种情景.使用时有几点需要注意的: 1.选择正确的模式:ADC_Mode_RegSimult,即DUALMOD[3:0] = ...

  6. STM32F4系列探究1——三重ADC扫描连续采样+DMA双缓冲区存储

    文章目录 前言 一.STM32F4的ADC理论知识学习 1.基础知识 2.扫描模式与连续模式 3.单ADC模式下双缓存机制的实现 4.三重同步采样模式 二.由定时器触发的单缓冲区模式 1.时钟树配置 ...

  7. GD32F4xx MCU ADC+DMA 多通道采样

    1.GD32F4xx ADC GD32F4xx 的12位ADC是一种采用逐次逼近方式的模拟数字转换器. 1.1 主要特征 可配置12位.10位.8位.6位分辨率: ADC采样率:12位分辨率为2.6M ...

  8. 对GD32F450的ADC同步模式的理解

    对GD32F450的ADC同步模式的理解 文章目录 对GD32F450的ADC同步模式的理解 前言 一.对ADC同步模式的理解 二.ADC同步模式中使用DMA模式 0 三.代码 1.配置思路 2.AD ...

  9. 14位125MSPS四通道ADC电路图讲解(通过后端数字求和增强SNR性能)_电工基础电路图讲解

    电路图简介: 所示电路是14位.125 MSPS四通道ADC系统的简化图,该电路使用后端数字求和将信噪比(SNR)从单通道ADC的 74 dBFS提升到四通道ADC的78.5 dBFS.这项技术特别适 ...

最新文章

  1. C++ 笔记(33)— C/C++ 程序员常见面试试题深入剖析
  2. 【Java源码分析】Android-LruCache源码分析
  3. Druid(准)实时分析统计数据库——列存储+高效压缩
  4. 打包静默安装参数(nsis,msi,InstallShield,InnoSetup)[转]
  5. subview自适应superview的frame autosizingMask(转)
  6. 《STL源码剖析》学习-- 1.9-- 可能令你困惑的C++语法2
  7. 产品经理与交互设计师的区别是什么?
  8. BeautifulSoup解析库select方法实例——获取企业信息
  9. [USACO07NOV]牛栏Cow Hurdles
  10. 华为 MindSpore 喊你来开发 10 大 AI 模型,260 万奖金怎能没你一份?
  11. Java基础语法实例(2)——实习第二天
  12. 中国卫生健康统计年鉴(2006-2021年)
  13. Altium Designer PCB设计常用规则
  14. adb shell 查看CPU架构
  15. java电影推荐系统_电影推荐系统源代码
  16. CKA-kubernetes 部署-hard-way-1.1-1.3
  17. android 程序闪退 log,应用闪退log日志。。
  18. centOS:常用命令
  19. 备份Windows Azure虚拟机
  20. 摄影构图学83年绝版_点评2张粉丝投稿,有1处共同错误,3个摄影技巧“变废为宝”...

热门文章

  1. 你要怎样知足,才会有点幸福
  2. 微信小程序获取地理位置信息
  3. 关于计算机的英语单词及例句,小学生必背英语单词及例句(四年级).doc
  4. 袋鼠云数据中台专栏(一) :浅析数据中台策略与建设实践
  5. ArcGIS教程:按掩膜提取 (空间分析)
  6. zabbix-server仪表板出现: 不
  7. 关于判断力-兼谈IT评论界冥顽不化的愚蠢
  8. 为什么要预测、优化工业生产中的问题呢?
  9. 在2016年度山东省计算机技能大赛中,学院在2016年山东省职业院校技能大赛中再获佳绩...
  10. IK 分词器空格支持