SXUstudent 2025-06-03 15:31 采纳率: 50%
浏览 16

stm32双adc规则同步遇到的问题

看野火关于adc方面的规则同步例程时,自己用cubemx生成类似程序来完成相同功能,cubemx中设置了adc1、adc2、uart1。

img


在屡次试验后,main.c中的程序如下:

img


在while循环中,1s后停止adc1和adc2进行读取数组中的数据,但是野火的源码中并没有这两句停止的代码,而我去掉这两句会使串口不断闪过好多内容(读数是正确的),像是没有了hal_delay的限制一样。

img


代码文件如下(基于f429开发板)
包含库的源码:链接: https://pan.baidu.com/s/1TUmMnRmw690XFsP-UOhb1g?pwd=tfpg 提取码: tfpg
不含库的源码:https://moker.lanzout.com/ilQqJ2xxtmpa

  • 写回答

6条回答 默认 最新

  • 阿里嘎多学长 2025-06-03 15:32
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    问题解答

    你遇到的问题是关于STM32双ADC规则同步的,使用Cubemx生成的程序,但是在main.c中遇到了问题。

    根据你提供的信息,问题可能是关于ADC1和ADC2的规则同步问题。在while循环中,你可能使用了1s的延迟,但是仍然遇到了问题。

    为了解决这个问题,我建议你检查ADC1和ADC2的配置是否正确,确保它们的 clock source 和 trigger source 是正确的。同时,也可以检查ADC1和ADC2的 conversion complete interrupt 是否正确地被触发。

    以下是一个简单的示例代码,用于ADC1和ADC2的规则同步:

    #include "stm32f4xx_hal.h"
    
    int main(void) {
        // ADC1和ADC2的配置
        ADC_HandleTypeDef hadc1;
        ADC_HandleTypeDef hadc2;
    
        // ADC1和ADC2的 clock source 和 trigger source 配置
        hadc1.Instance = ADC1;
        hadc1.Init.ClockPrescaler = ADC_CKID_DIV1;
        hadc1.Init.Resolution = ADC_12BIT;
        hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
        hadc1.Init.ContinuousConvMode = ADC_CONTINUOUS_CONV;
        hadc1.Init.DiscontinuousConvMode = ADC_DISCONTINUOUS_CONV;
        hadc1.Init.NbrOfConversion = 1;
        hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
        hadc1.Init.NbrOfSubSeq = 1;
        HAL_ADC_Init(&hadc1);
    
        hadc2.Instance = ADC2;
        hadc2.Init.ClockPrescaler = ADC_CKID_DIV1;
        hadc2.Init.Resolution = ADC_12BIT;
        hadc2.Init.ScanConvMode = ADC_SCAN_DISABLE;
        hadc2.Init.ContinuousConvMode = ADC_CONTINUOUS_CONV;
        hadc2.Init.DiscontinuousConvMode = ADC_DISCONTINUOUS_CONV;
        hadc2.Init.NbrOfConversion = 1;
        hadc2.Init.DataAlign = ADC_DATAALIGN_RIGHT;
        hadc2.Init.NbrOfSubSeq = 1;
        HAL_ADC_Init(&hadc2);
    
        // ADC1和ADC2的 conversion complete interrupt 配置
        HAL_ADCEx_Calibration_Start(&hadc1);
        HAL_ADCEx_Calibration_Start(&hadc2);
    
        while (1) {
            // ADC1和ADC2的 conversion
            HAL_ADC_Start(&hadc1);
            HAL_ADC_Start(&hadc2);
    
            // 等待 conversion 完成
            while (!HAL_ADC_GetState(&hadc1) && !HAL_ADC_GetState(&hadc2)) {
                // do nothing
            }
    
            // 读取 ADC1 和 ADC2 的数据
            uint16_t adc1_data = HAL_ADC_GetValue(&hadc1);
            uint16_t adc2_data = HAL_ADC_GetValue(&hadc2);
    
            // 处理 ADC1 和 ADC2 的数据
            // ...
        }
    }
    

    这个示例代码中,ADC1和ADC2的配置和 conversion complete interrupt 配置都被正确地设置了。在while循环中,ADC1和ADC2的 conversion 被启动,然后等待 conversion 完成后,读取 ADC1 和 ADC2 的数据。

    如果你仍然遇到了问题,可以提供更多的信息和代码,我将尽力帮助你解决问题。

    评论

报告相同问题?

问题事件

  • 创建了问题 6月3日