STM32H723差分与单端ADC转换
1、配置ADC
初始化代码如下

/* ADC1 初始化函数 */ void MX_ADC1_Init(void) { /* 用户代码部分:ADC1初始化开始 0 */ /* 用户代码部分:ADC1初始化结束 0 */ /* 定义多模式和通道配置结构体 */ ADC_MultiModeTypeDef multimode = {0}; ADC_ChannelConfTypeDef sConfig = {0}; /* 用户代码部分:ADC1初始化开始 1 */ /* 用户代码部分:ADC1初始化结束 1 */ /** 公共配置部分 * 配置ADC的主要参数,包括时钟分频、分辨率、扫描模式等。 */ hadc1.Instance = ADC1; // 选择ADC1外设 hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1; // 异步时钟分频设为1 hadc1.Init.Resolution = ADC_RESOLUTION_16B; // 设置ADC分辨率为16位 hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE; // 启用扫描转换模式 hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; // 每次转换完成触发中断 hadc1.Init.LowPowerAutoWait = DISABLE; // 禁用低功耗自动等待模式 hadc1.Init.ContinuousConvMode = ENABLE; // 启用连续转换模式 hadc1.Init.NbrOfConversion = 8; // 设置总共8个通道 hadc1.Init.DiscontinuousConvMode = DISABLE; // 禁用不连续转换模式 hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; // 使用软件触发开始转换 hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; // 不使用外部触发沿 hadc1.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR; // 启用DMA循环模式 hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN; // 允许数据覆盖 hadc1.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE; // 无左移操作 hadc1.Init.OversamplingMode = ENABLE; // 启用过采样 hadc1.Init.Oversampling.Ratio = 1; // 过采样比例为1(无实际效果) hadc1.Init.Oversampling.RightBitShift = ADC_RIGHTBITSHIFT_NONE; // 无右移操作 hadc1.Init.Oversampling.TriggeredMode = ADC_TRIGGEREDMODE_SINGLE_TRIGGER; // 单触发模式 hadc1.Init.Oversampling.OversamplingStopReset = ADC_REGOVERSAMPLING_CONTINUED_MODE; // 连续模式 if (HAL_ADC_Init(&hadc1) != HAL_OK) { Error_Handler(); // 如果初始化失败,调用错误处理函数 } /** 配置ADC多模式 * 设置ADC工作模式为独立模式。 */ multimode.Mode = ADC_MODE_INDEPENDENT; if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK) { Error_Handler(); } /** 配置常规通道 * 设置每个通道的采样时间、通道序号及其他参数。 */ sConfig.Channel = ADC_CHANNEL_3; // 通道3 sConfig.Rank = ADC_REGULAR_RANK_1; // 排在序列第1位 sConfig.SamplingTime = ADC_SAMPLETIME_32CYCLES_5; // 采样时间为32.5周期 sConfig.SingleDiff = ADC_DIFFERENTIAL_ENDED; // 配置为差分输入 sConfig.OffsetNumber = ADC_OFFSET_NONE; // 无偏移校正 sConfig.Offset = 0; // 偏移值为0 sConfig.OffsetSignedSaturation = DISABLE; // 禁用偏移值饱和处理 if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /** 按序为其他通道配置参数 * 每次更改通道号和序列编号,其余参数保持一致。 */ sConfig.Channel = ADC_CHANNEL_4; sConfig.Rank = ADC_REGULAR_RANK_2; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } sConfig.Channel = ADC_CHANNEL_5; sConfig.Rank = ADC_REGULAR_RANK_3; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } sConfig.Channel = ADC_CHANNEL_10; sConfig.Rank = ADC_REGULAR_RANK_4; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } sConfig.Channel = ADC_CHANNEL_14; sConfig.Rank = ADC_REGULAR_RANK_5; sConfig.SingleDiff = ADC_SINGLE_ENDED; // 改为单端输入 if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } sConfig.Channel = ADC_CHANNEL_15; sConfig.Rank = ADC_REGULAR_RANK_6; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } sConfig.Channel = ADC_CHANNEL_18; sConfig.Rank = ADC_REGULAR_RANK_7; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } sConfig.Channel = ADC_CHANNEL_19; sConfig.Rank = ADC_REGULAR_RANK_8; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /* 用户代码部分:ADC1初始化结束 2 */ /* 用户代码部分:ADC1初始化结束 */ }
2、配置DMA
3、开启DMA转换数据到数组

/* USER CODE BEGIN Header_StartDefaultTask */ #define ADC_BUFFER_SIZE 8 // 定义ADC采样缓冲区的大小,与规则通道数量一致 uint32_t adc_buffer[ADC_BUFFER_SIZE]; // 定义用于存储ADC采样结果的缓冲区 /** * @brief Function implementing the defaultTask thread. * 该函数实现了默认任务线程。 * @param argument: Not used * 参数 argument 未使用。 * @retval None */ /* USER CODE END Header_StartDefaultTask */ void StartDefaultTask(void const * argument) { /* USER CODE BEGIN StartDefaultTask */ /* 初始化部分 */ // 启动ADC的DMA传输模式,将采样结果存入adc_buffer中 // 参数说明: // - &hadc1:指向ADC1的句柄 // - adc_buffer:存储ADC采样结果的缓冲区 // - ADC_BUFFER_SIZE:缓冲区大小,与规则通道数量一致 HAL_ADC_Start_DMA(&hadc1, adc_buffer, ADC_BUFFER_SIZE); /* 无限循环部分 */ for(;;) { // 切换LED的状态,用于指示任务正在运行 HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); // 延迟200毫秒 osDelay(200); } /* USER CODE END StartDefaultTask */ }
4、调试结果
5、计算ADC转换频率
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」