STM32L151 多通道ADC DMA循环扫描STM32CubeIDE STM32CubeMX参考设计

news2025/1/14 18:44:22

简介

项目开发过程中,采用STM32L151 芯片进行涉及,其中需要使用其片上ADC进行多路ADC数据采样。这里就记录一下实际这块的开发过程,其中涉及工程代码再项目中实际投产使用。STM32L151 多通道ADC DMA循环扫描STM32CubeIDE STM32CubeMX参考设计。

 本文使用工程下载

STM32L151多通道ADCDMA循环扫描STM32CubeIDESTM32CubeMX参考设计资源-CSDN文库

设计思路

由于需要采样11路ADC电压,所以采用DMA的方式,并设置ADC循环扫描,来减轻CPU的工作负担。采用STM32CubeIDE、STM32CubeMX+Keil uVision5进行设计验证。

调试过程关键问题

刚开始开发采用STM32CubeIDE,由于版本较低,出现了一个比较难搞的问题,后面切换到STM32CubeMX+Keil uVision5进行开发。该问题记录在博客,有兴趣的同学可以了解一下STM32CubeIDE使用ADC采用DMA重大BUG-CSDN博客。

是否需要打开ADC中断?

我看了很多网上的设计,都没有说清楚这个问题。这里其实没有必要打开ADC中断了,因为已经有使用DMA了,DMA传输完成后会给出DMA中断。如果有需要,可以在DMA中断处理函数,进行处理。

void DMA1_Channel1_IRQHandler(void)
{
  /* USER CODE BEGIN DMA1_Channel1_IRQn 0 */

  /* USER CODE END DMA1_Channel1_IRQn 0 */
  HAL_DMA_IRQHandler(&hdma_adc);
  /* USER CODE BEGIN DMA1_Channel1_IRQn 1 */

  /* USER CODE END DMA1_Channel1_IRQn 1 */
}

硬件设计

时钟方面,使能外部8Mhz时钟,时钟配置图如下图所示,从图中可以看出ADC的时钟是由内部高速时钟提供的。

ADC设计,如下图所示,打开11路ADC采样通道。

软件设计

 串口打印设置

添加串口打印宏定义如下:

#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif

PUTCHAR_PROTOTYPE
{
//#if (DEBUG_PRINTF_ON == 1)
    //HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1 , 0xffff);
	while((USART1->SR&0x40)==0){};
		USART1->DR = ch;
//	while((USART3->SR&0x40)==0);
//		USART3->DR = ch;
//#endif
    return ch;
}

这里需要提醒的是采用STM32CubeMX+Keil uVision5进行设计的时候,因为使用了printf函数,所以需要将工程的如下设置勾选。

ADC初始化

 ADC初始配置如下代码所示,这里针对hadc.Init.ContinuousConvMode = DISABLE;由于DMA数据深度设置为1,也就是说11路采样数据采样完成后,就有DMA中断,所以DMA中断太频繁,如果设置hadc.Init.ContinuousConvMode = ENABLE;会导致MCU一直处于DMA中断中,这里也可以加深DMA采样数据来解决这个问题,由于本项目需求较为简单,就是对采样率没有特别要求。所以无需加深DMA的采样数据。ADC如果采样数据不对,可以尝试调大单个通道sConfig.SamplingTime = ADC_SAMPLETIME_96CYCLES;来进行调试。

