如何使用stm32f103 内部高速时钟作为系统时钟?

使用stm32f103 内部高速时钟作为系统时钟?
我没有使用PLL锁相环,在进行LED灯闪烁时发现只要使能了GPIO口,和对应引脚,LED就会亮为什么?

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
使用STM32F103内部高速时钟作为系统时钟的步骤如下:

  1. 配置系统时钟源为内部高速时钟(HSI)。

    在RCC寄存器中,将SW位设置为0,将SWS位设置为1,以选择HSI作为系统时钟源。

  2. 等待HSI稳定。

    在RCC寄存器中,检查HSIRDY位是否为1,以确保HSI稳定并可用。

  3. 配置AHB时钟分频器。

    在RCC寄存器中,将HPRE位设置为0,即使用不分频的AHB时钟。

  4. 配置APB1时钟分频器。

    在RCC寄存器中,将PPRE1位设置为0,即使用不分频的APB1时钟。

  5. 配置APB2时钟分频器。

    在RCC寄存器中,将PPRE2位设置为0,即使用不分频的APB2时钟。

在以上步骤完成后,系统时钟就会被配置为HSI,并且AHB、APB1和APB2时钟都将与系统时钟相同。下面是相应的代码示例:

#include "stm32f10x.h"

int main(void)
{
    // 使能GPIOC时钟
    RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;
    
    // 配置PC13引脚为输出
    GPIOC->CRH &= ~GPIO_CRH_MODE13;  // 清零MODE13位
    GPIOC->CRH |= GPIO_CRH_MODE13_0; // 设置MODE13位为01,输出模式,最大输出速率2MHz
    
    // 配置系统时钟源为HSI
    RCC->CR |= RCC_CR_HSION; // 使能HSI
    while ((RCC->CR & RCC_CR_HSIRDY) == 0); // 等待HSI稳定
    RCC->CFGR &= ~RCC_CFGR_SW; // 选择HSI作为系统时钟源
    RCC->CFGR |= RCC_CFGR_SWS_HSI;
    while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_HSI); // 等待系统时钟源切换完成
    
    // 配置时钟分频器为不分频
    RCC->CFGR &= ~RCC_CFGR_HPRE;
    RCC->CFGR &= ~RCC_CFGR_PPRE1;
    RCC->CFGR &= ~RCC_CFGR_PPRE2;
    
    while (1)
    {
        GPIOC->BSRR |= GPIO_BSRR_BS13; // PC13引脚输出高电平
        for (int i = 0; i < 1000000; i++); // 延时
        GPIOC->BSRR |= GPIO_BSRR_BR13; // PC13引脚输出低电平
        for (int i = 0; i < 1000000; i++); // 延时
    }
}

在以上的代码中,我们通过配置GPIOC的CRH寄存器来将PC13引脚配置为输出模式。然后,我们使用RCC寄存器将系统时钟源配置为HSI,并将时钟分频器配置为不分频。之后,我们使用GPIOC的BSRR寄存器来控制PC13引脚的电平,从而实现LED灯的闪烁。

在上面的代码中,我们通过配置GPIOC的CRH寄存器来将PC13引脚配置为输出模式,然后使用GPIOC的BSRR寄存器来控制PC13引脚的电平,从而实现LED灯的闪烁。具体来说,程序会不断地将PC13引脚输出高电平,然后延时一段时间后再将其输出低电平,再延时一段时间,如此循环,就可以实现LED灯的闪烁。

因此,如果一切正常,LED灯应该会以一定的频率闪烁,即每隔一段时间亮一次,然后暗一次。如果LED灯没有闪烁,或者闪烁频率过快或过慢,可能是由于时钟分频器配置不正确或延时时间不合适导致的。需要对时钟分频器和延时时间进行调整,以使LED灯能够按照预期的频率闪烁。

需要注意的是,如果使用不分频的时钟,系统时钟将非常快,因此需要适当增加延时时间,以确保LED灯的闪烁频率不会太快,从而使LED灯的亮度过低。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