STM32 HSE频率不稳定

STM32 HSE unstable frequency

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

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);

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

level=1 的峰宽度^-1 = 16 mhz 但是 level=0 的峰有 width^-1 = 8 mhz 和 5.33 mhz

频率不稳定的原因是什么?

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

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

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

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

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