Stm32时钟分析
到这一步,经过分析得知,RCC->
RCC->
RCC->
RCC->
RCC->
RCC->
配置这个向量表有什么用?相见cortexm3权威指南113页向量表的解释
这里
#define NVIC_VectTab_RAM
#define NVIC_VectTab_FLASH
Offset的值为0x0,为偏移地址,地址必须能被64 * 4 = 256整除,具体请看权威手册113页
SCB->VTOR = NVIC_VectTab|(Offset & (u32)0x1FFFFF80);//设置NVIC的向量表偏移寄存器。
既然是设置NVIC的向量表偏移量,为什么还要和NVIC_VectTab相或呢。只设置OFFSET不就可以了吗,另外VTOR设置只有BIT有作用啊,相或以后也放不下这么多位吧?
这个是基址。
那个7~28的,你能定义一个28位的数据出来嘛?
VTOR设置只有BIT,你把(u32)0x1FFFFF80二进制看看是不是。
然后再看下面一段话:
地址必须能被64*4=256整除,从而合法的起始地址可以是:0x0, 0x100, 0x200等。
答案:cortex-m3权威指南上介绍
下面我们回到例说stm32这本书61页的Stm32_Clock_Init()函数:
经过上面配置完毕后,下面开始配置外部时钟。
Ministm32开发板目前的实都是采用高速外部时钟作为时钟源,在经过MYRCC_Deinit()先将外部时钟源关闭,然后在cfgr重新配置之后,下面就准备开启高速外部时钟。
(11)
(12)
While(!(RCC->CR>>17));
对此,原子哥也说了写成(RCC-CR>>17)&0X01比较合适,但我感觉RCC-CR>>17是不准确的,比方说如果第十八位是1,那么右移17位后不管时钟是否就绪,表达式“RCC-CR>>17”的结果始终为真,这样while(!(RCC-CR>>17))不就没有意义了吗?所以写成(RCC-CR>>17)&0X01才是最准确的
)
(13)
RCC->CFGR = 0x00000400;
(14)
PLL -=2;
RCC->CFGR = PLL <18;
设置PLL 9倍频
这里还涉及到了一个问题,如下
其实,这里今天林妹妹问了一个比较专业的问题,那就是PLL是一个u8的数据类型,为什么在这里可以右移18位呢?不是早超出了么?其实,我们看看汇编代码就明白了,汇编代码如下: 219: RCC->CFGR|=PLL<18; //设置PLL值
(15)
//具体见《STM32闪存编程》
(16)
RCC->CR|=0x01000000;
(17)
while(!((RCC->CR>>25)&0x01));
(18)
RCC->CFGR |= 0x00000002;
(19)
Unsigned char Temp = 0;
While(Temp!=0x02)
{
}
其实这段代码就是判断SWS,等待系统时钟成功转为PLL时钟。
结合上面的分析已经明了STM32时钟一个始终配置过程,主要流程图如下:
其实个人感觉不用想mini32中自带例程配置有一些没有必要,所以自己改动了一些,发现
Stm32时钟分 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)