当前位置: 首页 > news >正文

使用STM32 CUBE IDE配置STM32F7 用DMA传输多通道ADC数据

我的使用环境:

        硬件:STM32F767ZGT6、串口1、ADC1、16MHz晶振、216MHz主频

        软件:STM32 CUBE IDE

        优点:不用定时触发采样,ADC数据是不停的实时更新,ADC数据的更新频率根据采样时钟和采样周期决定,后期只需要定时取用数据即可。

        串口1用 printf 的打印ADC采集到的数据。或者用仿真查看数据变化也行。

一、基础知识

        ADC的时钟是APB2,与时钟树的配置有关,同时规格书中ADC的时钟最大频率又跟电源电压有关,3.3V下最大时钟频率为36MHz。所以预分频后的频率肯定是在这个规定最大时钟频率之内的。

二、STM32Cube IDE 具体配置

        串口配置:使能后更改合适波特率。

        ADC和DMA 配置

  1. 预分频之后的时钟应该是在ADC时钟范围之内的,用APB2频率除以分频数。
  2. DMA要开启扫描模式、连续转换模式、DMA连续请求
  3. 每个ADC通道的采样时间一定要高于分辨率要求的采样时钟周期,否则会导致初始化失败或者数据没有更新。

        4、配置详细解释:

        长的采样时间可以减少 ADC 读数的噪声,从而提高精度。在更长的采样时间内,模拟信号的值可以平稳地积累,使得读数更加准确。虽然长的采样时间可以提高 ADC 的精度,但是会影响采样频率。因此,在不同的应用场景中,需要选择合适的采样时间,以达到较高的精度和采样频率的平衡。

        5、ADC Injected Conversion Mode

        它允许在特定序列中执行多次ADC转换,每次转换有单独的触发。注入转换通常用于高级任务,例如过采样或偏移校正,并且在ADC的触发输入或软件命令触发的常规转换之外执行。
        在注入转换模式下,ADC执行一系列转换,每次转换由单独的触发输入触发。注入转换的ADC结果寄存器与常规转换的结果寄存器分开,结束转换中断可以为每种类型的转换单独生成。这允许CPU监视ADC的状态,并确定注入转换何时完成。
        是否使用注入转换模式取决于ADC应用程序的具体要求,在使用注入转换模式之前了解注入转换模式的功能和限制是非常重要的。

三、验证程序

        生成程序后,main.c中开始,使用下面的函数打开DMA传输,每当ADC完成一次数据采样,DMA就会将ADC数据更新至 *pData指定的数组。在任意时刻取用数组中的数据即可。

HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length)

        串口用 printf 打印:

        主体部分:

四、测试结果        

        main.c 代码如下:

/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes *//* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*/
ADC_HandleTypeDef hadc1;
DMA_HandleTypeDef hdma_adc1;UART_HandleTypeDef huart1;/* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_DMA_Init(void);
static void MX_ADC1_Init(void);
static void MX_USART1_UART_Init(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
PUTCHAR_PROTOTYPE
{HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);return ch;
}
#endifuint16_t ADC_Value_buffer[2];
/* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
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_ADC1_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */printf("**************************\r\n");HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC_Value_buffer, 2);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */printf("ADC_Value_buffer: %d %d\r\n", ADC_Value_buffer[0], ADC_Value_buffer[1]);HAL_Delay(500);}/* USER CODE END 3 */
}

        测试结果如下:

http://www.lryc.cn/news/761.html

相关文章:

  • linux 学习(持续更新)
  • Nacos【一】Nacos集群部署配置
  • “亚洲一号”也能上市?REITs背后的物流设施风起云涌
  • 2023养老展,CBIAIE第十届中国北京国际老年产业博览会
  • 【Android -- 每日一问】现在 Android 怎么学?学什么?
  • JVM垃圾回收
  • clickhouse集群安装
  • Zookeeper入门
  • JavaScript
  • .gitignore 常用忽略规则
  • Vue路由 —— vue-router
  • Java Jackson TypeReference获取泛型类型信息【泛型】
  • Python 核心笔记(二)
  • Hadoop集群搭建
  • 每个前端都应该掌握的7个代码优化的小技巧
  • 金三银四丨黑蛋老师带你剖析-二进制漏洞
  • pgsql-用户角色组角色创建和维护
  • 算法与数据结构理解
  • 常见的C++软件异常场景分析与总结
  • 【虹科公告】好消息!云展厅开放时间长达1年,2023年不限次云观展
  • Linux破解root密码
  • 2023年信息与通信工程国际会议(JCICE 2023)
  • ASP.NET Core+Element+SQL Server开发校园图书管理系统(完)
  • elasticsearch 批量写入(Python版).md
  • 【排序算法】快速排序(Quick Sort)
  • SpringIOC之创建Bean的核心方法doGetBean
  • docker快速部署xxjob2.3.0-SpringBoot快速集成示例
  • 项目管理的前路,前辈能给一些意见吗?
  • 省钱的年轻人,钱包被折扣店钻了空子
  • 【华为OD机试真题 js、python】优选核酸检测点、寻找核酸检测点【2022 Q4 100分】