STM32 HSE 不稳定频率

问题描述

我正在尝试从 HSE 以 80mhz 的频率运行我的 Nucleo f401re

int F4xxx::clockInit(int pllM,int pllN,int pllP,int pllQ)
{
    enableHse();

    //FLASH
    CLEAR_BIT(FLASH->ACR,FLASH_ACR_PrftEN);
    FLASH->ACR&= ~FLASH_ACR_LATENCY;
    FLASH->ACR |= FLASH_ACR_LATENCY_5WS | FLASH_ACR_ICEN | FLASH_ACR_DCEN|FLASH_ACR_PrftEN;

    //set HSE as PLL source
    RCC->PLLCFGR = RCC_PLLCFGR_PLLSRC_HSE;
    //
    RCC->CR &= ~(RCC_CR_PLLON); //disable PLL before changes
    //

    RCC->PLLCFGR = pllM|(pllN<<6)|(((pllP>>1)-1)<<16)|RCC_PLLCFGR_PLLSRC_HSE|(pllQ<<24);
    RCC->CR|=RCC_CR_PLLON;
    while(!(RCC->CR&RCC_CR_PLLRDY));

    RCC->CFGR &= ~(RCC_CFGR_HPRE);  //Prescaler 1
    RCC->CFGR |= RCC_CFGR_HPRE_DIV1; //AHB = SYSCLK/1


    //APB2 Prescaler 2
    RCC->CFGR &= ~(RCC_CFGR_PPRE2);
    RCC->CFGR |= RCC_CFGR_PPRE2_DIV1;  //APB2 /1

    RCC->CFGR &= ~(RCC_CFGR_PPRE1);
    RCC->CFGR|=RCC_CFGR_PPRE1_DIV1; // APB1 /2

    RCC->CFGR &= ~RCC_CFGR_SW; // reset SW0,SW1.
    RCC->CFGR |= RCC_CFGR_SW_PLL;
    RCC->CR|=RCC_CR_PLLON;

    while((RCC->CFGR & RCC_CFGR_SWS)!=RCC_CFGR_SWS_PLL); // wait for switching to PLL (while PLL is not used as system clock)

    // for power saving
    RCC->CR &= ~(RCC_CR_HSION);

    return 0;
}

void F4xxx::enableHse()
{
    // for control MCO2 (PC9): (freq=SYSCLK/5)
    RCC->AHB1ENR|=RCC_AHB1ENR_GPIOCEN;
    GPIOC->MODER&=~GPIO_MODER_MODE9;
    GPIOC->MODER|=GPIO_MODER_MODE9_1;
    GPIOC->OSPEEDR|=GPIO_OSPEEDER_OSPEEDR9;
    RCC->CFGR|=RCC_CFGR_MCO2PRE;

    RCC->CR |= (RCC_CR_HSEON); //Enable HSE
    while( !(RCC->CR & RCC_CR_HSERDY) ) {}; //ready to start HSE
}

然后像这样调用它:

f4.clockInit(8,336,2,7);

但是我的逻辑分析仪显示频率不稳定

enter image description here

level=1 的峰宽^-1 = 16 mhz 但 level=0 的峰宽^-1 = 8 mhz 和 5.33 mhz

什么会导致如此不稳定的频率?

解决方法

如果我没记错的话,您的逻辑分析仪屏幕截图来自 Saleae 软件。除非您拥有使用 USB 3 的最新型号之一,否则我猜您的采样频率最大限制为 24 MHz。基于 FX2 的廉价克隆也是这种情况。基本上,您需要 USB 3 OR 内部缓冲存储器 OR 能够对减少的通道数量进行采样,例如 3 个左右,以便以高于 24 MHz 的速度进行采样。

您没有告诉您的采样频率,但根据可用信息,我假设它限制为 24 MHz。奈奎斯特采样定理指出,您需要以比测量的信号快至少 2 倍的速度进行采样。因此,对于 16 MHz 信号,您至少需要 32 MHz 的采样率。在较低的采样频率下,您会观察到一种称为混叠的现象,您测量的信号似乎具有较低的频率。

请记住,32 MHz 是理论上的最小值,您仍然可能(并且可能会)观察到信号中的失真。对于模拟信号,通常使用 x10 或 x20 采样率。对于您测量的数字信号,x4 可能没问题。

不久前,我不得不使用 Saleae 克隆来调试 USB 全速总线 (12 MHz)。使用 24 MHz 采样率有时有效,有时无效。当它没有时,我按下按钮并再次尝试我的机会......

所以,您可能根本没有问题。由于设备的限制,您无法正确测量您的信号。当您重复测量时,您可能会不时遇到相同的采样问题。