STM32L011K4 时钟树分析和常规配置(主要时钟配置)

/ 0评 / 0

偷一张来自Cube的图,这样比较容易理解.Nucleo板子没提供外部时钟输入,所以,实际上也是这张图一样.

通过HSI的倍频设置,得到32MHz的时钟,也是系统支持的最高时钟,这是低功耗器件,所以不支持48MHz?
针对这个MCU我觉得应该有几个常规配置,这样是最节省.
第一种是32MHz,由HSI16经过PLL产生,最低倍数就是4倍,然后固定二分频.Vcore = 1.8V,需要1个Flash读取延迟,快速配置代码如下:
(LSE DEAFULT,LSI DEFAULT,MSI OFF,HSI ON,PLL ON,SYSCLK = 32MHz,CK_PWR = FCLK = HCLK = SysTick = APB1 = APB2 = 32MHz.)

MODIFY_REG(PWR->CR, PWR_CR_VOS, (PWR_REGULATOR_VOLTAGE_SCALE1));
MODIFY_REG(RCC->CR, RCC_CR_HSION | RCC_CR_HSIDIVEN , RCC_HSI_ON);
while(READ_BIT(RCC->CR, RCC_CR_HSIRDY) == RESET);
MODIFY_REG(RCC->ICSCR, RCC_ICSCR_HSITRIM, (uint32_t)(16) << 8U);
CLEAR_BIT(RCC->CR, RCC_CR_PLLON);
while(READ_BIT(RCC->CR, RCC_CR_PLLRDY) != RESET);
MODIFY_REG(RCC->CFGR, RCC_CFGR_PLLMUL | RCC_CFGR_PLLDIV | RCC_CFGR_PLLSRC, (uint32_t)((RCC_PLLMUL_4) | (RCC_PLLDIV_2) | (RCC_PLLSOURCE_HSI)));
SET_BIT(RCC->CR, RCC_CR_PLLON);
while(READ_BIT(RCC->CR, RCC_CR_PLLRDY) == RESET);
MODIFY_REG(FLASH->ACR, FLASH_ACR_LATENCY, (uint32_t)(FLASH_LATENCY_1));
MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, RCC_SYSCLK_DIV1);
MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, RCC_SYSCLKSOURCE_PLLCLK);
while ((uint32_t)(RCC->CFGR &RCC_CFGR_SWS) != RCC_SYSCLKSOURCE_STATUS_PLLCLK);
MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_HCLK_DIV1);
MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, ((RCC_HCLK_DIV1) << 3));
CLEAR_BIT(RCC->CR, RCC_CR_MSION);

第二种是16MHz,由HSI16驱动产生,Vcore = 1.5V,需要1个Flash读取延迟,快速配置代码如下:
(LSE DEAFULT,LSI DEFAULT,MSI OFF,HSI ON,PLL OFF,SYSCLK = 16MHz,CK_PWR = FCLK = HCLK = SysTick = APB1 = APB2 = 16MHz.)

MODIFY_REG(FLASH->ACR, FLASH_ACR_LATENCY, (uint32_t)(FLASH_LATENCY_1));
MODIFY_REG(PWR->CR, PWR_CR_VOS, (PWR_REGULATOR_VOLTAGE_SCALE2));
MODIFY_REG(RCC->ICSCR, RCC_ICSCR_HSITRIM, (uint32_t)(16) << 8U);
MODIFY_REG(RCC->CR, RCC_CR_HSION | RCC_CR_HSIDIVEN , RCC_HSI_ON);
while(READ_BIT(RCC->CR, RCC_CR_HSIRDY) == RESET);
MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, RCC_SYSCLK_DIV1);
MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, RCC_SYSCLKSOURCE_HSI);
MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_HCLK_DIV1);
MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, ((RCC_HCLK_DIV1) << 3));
CLEAR_BIT(RCC->CR, RCC_CR_MSION);

第三种是4.2MHz,由MSI最高频率驱动产生,此时功耗已经降低到uA级别, 而且没有Flash读取延迟,快速配置代码如下:
(LSE DEAFULT,LSI DEFAULT,MSI OFF,HSI ON,PLL OFF,SYSCLK = 4194304Hz,CK_PWR = FCLK = HCLK = SysTick = APB1 = APB2 = 4194304Hz.)

MODIFY_REG(PWR->CR, PWR_CR_VOS, (PWR_REGULATOR_VOLTAGE_SCALE3));
MODIFY_REG(RCC->ICSCR, RCC_ICSCR_MSIRANGE, (uint32_t)(RCC_MSIRANGE_6));
MODIFY_REG(RCC->ICSCR, RCC_ICSCR_MSITRIM, (uint32_t)(0) << 24U);
MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, RCC_SYSCLK_DIV1);
MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, RCC_SYSCLKSOURCE_MSI);
MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_HCLK_DIV1);
MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, ((RCC_HCLK_DIV1) << 3));

第四种是65kHz,由MSI最低频率驱动,而且处于最大分频.此时功耗已经降到几uA,也没有Flash读取延迟,速度极慢下保持CPU用,JTAG失效,快速配置代码如下:
(LSE DEAFULT,LSI DEFAULT,MSI OFF,HSI ON,PLL OFF,SYSCLK = SysTick = 128Hz,CK_PWR = FCLK = HCLK  = APB1 = APB2 = 8Hz.)

MODIFY_REG(PWR->CR, PWR_CR_VOS, (PWR_REGULATOR_VOLTAGE_SCALE1));
MODIFY_REG(RCC->ICSCR, RCC_ICSCR_MSIRANGE, (uint32_t)(RCC_MSIRANGE_0));
MODIFY_REG(RCC->ICSCR, RCC_ICSCR_MSITRIM, (uint32_t)(0) << 24U);
MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, RCC_CFGR_HPRE_DIV512);
MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, RCC_SYSCLKSOURCE_MSI);
MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_CFGR_PPRE1_DIV16);
MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, ((RCC_CFGR_PPRE1_DIV16) << 3));

接下来RTC时钟,也就是板载的X1,这是32.768kHz的.可以提供给RTC使用,这个器件没有VBAT引脚,但是本身功耗就不高.另外比较可惜,这还是两个IO.

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注