学了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
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET;
因此我假定对这个中断向量表的操作在正常启动和配置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里面也不出现向量表配置的操作,那就可以理解为他没有配置过向量表。。这样的话这程序应该就不好使了。。。或者要在这段程序里面把配置中断向量表的语句给加上才可以了。我想知道我这样的理解有没有错啊,如果有的话恳请各位告诉我错在哪了。小弟在此谢谢大家了。
Hi 宋斌,
我现在才接触这块芯片没多久,我学习单片机的时候是学51的,他俩差别挺大的。造成了现在不时都会有理解上的疑惑,我去别的论坛上提问,大多数得到的回复就是:别管为什么,照用就行了。我个人认为作为一个工科学生,是一定要追问为什么的。我现在先把一些基础的东西学到手,然后自己打算做一个用2.4G无线模块进行通信的实验,我是广州的,离深圳近,买电子元器件挺快就到了。祝你工作生活愉快。
非常好,如果你能把问题的原因分析清楚的话,我想你的基础会很扎实,今后也有更多的机会能够触类旁通,把理论和实际应用结合起来,比纯靠经验有价值的多,方法很正确。也祝你学业进步