Nucleo-F411RE (STM32F411)LL库体验 2 -sysclk的配置

本文详细介绍了如何使用STM32F411RE的LL库来配置系统时钟,包括通过HSE+PLL和HSI+PLL设置100MHz的工作主频,以及不使用PLL时的HSE和HSI直接供电情况,同时提到了AHB、APB1和APB2的时钟分频设置。
摘要由CSDN通过智能技术生成

Nucleo-F411RE (STM32F411)LL库体验 2 -sysclk的配置

1、Nucleo-F411RE 时钟源

Nucleo-F411RE开发版只有一个8M的晶振,看起来像是给st-link提供时钟的,所以猜测F411RE时钟的来源应该来自st-link(stm32F103c8t6)的mco输出。
在这里插入图片描述
mco输出频率为8M。
HSI频率为16M。

2、设置工作主频100M

a、采用HSE+PLL

假设mco输入频率8M,经过PLLM,4分频变成2M。然后经过PLLN,倍频100,变成200M,那么再经过
PLLP 2分频就可变成100M的时钟频率。
如果工作频率80M,那么就修改倍频80即可。
LL库代码如下:

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_HSE_PLL_100M_Config(void)
{  
    LL_FLASH_SetLatency(LL_FLASH_LATENCY_3);
    while(LL_FLASH_GetLatency()!= LL_FLASH_LATENCY_3)
    {
    }
    LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE1);
    // while (LL_PWR_IsActiveFlag_VOS() == 0)
    // {
    // }
    LL_RCC_HSE_EnableBypass();
    LL_RCC_HSE_Enable();

    /* Wait till HSE is ready */
    while(LL_RCC_HSE_IsReady() != 1)
    {

    }
    LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSE, LL_RCC_PLLM_DIV_4, 100, LL_RCC_PLLP_DIV_2);
    LL_RCC_PLL_Enable();

    /* Wait till PLL is ready */
    while(LL_RCC_PLL_IsReady() != 1)
    {

    }
    LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1);
    LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_2);
    LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1);
    LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL);

    /* Wait till System clock is ready */
    while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL)
    {

    }
    LL_Init1msTick(100000000);
    LL_SetSystemCoreClock(100000000);
    LL_RCC_SetTIMPrescaler(LL_RCC_TIM_PRESCALER_TWICE);
}

b、采用HSI+PLL的方式

HSI的频率为16M,假设经过PLLM 8分频变成2M,经过PLLN 100倍频变成200M,经过PLLP 2分频即可得到100M的工作频率。
如果想要设定80M工作频率,修改倍频80倍即可。
代码如下:

/**
 * HSI + PLL 100M
*/
void SystemClock_HSI_PLL_100M_Config(void)
{
    LL_FLASH_SetLatency(LL_FLASH_LATENCY_3);
    while(LL_FLASH_GetLatency()!= LL_FLASH_LATENCY_3)
    {
    }
    LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE1);
    // while (LL_PWR_IsActiveFlag_VOS() == 0)
    // {
    // }
    LL_RCC_HSI_SetCalibTrimming(16);
    LL_RCC_HSI_Enable();

    /* Wait till HSI is ready */
    while(LL_RCC_HSI_IsReady() != 1)
    {

    }
    LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSI, LL_RCC_PLLM_DIV_8, 100, LL_RCC_PLLP_DIV_2);
    LL_RCC_PLL_Enable();

    /* Wait till PLL is ready */
    while(LL_RCC_PLL_IsReady() != 1)
    {

    }
    LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1);
    LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_2);
    LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1);
    LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL);

    /* Wait till System clock is ready */
    while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL)
    {

    }
    LL_Init1msTick(100000000);
    LL_SetSystemCoreClock(100000000);
    LL_RCC_SetTIMPrescaler(LL_RCC_TIM_PRESCALER_TWICE);
}

3、不使用锁频环PLL

a、HSE最高8M工作主频

LL库设定代码如下:

/**
 * HSE提供信号,不经过pll倍频
*/
void SystemClock_HSE_8M_Config(void)
{
    LL_FLASH_SetLatency(LL_FLASH_LATENCY_0);
    while(LL_FLASH_GetLatency()!= LL_FLASH_LATENCY_0)
    {
    }
    LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE1);
    // while (LL_PWR_IsActiveFlag_VOS() == 0)
    // {
    // }
    LL_RCC_HSE_EnableBypass();
    LL_RCC_HSE_Enable();

    /* Wait till HSE is ready */
    while(LL_RCC_HSE_IsReady() != 1)
    {

    }
    LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1);
    LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_2);
    LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1);
    LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_HSE);

    /* Wait till System clock is ready */
    while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_HSE)
    {

    }
    LL_Init1msTick(8000000);
    LL_SetSystemCoreClock(8000000);
    LL_RCC_SetTIMPrescaler(LL_RCC_TIM_PRESCALER_TWICE);
}

b、HSL最高16M工作主频

LL库设定代码如下:

/**
 * HSI提供信号,不经过pll倍频
*/
void SystemClock_HSI_16M_Config(void)
{
    LL_FLASH_SetLatency(LL_FLASH_LATENCY_0);
    while(LL_FLASH_GetLatency()!= LL_FLASH_LATENCY_0)
    {
    }
    LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE1);
    // while (LL_PWR_IsActiveFlag_VOS() == 0)
    // {
    // }
    LL_RCC_HSI_SetCalibTrimming(16);
    LL_RCC_HSI_Enable();

    /* Wait till HSI is ready */
    while(LL_RCC_HSI_IsReady() != 1)
    {

    }
    LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1);
    LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_2);
    LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1);
    LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_HSI);

    /* Wait till System clock is ready */
    while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_HSI)
    {

    }
    LL_Init1msTick(16000000);
    LL_SetSystemCoreClock(16000000);
    LL_RCC_SetTIMPrescaler(LL_RCC_TIM_PRESCALER_TWICE);
}

4、AHB APB1 APB2时钟

设定AHB不分频
APB1 2分频
APB2不分频
在这里插入图片描述
假定输入100M,那么APB=sysclk=100M,APB1=PLCK1 = 50M,APB2=PLK2=100M

5、获取各部分时钟

在这里插入图片描述

6、打印信息

在这里插入图片描述

7、 代码

代码下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值