你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103配置系统时钟的代码【寄存器篇】

[复制链接]
Dylan疾风闪电 发布时间:2018-8-9 14:12
本帖最后由 Dylan疾风闪电 于 2018-8-9 15:39 编辑

使用举例:配置72MHZ时钟作为系统时钟#define SystemClockMHz        72//MHZ

HW_SystemClockMux(USE_EXTERNAL_HSE, SystemClockMHz) ;
HW_SystemClockMux(USE_INTERNAL_HSI, SystemClockMHz);



---------------------------------------------------------------------------------------------
代码已验证。发个帖子,便于自己移植使用。


  1. /* Const to source of high speed clock:internal or external. */
  2. #define        USE_EXTERNAL_HSE                                                0
  3. #define        USE_INTERNAL_HSI                                                1
  4. /**
  5.   * <b>配製系統主時鐘頻率。</b>
  6.   * <p>功能:選擇時鐘源,并進行PLL倍頻。
  7.   * @param  osc   高速時鐘源的選擇。
  8.   *            @arg USE_EXTERNAL_HSE: 外部高速晶振
  9.   *            @arg USE_INTERNAL_HSI: 內部高速晶振
  10.   * @param  maxFreq 芯片最大主频?M,查询对应的数据手册
  11.   * @return         osc
  12.   * @version                2.0.0.0(20160407)
  13.   * <p-2014>实现CM0与CM3兼容完成!
  14.         * <p-2016>對字符串/單詞進行變更。
  15.   * @author             Dylan
  16.   */
  17. uint8_t HW_SystemClockMux(uint8_t osc, uint8_t maxFreq)
  18. {
  19. #if defined (STM32F100) || defined (STM32F101) || defined (STM32F103)
  20.         uint8_t errCode = 0xff;
  21.         uint32_t sTimeCount, sTimeMax = 0xFFF;
  22. #endif
  23.         
  24.   HW_SystemPowerON();
  25.   
  26.         switch(osc)
  27.         {
  28.                 case USE_EXTERNAL_HSE:
  29. #if defined (STM32F100) || defined (STM32F101) || defined (STM32F103)
  30.                         RCC->CR |= 1<<16;       //HSEON
  31.                
  32.                         sTimeCount = sTimeMax;
  33.                         while(((RCC->CR>>17) & 0x1) == 0) //等待HSE就绪
  34.                         {
  35.                                 if (sTimeCount--) return errCode;
  36.                         }
  37.                         
  38.                         RCC->CFGR |= (maxFreq/8-2)<<18; //设置PLL值倍频//HSE 8MHz
  39.                         
  40.                         RCC->CFGR |= 1<<16; //切换PLL输入时钟源为0->1:HSI/2(4MHz)->HSE(8MHz)
  41.                         
  42.                         //存在等待状态时,必须先开启预取缓冲区
  43.                         if (maxFreq <= 24)
  44.                                 FLASH->ACR |= 0x30;//000:零等待状态,当 0 < SYSCLK ≤ 24MHz
  45.                         else if (maxFreq <= 48)
  46.                                 FLASH->ACR |= 0x31;//001:一个等待状态,当 24MHz < SYSCLK ≤ 48MHz
  47.                         else
  48.                                 FLASH->ACR |= 0x32;//010:两个等待状态,当 48MHz < SYSCLK ≤ 72MHz
  49.                         
  50.                         RCC->CR |= 1<<24;                   //PLLON
  51.                         
  52.                         sTimeCount = sTimeMax;
  53.                         while(((RCC->CR>>25) & 0x1) == 0)  //等待PLL就绪
  54.                         {
  55.                                 if (sTimeCount--) return errCode;
  56.                         }
  57.                         
  58.                         RCC->CFGR |= 0x2;                   //PLL作为sysClk
  59.                         
  60.                         sTimeCount = sTimeMax;
  61.                         while(((RCC->CFGR>>2) & 0x3) != 0x02)  //等待sysClk就绪
  62.                         {
  63.                                 if (sTimeCount--) return errCode;
  64.                         }
  65. #elif defined  (STM32F051) || defined  (STM32F042) //none
  66. #else
  67.                 #warning "Make sure needn't define STM32Fxxx etc. ?"
  68. #endif
  69.                         break;
  70.                 default:                //case USE_INTERNAL_HSI:
  71.                         RCC->CFGR &= 0xFFFEFFFF; //HSI 8MHz/2
  72.                         RCC->CFGR |= ((maxFreq>>2)-2)<<18; //设置PLL值倍频
  73.                         
  74.                         //存在等待状态时,必须先开启预取缓冲区
  75.                         if (maxFreq <= 24)
  76.                                 FLASH->ACR |= 0x30;//000:零等待状态,当 0 < SYSCLK ≤ 24MHz
  77.                         else if (maxFreq <= 48)
  78.                                 FLASH->ACR |= 0x31;//001:一个等待状态,当 24MHz < SYSCLK ≤ 48MHz
  79.                         else
  80.                                 FLASH->ACR |= 0x32;//010:两个等待状态,当 48MHz < SYSCLK ≤ 72MHz
  81.                         
  82.                         RCC->CR |= 1<<24;                   //PLLON
  83.                         while(((RCC->CR>>25) & 0x1) != 1);  //等待PLL就绪
  84.                         RCC->CFGR |= 0x2;                   //PLL作为sysClk
  85.                         while(((RCC->CFGR>>2)&0x3) != 0x02);  //等待sysClk就绪
  86.                         break;
  87.         }
  88.         
  89.         return 0;
  90. }

  91. /**
  92.   * <b>芯片上电默认时钟配置。</b>
  93.   * <p>功能:用来恢复时钟系统到上电默认状态。
  94.   * @version                1.1.0.0(20140228)
  95.   * <p-2014>实现CM0与CM3兼容完成!
  96.   * @author             Dylan
  97.   */
  98. void HW_SystemPowerON(void)
  99. {
  100. #if defined  (STM32F051) || defined  (STM32F042)
  101.         RCC->CR |= 0x00000001;//HSION

  102.         RCC->CR &= 0x0202FFFF;/* Reset HSEON, CSSON and PLLON, HSEBYP bit */

  103.         RCC->CFGR &= 0x0000000C;/* Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE and MCOSEL[2:0],PLLSRC, PLLXTPRE and PLLMUL[3:0] bits */

  104.         RCC->CFGR2 &= 0x00000000;/* Reset PREDIV1[3:0] bits *///与CFGR[17]一起用作HSE-PLL设置

  105.         RCC->CFGR3 &= 0x00000000;/* Reset USARTSW[1:0], I2CSW, CECSW and ADCSW bits */

  106.         RCC->CR2 &= 0xFFFFFFFE;/* Reset HSI14 bit */

  107.         RCC->CIR = 0x00000000;/* Disable all interrupts */

  108. #elif defined (STM32F100) || defined (STM32F101) || defined (STM32F103)
  109.         RCC->CR &= 0x0000FF83;//把HSI调整到8MHz±1%==》开启HSI==》等待就绪

  110.         RCC->CFGR = 0x00000400;//限制APB1时钟是HCLK_Div2

  111.         RCC->CIR = 0x00BF0000;//清除所有的RCC中断标志

  112.         //配置向量表
  113.         #ifdef  VECT_TAB_RAM
  114.         /* Set the Vector Table base location at 0x20000000 */
  115.         NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
  116.         #else  /* VECT_TAB_FLASH  */
  117.         /* Set the Vector Table base location at 0x08000000 */
  118.         NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
  119.         #endif
  120. #else
  121.         #warning "Make sure needn't define STM32F051 etc. ?"
  122. #endif
  123. }
复制代码


收藏 评论1 发布时间:2018-8-9 14:12

举报

1个回答
ld8lk8-282408 回答时间:2018-9-5 08:51:24
不错

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版