纬图虚拟仪器论坛

 找回密码
 立即注册
搜索
查看: 5785|回复: 1

SystemInit()函数都替我们做了一些什么?

[复制链接]
发表于 2012-9-22 00:55:00 | 显示全部楼层 |阅读模式
本帖最后由 chou_robin 于 2012-9-22 01:07 编辑

     用库开发STM32的大神们肯定都用过这样的函数SystemInit().但是它为我们做了一些什么呢?
今天把借来的开发板上的外部高速晶振(25M)换成了8M。然后我试着下载了一个原来的程序,发现正常运行。于是便开始了对SystemInit()函数的思考。
   这个是函数的原型:
void SystemInit (void)
{
  /* Reset the RCC clock configuration to the default reset state(for debug purpose) */
  /* Set HSION bit */
  RCC->CR |= (uint32_t)0x00000001;
  /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */
#ifndef STM32F10X_CL
  RCC->CFGR &= (uint32_t)0xF8FF0000;
#else
  RCC->CFGR &= (uint32_t)0xF0FF0000;
#endif /* STM32F10X_CL */   
  
  /* Reset HSEON, CSSON and PLLON bits */
  RCC->CR &= (uint32_t)0xFEF6FFFF;
  /* Reset HSEBYP bit */
  RCC->CR &= (uint32_t)0xFFFBFFFF;
  /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */
  RCC->CFGR &= (uint32_t)0xFF80FFFF;
#ifndef STM32F10X_CL
  /* Disable all interrupts and clear pending bits  */
  RCC->CIR = 0x009F0000;
#else
  /* Reset PLL2ON and PLL3ON bits */
  RCC->CR &= (uint32_t)0xEBFFFFFF;
  /* Disable all interrupts and clear pending bits  */
  RCC->CIR = 0x00FF0000;
  /* Reset CFGR2 register */
  RCC->CFGR2 = 0x00000000;
#endif /* STM32F10X_CL */
   
  /* Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers */
  /* Configure the Flash Latency cycles and enable prefetch buffer */
  SetSysClock();
}
其实这个函数还看不出来到底是怎样设置主频的。关键在SetSysClock();
static void SetSysClock(void)
{
#ifdef SYSCLK_FREQ_HSE
  SetSysClockToHSE();
#elif defined SYSCLK_FREQ_24MHz
  SetSysClockTo24();
#elif defined SYSCLK_FREQ_36MHz
  SetSysClockTo36();
#elif defined SYSCLK_FREQ_48MHz
  SetSysClockTo48();
#elif defined SYSCLK_FREQ_56MHz
  SetSysClockTo56();  
#elif defined SYSCLK_FREQ_72MHz
  SetSysClockTo72();                                         //我设置的就是这个
#endif

/* If none of the define above is enabled, the HSI is used as System clock
    source (default after reset) */
}
在SetSysClockTo72();函数中可以发现实际上这个里面配置的是内部的8M振荡器,然后经过锁相环得到72M。
呵呵,打这里,于是疑问也就消失了。
同时,也让我明白了为什么在直接配置systeminit()时候的串口程序发送的时候易出现乱码(内部振荡器不稳定的原因)。

以上均是个人的想法,有误之处还请大家多多指正。
回复

使用道具 举报

发表于 2012-9-22 19:30:59 | 显示全部楼层
说得很对,一般自己设计电路晶振如果和默认的不一样的话修改下systeminit()函数就可以了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|纬图虚拟仪器

GMT+8, 2024-12-26 00:57 , Processed in 0.294508 second(s), 14 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表