学了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里面也不出现向量表配置的操作,那就可以理解为他没有配置过向量表。。这样的话这程序应该就不好使了。。。或者要在这段程序里面把配置中断向量表的语句给加上才可以了。我想知道我这样的理解有没有错啊,如果有的话恳请各位告诉我错在哪了。小弟在此谢谢大家了。
同意Song bin的说法,找一些实际的例子,动手做些实验,会有帮助。
知其然,还要知其所以然。这种学习方法也值得鼓励。
刚接触ARM的话,很多地方一开始确实理解有点困难。其实我倒建议不一定非要一下子把所有的东西都弄清楚,这样可能会让你陷入太多的问题,反而前进的速度太慢。
很多时候,我们会在做项目的过程中,一下子想通以前很久没明白的事情,这也是积累的过程。
如果你是初学的话,可以看一下ARM-CortexM3权威指南,理解ARM-Cortex-M的整个结构,存储器的映射,中断等内容。
再结合一款STM32芯片,具体的操作实验一下。
STM32的每个芯片系列都提供有有标准外设库和cube库
才发现ctrl+s,就自动回帖了。:)
STM32的每个芯片系列都有标准外设库,Cube库。每个外设在里面基本都能找到例程。你也可以参考这些例程来学习。
amanda_s讲的很有道理,我也学习了