打印

stm32利用库函数 时钟配置问题

[复制链接]
8557|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我是1514|  楼主 | 2012-3-18 23:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
利用3.5版本的库函数是不是直接不用配置时钟啊,在main函数之前,系统自动把时钟给配置好了,main函数中直接不用写SystemInit()函数,要用什么外设就直接打开相关的外设的时钟就可以了,是这样的吗?球高手指点啊!!!!
沙发
我是1514|  楼主 | 2012-3-19 12:12 | 只看该作者
没人顶啊,自己来!!!

使用特权

评论回复
板凳
梅花望青竹| | 2012-3-19 13:48 | 只看该作者
这是别人说的一种答案,具体我也没有研究过
SystemInit()函数在主程序中被RCC_Configuration()函数调用,完成系统时钟的配置功能。我看过这个函数的具体内容,是直接操作寄存器来完成配置。如果使用stm32f10x_rcc.c文件中的函数来完成时钟配置,和SystemInit()的顺序和效果一样。

当然,为了保证兼容性,使低版本固件库写的程序运行,就还有stm32f10x_rcc.c存在,像早期版本的RCC_Configuration()函数就是使用这个文件中提供的函数来完成时钟配置的。

是的,Systeminit()函数完成了时钟初始化的功能。另外systick的使用也变简单了,以前要几个函数完成初始化,现在只要一个就行。

你看看3.0版本固件system_stm32f10x.c中的代码是怎样的吧。其中是对RCC寄存器直接赋值操作,和stm32f10x_rcc.c中相关的函数作用一样。

如果在程序中要使用端口、外设等,由于这些东西需要时钟才能工作,所以还是需要stm32f10x_rcc.c中的函数来完成时钟的控制。

使用特权

评论回复
地板
我是1514|  楼主 | 2012-3-19 22:42 | 只看该作者
我仔细看过相关的函数,就是systeminit()函数,发现时钟确实配置好,而且在main函数执行之前就配置好了,在以后写程序直接配置使用到的外设的时钟就可以了,只是我是菜鸟,不是很确定,想找个高手确认一下而已,呵呵!!!!

使用特权

评论回复
5
李富贵| | 2012-3-19 22:54 | 只看该作者
你要是用HSE,3.x的固件库确实不用配,但是用HSI做主时钟就悲剧了,此时我一般删除中断向量表里面对SystemInit的调用,自己写RCC_Configuration.

使用特权

评论回复
6
我是1514|  楼主 | 2012-3-20 12:07 | 只看该作者
HSI不是说不准确吗?也就是外部晶振失效时才会切换到HSI!!!

使用特权

评论回复
7
momingwei| | 2013-11-28 11:18 | 只看该作者
李富贵 发表于 2012-3-19 22:54
你要是用HSE,3.x的固件库确实不用配,但是用HSI做主时钟就悲剧了,此时我一般删除中断向量表里面对SystemI ...

3.x的固件库在启动文件里直接就调用了SystemInit()而这个函数默认使用的就是外部时钟,我要使用内部时钟应该去哪里修改
ps :我已经自己写了RCC_Configuration()如下,但是 启动后调试单步执行 还是直接进入SystemInit

void RCC_Configuration(void)
{
  RCC_DeInit();//将外设 RCC寄存器重设为缺省值

  RCC_HSICmd(ENABLE);//使能HSI  
  while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET)//等待HSI使能成功
  {
  }

  if(1)
  {
    //FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
    //FLASH_SetLatency(FLASH_Latency_2);
   
    RCC_HCLKConfig(RCC_SYSCLK_Div1);   
    RCC_PCLK1Config(RCC_HCLK_Div2);
    RCC_PCLK2Config(RCC_HCLK_Div1);
   
    //设置 PLL 时钟源及倍频系数
    RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_2);               
    //使能或者失能 PLL,这个参数可以取:ENABLE或者DISABLE
    RCC_PLLCmd(ENABLE);//如果PLL被用于系统时钟,那么它不能被失能
    //等待指定的 RCC 标志位设置成功 等待PLL初始化成功
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }

    //设置系统时钟(SYSCLK) 设置PLL为系统时钟源
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  
    //等待PLL成功用作于系统时钟的时钟源
    //  0x00:HSI 作为系统时钟
    //  0x04:HSE作为系统时钟
    //  0x08:PLL作为系统时钟  
    while(RCC_GetSYSCLKSource() != 0x08)
    {
    }
  }

使用特权

评论回复
8
vacky| | 2013-11-29 09:04 | 只看该作者
好像是在启动文件startup_stm32f4xx.s中调用SystemInit这个函数的

Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
        IMPORT  SystemInit
        IMPORT  __main

                 LDR     R0, =SystemInit
                 BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 ENDP                                                                                 

使用特权

评论回复
9
astudent| | 2015-1-19 00:28 | 只看该作者
李富贵 发表于 2012-3-19 22:54
你要是用HSE,3.x的固件库确实不用配,但是用HSI做主时钟就悲剧了,此时我一般删除中断向量表里面对SystemI ...

可以不用删除吧,未使用外部晶振的话,有超时处理。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

33

帖子

1

粉丝