hadc.Instance = ADC1;
  hadc.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
  hadc.Init.Resolution = ADC_RESOLUTION_12B;
  hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc.Init.ScanConvMode = ADC_SCAN_ENABLE;
  hadc.Init.EOCSelection = ADC_EOC_SEQ_CONV;
  hadc.Init.LowPowerAutoWait = ADC_AUTOWAIT_DISABLE;
  hadc.Init.LowPowerAutoPowerOff = ADC_AUTOPOWEROFF_DISABLE;
  hadc.Init.ChannelsBank = ADC_CHANNELS_BANK_A;
  hadc.Init.ContinuousConvMode = DISABLE;
  hadc.Init.NbrOfConversion = 11;
  hadc.Init.DiscontinuousConvMode = DISABLE;
  hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc.Init.DMAContinuousRequests = ENABLE;
  if (HAL_ADC_Init(&hadc) != HAL_OK)
  {
    Error_Handler();
  }

  /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
  */
  sConfig.Channel = ADC_CHANNEL_1;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLETIME_96CYCLES;
  if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }

  /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
  */
  sConfig.Channel = ADC_CHANNEL_4;
  sConfig.Rank = ADC_REGULAR_RANK_2;
  if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }

  /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
  */
  sConfig.Channel = ADC_CHANNEL_5;
  sConfig.Rank = ADC_REGULAR_RANK_3;
  if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }

  /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
  */
  sConfig.Channel = ADC_CHANNEL_6;
  sConfig.Rank = ADC_REGULAR_RANK_4;
  if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }

  /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
  */
  sConfig.Channel = ADC_CHANNEL_7;
  sConfig.Rank = ADC_REGULAR_RANK_5;
  if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }

  /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
  */
  sConfig.Channel = ADC_CHANNEL_8;
  sConfig.Rank = ADC_REGULAR_RANK_6;
  if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }

  /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
  */
  sConfig.Channel = ADC_CHANNEL_9;
  sConfig.Rank = ADC_REGULAR_RANK_7;
  if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }

  /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
  */
  sConfig.Channel = ADC_CHANNEL_18;
  sConfig.Rank = ADC_REGULAR_RANK_8;
  if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }

  /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
  */
  sConfig.Channel = ADC_CHANNEL_19;
  sConfig.Rank = ADC_REGULAR_RANK_9;
  if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }

  /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
  */
  sConfig.Channel = ADC_CHANNEL_20;
  sConfig.Rank = ADC_REGULAR_RANK_10;
  if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }

  /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
  */
  sConfig.Channel = ADC_CHANNEL_21;
  sConfig.Rank = ADC_REGULAR_RANK_11;
  if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }

 调试记录

STM32CubeIDE 1.7.0工程测试记录:

STM32CubeMX 6.8.1+Keil uVision5测试记录

本文使用工程下载

STM32L151多通道ADCDMA循环扫描STM32CubeIDESTM32CubeMX参考设计资源-CSDN文库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2215019.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【文心智能体 | AI大师工坊】通过知识库优化智能体『万圣节之纸人还魂』:探索恐怖剧本杀的奇幻之旅

文章目录 1.1、智能体运行效果1.2、创作灵感来源1.3、如何制作智能体1.4、可能会遇到的几个问题1.5、快速调优指南 My_优质智能体『万圣节之纸人还魂👻』:https://aq58pt.smartapps.baidu.com/?_swebfr1&_swebScene3611000100000000 在当今人工智能…

Vue开发中由错误These relative modules were not found 引起的问题思考及解决

一、由Vue: These relative modules were not found 引起的问题 1、vue2.6.14 These relative modules were not found 在使用vue2.6.14开发的项目在本地windows 10上都一直成功,想放到jenkins上进行发布。之前其它的 vue 项目也都能发布正常,但此次一…

【stm32】DMA的介绍与使用

DMA的介绍与使用 1、DMA简介2、存储器映像3、DMA框图4、DMA基本结构5、DMA请求6、数据宽度与对齐7、数据转运DMA(存储器到存储器的数据转运)程序编写: 8、ADC连续扫描模式DMA循环转运DMA配置:程序编写: 1、DMA简介 DM…

Antsword-labs靶机渗透

