• STM32单片机如何使用内部晶振


    STM32F030F4P6,uVision开发环境为例,注意了,若使用其它相近芯片,本文仅供参考

    引用请注明出处:https://www.cnblogs.com/beiyhs/p/11211691.html

    //***********************************************************************************   北有寒山  ***********************

            1、打开项目,查看startup_stm32f0xx.s或startup_stm32f030.s; 启动时是调用SystemInit函数     

                

                       

        找到system_stm32f0xx.c并打开查看SystemInit函数,里面又调用了SetSysClock()

                           

       2、还在该文件内往下找到找到static void SetSysClock(void)函数;

           

       3、用以下代码拷贝粘贴替换SetSysClock(void)函数:

           static void SetSysClock(void)

          {
             __IO uint32_t StartUpCounter = 0, HSIStatus = 0; 

            RCC->CR &= ~((uint32_t)RCC_CR_HSEON);                                     //关闭外部时钟 
             RCC->CR |= ((uint32_t)RCC_CR_HSION);                                                  //使能内部时钟 HSI
           do                                                                                                                    //等待内部时钟起振
               {
                HSIStatus = RCC->CR & RCC_CR_HSIRDY;                                              // 设置RCC
                StartUpCounter++;                                                                                         //启动计数器
                }
           while((HSIStatus== 0) && (StartUpCounter != HSI_STARTUP_TIMEOUT));  // 等待 HSE 启动稳定

           if ((RCC->CR & RCC_CR_HSIRDY) != RESET)                                             //判断启动状态
               {
                HSIStatus = (uint32_t)0x01;
               }
           else
               {
                 HSIStatus = (uint32_t)0x00;                                                                       //启动不成功
                }

           if (HSIStatus == (uint32_t)0x01) //启动成功
               {
                /* Enable Prefetch Buffer and set Flash Latency */
               FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;      //flash总线时钟使能

               /* HCLK = SYSCLK */      //AHB总线时钟HCLK(是系统时钟SYSCLK经过AHB分频器分频后得到的时钟,

                                                       //一般设置1分频,HCLK=SYSSCLK=48MHz; 

               RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;    //AHB总线时钟  HCLK = SYSCLK/1=48MHz

               /* PCLK = HCLK */         //APB总线时钟PCLK等于AHB总线时钟/1   PCLK=HCLK/1
               RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;                    // PCLK=HCLK/1=48M/1=48M

               /* PLL configuration = HSI/2 * 12= 48 MHz */
               RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL));
               RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI_Div2 | RCC_CFGR_PLLMULL12);   

                                                                                                                        //RC时钟2分频后 进行12倍频
                                                                                                                        //=8M/2*12=48M
               RCC->CR |= RCC_CR_PLLON;                                                      //使能锁相环倍频开关 /* Enable PLL */

               while((RCC->CR & RCC_CR_PLLRDY) == 0)                                //等待锁相环就绪
                       { }

               /* Select PLL as system clock source * /                                           //选择锁相环输出时钟作为系统时钟
               RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
               RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;

               while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)
                        { }                                                                                          //等待锁相环输出时钟已经成为系统时钟
                }
             else
                   { }                                                                                              //启动失败,在此写代码
           }

    4、 存盘重编译一下就OK啦,是不是嗖易Z,小伙伴们看明白了吗? 

    5、过程重新捋一遍:内部8M的RC时钟/2=4M,然后12倍频=4*12=48M, AHB输出48M给AHB总线, APB输

          出48M给APB外设、ADC、串口、倍频器后各个TIM用。

    6、系统时钟SYSCLK经AHB分频后叫HCLK,HCLK经APB分频后叫PCLK。需要关注的是,查看

         STM32F030F4P6的2019版datasheet,芯片内部没有APB1,只有APB,其它相似芯片是有APB1的。所以

         使用固件库只用到RCC_CFGR_PPRE_DIV1而没有RCC_CFGR_PPRE1_DIV1。

          DIV1是APB不分频,DIV2是2分频,然后直接给倍频器再进各个TIM。

          如果在APB内是DIV1,后面的倍频器不倍频直接进各个TIM使用。

          如果在APB内是DIV2、4、8、16,则分频后还要在后面的倍频器乘以2再进各个TIM使用。

          嗯,有点绕,琢磨一下吧。

     7、注意:RCC->CR &= ~((uint32_t)RCC_CR_HSEON);  这句是关闭外部时钟,关闭后,原来连接外部晶振

           的PF0、PF1方可作为普通IO口使用。

  • 相关阅读:
    # 漏洞挖掘技巧清单 #
    CVE-2020-0796——SMBV3客户端/服务端远程代码执行漏洞(远程代码执行+权限提升)
    SSH公钥详细介绍及拓展
    滑动窗口(数据结构)
    反素数解析
    树状数组的基本操作
    Rochambeau POJ
    一般图最大匹配
    2020牛客暑期多校训练营(第一场)H Minimum-cost Flow
    A Bug's Life POJ
  • 原文地址:https://www.cnblogs.com/beiyhs/p/11211691.html
Copyright © 2020-2023  润新知