如何在STM32CubeIDE中创建数组并填充ADC采集的LDR值(STM32L476G)
实现LDR ADC采集值存入数组的方案
1. 定义ADC采集数组
在你的/*User Begin PV*/和/*User End PV*/区间添加数组定义(全局变量便于DMA直接访问):
/*User Begin PV*/ #define ADC_LDR_BUFFER_SIZE 10 // 可根据需求调整数组长度 uint16_t adc_ldr_buffer[ADC_LDR_BUFFER_SIZE] = {0}; // 存储LDR采集值的数组 uint16_t value_DAC = 0;uint16_t value_ADC =0;uint32_t state_DAC = 0; /*User End PV*/
2. 修改ADC DMA启动配置
将原单值采集逻辑改为数组批量采集,若需要持续循环填充数组,需确保DMA配置为循环模式:
/*User Begin 2*/ HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED); // Calibrate ADC // 调整DMA启动参数,指向数组首地址,传输长度设为数组大小 HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_ldr_buffer, ADC_LDR_BUFFER_SIZE); // 前置配置:在STM32CubeMX中找到对应ADC的DMA通道,将Mode设为Circular(循环模式) // 若仅需单次采集一轮数组,保持Normal模式即可 HAL_DAC_Start(&hdac1, DAC_CHANNEL_2); // Start the DAC /*User End 2*/
3. 处理DMA采集完成回调
当DMA完成一轮数组填充后,会触发HAL_ADC_ConvCpltCallback函数,可在此对采集到的LDR数据做后续处理:
/*User Begin 4*/ void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) { if(hadc->Instance == ADC1) { // 此时adc_ldr_buffer已存满LDR的采集值 // 示例:计算数组平均值 uint32_t sum = 0; for(int i=0; i<ADC_LDR_BUFFER_SIZE; i++) { sum += adc_ldr_buffer[i]; } uint16_t avg_value = sum / ADC_LDR_BUFFER_SIZE; // 可添加自定义业务逻辑,比如将平均值输出到DAC value_DAC = avg_value; HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_2, DAC_ALIGN_12B_R, value_DAC); } } /*User End 4*/
核心注意事项
- DMA模式:循环模式下,DMA会自动重复填充数组;正常模式下仅完成一轮采集后停止。
- 内存增量:确保CubeMX中DMA配置开启
Memory Increment(默认开启),否则DMA会一直覆盖数组第一个元素。 - 数据类型匹配:ADC为12位采集,
uint16_t类型刚好适配,无需额外类型转换。
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

