This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

大家好,有个关于stm32RCC配置的问题想请教一下大家,谢谢各位

学了stm32一阵子,知道了有两种方法设置时钟。一个是用systemInit(),里面打包好了rcc设置的东西,另外一种途径就是使用st提供的各种RCC函数,一个个rcc寄存器去操作。两种方法最终目的都一样。但这两种方法当中,都有对中断向量表进行配置的语句

#ifdef  VECT_TAB_RAM

  MY_NVIC_SetVectorTable(0x20000000, 0x0);

#else  

  MY_NVIC_SetVectorTable(0x08000000,0x0);

#endif

}

以及

#ifdef VECT_TAB_SRAM

  SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET

#else

  SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET;

#endif

因此我假定对这个中断向量表的操作在正常启动和配置rcc时钟的过程中是必须的。

但今天下午看了一网友自己写的RCC配置函数:(我黏贴上来)

ErrorStatus HSEStartUpStatus;
RCC_DeInit();

RCC_HSEConfig(RCC_HSE_ON);
HSEStartUpStatus = RCC_WaitForHSEStartUp();

if(HSEStartUpStatus == SUCCESS)
{
RCC_HCLKConfig(RCC_SYSCLK_Div1);

RCC_PCLK2Config(RCC_HCLK_Div1);   

    RCC_PCLK1Config(RCC_HCLK_Div2);

    RCC_ADCCLKConfig(RCC_PCLK2_Div4);

    FLASH_SetLatency(FLASH_Latency_2); //flash操作的延时 //Flash 2 wait state
  FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);      
  RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

    RCC_PLLCmd(ENABLE);

    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)        {
}
  RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

while(RCC_GetSYSCLKSource() != 0x08) {
}
}

大家看一下,这里面并没有任何语句提到向量表的配置,那这程序好使吗?我个人的理解,有些人是先调用systemInit再进行自己写的RCC函数进行二次时钟配置,那这样我可以理解,因为在systemInit里面已经将vector table给配置好了,接下来再二次修改RCC各寄存器的时候,不去理会也没事。但是如果他压根就没有调用systemInit呢?压根没有调用systemInit的情况下,他的时钟配置function里面也不出现向量表配置的操作,那就可以理解为他没有配置过向量表。。这样的话这程序应该就不好使了。。。或者要在这段程序里面把配置中断向量表的语句给加上才可以了。我想知道我这样的理解有没有错啊,如果有的话恳请各位告诉我错在哪了。小弟在此谢谢大家了。

Parents

  • Jonny,你好

        系统启动复位时,会自动调用systemInit。这部分是在Reset_Handler中进行的,在startup_stm32fxxxx.s文件中可以找到这部分代码(路径:Drivers\CMSIS\Device\ST\STM32Fxxx\Source\Templates\arm\)。

        Capture.PNG

        所以只要你不去修改这部分代码,systemInit肯定会被调用到的。

    Amanda

Reply

  • Jonny,你好

        系统启动复位时,会自动调用systemInit。这部分是在Reset_Handler中进行的,在startup_stm32fxxxx.s文件中可以找到这部分代码(路径:Drivers\CMSIS\Device\ST\STM32Fxxx\Source\Templates\arm\)。

        Capture.PNG

        所以只要你不去修改这部分代码,systemInit肯定会被调用到的。

    Amanda

Children