关于STM32F103和107里,如果设置25MHZ?

发布: 2010-1-29 13:05 | 作者: win2000_li | 来源: StmFans思蜕盟 OPELC 自由电子联盟

各位老师,我在用STM32F107,为了做以太网,把外部晶体做成了25MHZ

在程序我如何设置呢?????

请指点>>>>>>>>>>>>
win2000_li (2010-1-29 13:10:04)
不好意思!!
网速有点慢,一不小心发了两贴,请管理帮删一个吧...

谢谢........
eddy0317 (2010-1-29 16:47:25)
如果你用的是STM32的3.0以上的库,啥都不用设置。因为使用CL系列的时候,默认的晶振就是25MHz,反而你用其他的时候需要设置。如果你用的是F103,那么就要修改了。
修改stm32f10x.h里面的HSE_Value,注意,是修改#define HSE_Value    ((uint32_t)8000000)这个。而且,不能使用Set_System来配置,需要自己写配置时钟的函数。具体写法参考2.0库的demo。这个地方算是3.0库我最讨厌的地方了。
binglin (2010-1-29 16:52:22)

QUOTE:

不好意思!!
网速有点慢,一不小心发了两贴,请管理帮删一个吧...

谢谢........
win2000_li 发表于 2010-1-29 13:10
我已删了另一个重复的主题了.
binglin (2010-1-29 16:53:00)
同意3楼eddy0317的意见.
win2000_li (2010-1-29 17:07:55)
[i=s] 本帖最后由 win2000_li 于 2010-1-29 17:23 编辑

非常eddy0317 回复,谢谢!!!!!!

我用的是3.0的库,但是你说的那个CL系列是什么呢???

刚刚接触,有很多不懂的地方.....

还有您所说的3.0以上,不包括3.0吗?????

如果不包括3.0,要自已动手写吗???
eddy0317 (2010-1-29 17:23:16)
CL就是互联型,也就是F105跟F107。注意,设备的define记得要修改,STM32F10X_CL就是F105和F107用的。F103那些就按容量,选择STM32F10X_LD,STM32F10X_MD和STM32F10X_HD
binglin (2010-1-29 17:24:10)
3.x.x标准库里面的Setup目录里:


截图04.jpg

eddy0317 (2010-1-29 17:34:41)
包括3.0,像binglin老大说的。那些startup文件都有。记得这样要对应好。
发一个2.0demo里面的RCC设置函数上来吧:
/*******************************************************************************
* Function Name  : RCC_Configuration
* Description    : Configures the different system clocks.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void RCC_Configuration(void)
{   
  /* RCC system reset(for debug purpose) */
  RCC_DeInit();

  /* Enable HSE */
  RCC_HSEConfig(RCC_HSE_ON);

  /* Wait till HSE is ready */
  HSEStartUpStatus = RCC_WaitForHSEStartUp();

  if(HSEStartUpStatus == SUCCESS)
  {
    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

    /* Flash 2 wait state */
    FLASH_SetLatency(FLASH_Latency_2);
       
    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1);
  
    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1);

    /* PCLK1 = HCLK/2 */
    RCC_PCLK1Config(RCC_HCLK_Div2);

    /* PLLCLK = 8MHz * 9 = 72 MHz */
   //修改这里,因为你的是25MHz晶振,不能超过72MHz的,所以不能乘以9
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
    /* Enable PLL */
    RCC_PLLCmd(ENABLE);

    /* Wait till PLL is ready */
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }

    /* Select PLL as system clock source */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    /* Wait till PLL is used as system clock source */
    while(RCC_GetSYSCLKSource() != 0x08)
    {
    }
  }

/* Enable peripheral clocks --------------------------------------------------*/
  /* GPIOA Periph clock enable */
  //RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  /* DAC Periph clock enable */
  //RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
  /* TIM2 Periph clock enable */
  //RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
}
binglin (2010-1-29 19:37:39)
如果是用3.0库也是很简单的,直接修改工程配置文件就可以了,以IAR为例,修改如下图:


截图18.jpg



由stm32f10x.h文件就可以找到用STM32F10X_CL时外部晶振频率的设置项,它默认就是用25MHz的晶振频率。

#if !defined  HSE_Value
#ifdef STM32F10X_CL   
  #define HSE_Value    ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */
#else
  #define HSE_Value    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
#endif /* STM32F10X_CL */
#endif /* HSE_Value */

另:一般来说如果没有什么特别的需要,建议别修改stm32f10x.h的内容,最好直接在IAR的配置里选用STM32F10X_LD、STM32F10X_MD、STM32F10X_HD或STM32F10X_CL。
win2000_li (2010-1-29 21:17:52)
非常感谢两位的答复,学习。。。。。。。。。。。。。

谢谢!!!
eddy0317 (2010-1-30 10:34:56)
没办法,如果使用的是F103,而晶振是25MHz的话,必须修改。当然,也可以不修改stm32f10x.h的。stm32f10x.h那里已经说得很清楚,在编译器那里,如binglin老大的IAR那里,添加一个HSE_Value的数值定义就可以了。MDK方法一样。

而RCC配置,就需要自己写了。因为库都是按LD,MD,HD使用8MHz,CL使用25MHz来初始化的。