BreakZodiacZykolime 2024-07-16 15:08 采纳率: 25%
浏览 4
已结题

关于#stm32#的问题:最近用hal库搞ADC+DMA,定时器3外部中断触发ADC,在用CubeMX配置时钟发现只有APB1 Prescaler与 APB2 Prescaler相同时ADC才采得到值

最近用hal库搞ADC+DMA,定时器3外部中断触发ADC,在用CubeMX配置时钟发现只有APB1 Prescaler与 APB2 Prescaler相同时ADC才采得到值,为什么?(芯片型号f407VET6)
具体配置如下图,将APB2 Prescaler改成“/1”ADC就采不到值

img

  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2024-07-16 15:09
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    STM32系列微控制器的时钟系统设计为多级分频,以适应不同的性能和功耗需求。APB1(Advanced Peripheral Bus 1)和APB2(Advanced Peripheral Bus 2)是连接微控制器核心和其他外设的总线,它们可以有不同的时钟频率。ADC(Analog-to-Digital Converter)通常连接在APB2总线上。

    问题解答:

    1. 为什么APB1和APB2的分频器必须相同时,ADC才能正常采集值?

      • 这可能是由于ADC的时钟需求。ADC的采样速率(Sample Rate)和转换时间(Conversion Time)受到其时钟频率的影响。如果APB1和APB2的时钟频率不匹配,可能会导致ADC的时钟不稳定,从而影响采样精度和转换时间。
      • 另外,DMA(Direct Memory Access)也可能受到APB时钟频率的影响,因为DMA传输速率需要与ADC的采样速率同步。
    2. 如何在CubeMX中正确配置时钟,以确保ADC可以正常工作,即使APB1和APB2的分频器设置不同?

      • 在CubeMX中,你需要确保ADC的时钟源是稳定的,并且满足ADC的最小时钟频率要求。如果APB1和APB2的分频器设置不同,你需要在代码中调整ADC的时钟配置,以适应不同的时钟频率。
      • 可以检查STM32F407的参考手册,了解ADC的时钟要求,并根据手册中的指导来配置时钟。
    3. 如果APB1和APB2的分频器设置不同,我应该如何编写代码来调整ADC的配置,以保证它能够正常工作?

      • 你需要在HAL库初始化代码中调整ADC的时钟配置。这通常涉及到设置ADC的时钟预分频器(Clock Prescaler)和周期(Clock Cycle)。
      • 例如,使用HAL库的HAL_ADC_Init()函数初始化ADC时,可以通过ADC_InitTypeDef结构体中的ClockPrescalerSampleTime字段来配置。

    时钟系统工作原理:

    • PLL(Phase-Locked Loop):用于生成系统时钟(SYSCLK),它可以从不同的时钟源(如HSE、HSI等)获取输入,并产生一个稳定的时钟频率。
    • AHB(Advanced High-performance Bus):连接CPU和其他高速外设。
    • APB1和APB2:连接低速外设,它们的时钟频率是AHB时钟频率的分频。

    参考手册和HAL库:

    • 参考手册中会有详细的时钟树(Clock Tree)描述和ADC时钟要求。
    • HAL库提供了一系列的函数来配置和初始化ADC,包括时钟设置。

    代码示例:

    ADC_HandleTypeDef hadc1;
    ADC_ChannelConfTypeDef sConfig;
    
    // 初始化ADC
    HAL_ADC_Init(&hadc1);
    
    // 配置ADC通道
    sConfig.Channel = ADC_CHANNEL_1; // 根据需要选择通道
    sConfig.Rank = 1; // 根据需要设置
    sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES; // 根据需要设置采样时间
    
    // 根据APB2的时钟频率调整ClockPrescaler
    if (APB2_PRESCALER != APB1_PRESCALER) {
        // 计算并设置ADC时钟预分频器
        hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2; // 根据实际时钟频率调整
    }
    
    HAL_ADC_ConfigChannel(&hadc1, &sConfig);
    

    请注意,具体的时钟配置和代码示例需要根据你的具体硬件配置和需求进行调整。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月16日
  • 创建了问题 7月16日

悬赏问题

  • ¥15 slaris 系统断电后,重新开机后一直自动重启
  • ¥15 51寻迹小车定点寻迹
  • ¥15 谁能帮我看看这拒稿理由啥意思啊阿啊
  • ¥15 关于vue2中methods使用call修改this指向的问题
  • ¥15 idea自动补全键位冲突
  • ¥15 请教一下写代码,代码好难
  • ¥15 iis10中如何阻止别人网站重定向到我的网站
  • ¥15 滑块验证码移动速度不一致问题
  • ¥15 Utunbu中vscode下cern root工作台中写的程序root的头文件无法包含
  • ¥15 麒麟V10桌面版SP1如何配置bonding