奋斗的少年yyds 2023-04-21 16:21 采纳率: 0%
浏览 35
已结题

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

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

  • 写回答

1条回答 默认 最新

  • Leodong. 2023-04-21 16:56
    关注

    该回答通过自己思路及引用到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灯的亮度过低。


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

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月21日
  • 赞助了问题酬金15元 4月21日
  • 创建了问题 4月21日