Less-1 在当前界面开启终端 ![](https://img-blog.csdnimg.cn/img_convert/e5ab1b947b1186a43b58abaf10263cb1.png) 启动环境 plain docker-compose up -d 蚁剑连接 ![](https://img-blog.csdnimg.cn/img_convert/81a5c09987e18355335d07e4da52cb5f.png) 打开终端寻找flag …

ACL:访问控制列表

基本概念 1.访问控制: 在路由器的入或者出的接口上,匹配流量,之后产生动作,只有允许和拒绝。 2.定义感兴趣流量: 帮助其他策略抓流量的 匹配规则:至上而下 逐一匹配 上条匹配按照上条执行 不再查看下条 (思科体系中 末尾隐含拒绝所有 华为…

20个月投标战胜国际对手,中国百余台AGV进驻欧洲……

导语 大家好,我是社长,老K。专注分享智能制造和智能仓储物流等内容。 在全球智能制造竞争日益激烈的今天,中国制造再次传来振奋人心的好消息。 经过长达20个月的艰苦角逐,一家中国机器人企业(新松机器人)成…

microsoft edge浏览器卡死问题

win11经常遇到microsoft edge浏览器卡死的情况,有时候是一会没用浏览器就全部卡死,有时候是锁屏或者电脑休眠浏览器就不能用,找了很多的办法都没好使,用以下方法好使了: edge浏览器中打开 edge://settings/system 把 …

计算机的错误计算(一百二十三)

摘要 探讨算式 的计算精度问题。 例1. 已知 计算 不妨在Python下计算,则有: 若用Rust在线计算: fn main() {let x: f64 0.125e-6;let tan_x x.tan();let sin_x x.sin();let denominator x - (1.0 x * x).sqrt();let result (…

大学模拟电路设计期末速成总结

大学模拟电路设计期末速成总结 模拟电路设计是电子工程领域的基础,它涉及到连续信号的处理和放大。对于电子工程的学生来说,掌握模拟电路设计的基本原理和应用是至关重要的。以下是期末速成总结,帮助你快速回顾和掌握模拟电路设计的关键知识…

香橙派刷机和开发环境准备(ubuntu22.04版)_随记1

前言: 一、香橙派刷ubuntu系统和SSH登录 1、刷机前准备: ①TF卡(8G)、读卡器、OrangePi5Pro ②Win32DiskImager(烧写系统工具)、SDFormatter(TF格式化工具) ③系统镜像&#xff…

学习文档(4)

目录 Vue简介 MVVM思想 Vue指令 内容输出指令 条件渲染指令 列表渲染指令 数据绑定指令 Vue简介 Vue2.x官网:https://v2.cn.vuejs.org Vue3.x官网:https://cn.vuejs.org 官网(2.x版本)对vue的定义是:vue是一套…

kubelet PLEG实现

概述 kubelet的主要作用是确保pod状态和podspec保持一致,这里的pod状态包括pod中的container状态,个数等。 为了达到这个目的,kubelet需要从多个来源watch pod spec的变化,并周期从container runtime获取最新的container状态。比如…

I2C相关结构体讲解:i2c_adapter、i2c_algorithm、i2c_msg

往期内容 I2C子系统专栏: I2C(IIC)协议讲解SMBus 协议详解 总线和设备树专栏: 专栏地址导航篇 – 专栏未篇 1.框图 建议右击图片在新标签页打开预览 i2c_transfer函数就是读取i2c设备的信息或者输出信息给i2c设备的函数 比如发送…

信息安全工程师(49)网络物理隔离系统与类型

前言 网络物理隔离系统是指通过物理隔离技术,在不同的网络安全区域之间建立一个能够实现物理隔离、信息交换和可信控制的系统,以满足不同安全域的信息或数据交换需求。 一、网络物理隔离系统概述 网络物理隔离系统的核心在于通过物理方式将不同安全级别的…

SQL Injection | SQL 注入概述

关注这个漏洞的其他相关笔记:SQL 注入漏洞 - 学习手册-CSDN博客 0x01:SQL 注入漏洞介绍 SQL 注入就是指 Web 应用程序对用户输入数据的合法性没有判断,前端传入后端的参数是可控的,并且参数会带入到数据库中执行,导致…

【计算机网络篇】数据链路层 协议、介质访问控制

🧸安清h:个人主页 🎥个人专栏:【计算机网络】【Mybatis篇】 🚦作者简介:一个有趣爱睡觉的intp,期待和更多人分享自己所学知识的真诚大学生。 系列文章目录 【计算机网络篇】计算机网络概述 【…

[实时计算flink]CREATE DATABASE AS(CDAS)语句

CDAS支持整库级别的表结构和数据的实时同步,还支持表结构变更的同步。本文为您介绍CREATE DATABASE AS(CDAS)的使用方法,并提供了多种使用场景下的示例。 背景信息 CDAS是CTAS语法的一个语法糖,用于实现整库同步、多…

在 Unity 中创建模型动画的探索之旅

在 Unity 游戏开发或 3D 场景构建中,模型动画是赋予虚拟对象生命和个性的关键元素。它能够极大地增强用户体验,使场景更加生动和吸引人。本文将带您深入了解在 Unity 中创建模型动画的基本流程和方法。 一、准备工作 在开始创建动画之前,您…

空间大数据的数据变换与价值提炼

在数字化时代,空间大数据正成为推动社会经济发展的关键因素。空间大数据不仅体量巨大,而且具有高速流转、多样类型和真实性等特点,它们在获取、存储、管理、分析方面超出了传统数据库软件工具的能力范围。地理信息系统(GIS&#x…

淘宝详情API接口有什么用处?

淘宝详情API接口有什么用处?主要体现在以下几个方面: 电商数据分析:通过调用API接口获取商品详情数据,可以对商品的销售情况、价格变化、属性分布等进行深入分析。这些数据为电商运营提供了决策支持,帮助商家更好地了…