STM32 ADC --- DMA乒乓缓存

devtools/2024/11/17 0:31:57/

ADC__DMA_0">STM32 ADC — DMA乒乓缓存

文章目录

  • STM32 ADC --- DMA乒乓缓存
    • 软件切换实现乒乓
    • 利用DMA双缓冲实现乒乓

  • 通过cubeMX配置生成HAL工程
  • 这里使用的是上篇文章(STM32 ADC — DMA采样)中生成的工程配置

软件切换实现乒乓

cubeMX默认生成的工程中是打开DMA中断的,这章我们需要用到该中断,固不要将该中断关闭(对于上节的配置使用将DMA中断关闭也是可以正常工作的)。

DMA在传输完成时会调用void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)该回调函数,

#define SAMPLE_NUM 10
#define CHANNEL_NUM 2
uint16_t adc_converted_value[SAMPLE_NUM][CHANNEL_NUM]; //行表示存储的ADC数据个数,列表示对应的通道uint16_t adc_converted_value2[SAMPLE_NUM][CHANNEL_NUM];//注意:这里不能关闭DMA中断
//HAL_NVIC_DisableIRQ(DMA2_Stream0_IRQn); 
HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc_converted_value, SAMPLE_NUM*CHANNEL_NUM);// 中断回调函数,DMA传输完成时会自动调用该函数
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) {if(hadc->Instance == ADC1) {static uint32_t cnt = 0;cnt++;if(cnt & 0x1) {//切换DMA内存地址HAL_ADC_Stop_DMA(&hadc1);HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc_converted_value2, SAMPLE_NUM*CHANNEL_NUM);//TODO: 数据处理} else {//切换DMA内存地址HAL_ADC_Stop_DMA(&hadc1);HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc_converted_value, SAMPLE_NUM*CHANNEL_NUM);// TODO: 数据处理}}
}

利用DMA双缓冲实现乒乓

参考文章:https://shequ.stmicroelectronics.cn/thread-625398-1-1.html


http://www.ppmy.cn/devtools/134575.html

相关文章

【python系列】python数据类型之数字类型

1.定义 数字类型是编程中最常用的数据类型。什么是数字类型,下面是数字类型官方文档的解释:https://docs.python.org/zh-cn/3.10/library/stdtypes.html?highlightstr%20join#numeric-types-int-float-complex 以上可以知道: 数字类型包…

回调函数的概念、意义和应用场景

概念 回调函数,就是使用者自己定义一个函数,并实现函数的内容,然后把这个函数作为参数传入其它函数中,由其它函数在运行时来调用。 换句话说,函数是你实现的,但由别人的函数在运行时通过参数传递的方式调用…

flutter下拉刷新上拉加载的简单实现方式三

使用 CustomScrollView 结合 SliverList 实现了一个支持下拉刷新和上拉加载更多功能的滚动列表,对下面代码进行解析学习。 import dart:math;import package:flutter/material.dart;import custom_pull/gsy_refresh_sliver.dart; import package:flutter/cupertino…

hhdb数据库介绍(9-14)

SQL语法支持 DML语句 在关系集群数据库中,DML语句的逻辑将变的更为复杂。计算节点将DML语句分为两大类:单库DML语句与跨库DML语句。 单库DML语句,指SQL语句只需在一个节点上运行,即可计算出正确结果。假设分片表customer分片字…

杨中科 .Net Core 笔记 DI 依赖注入2

ServiceCollection services new ServiceCollection();//定义一个承放服务的集合 services.AddScoped<iGetRole, GetRole>();using (ServiceProvider serviceProvider services.BuildServiceProvider()) {var list serviceProvider.GetServices(typeof(iGetRole));//获…

力扣题目解析--合并两个链表

题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输出&#xff…

Java基础:内部类

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

密码学在网络安全中的应用

密码学作为网络安全领域的核心技术之一&#xff0c;发挥着举足轻重的作用。以下是对密码学在网络安全中应用的详细阐述&#xff1a; 一、数据加密密码学通过加密算法将明文转换为密文&#xff0c;以防止未经授权的个人或机构获取敏感信息。这主要包括&#xff1a;对称加密&…