关于时钟初始化的问题请教

2019-07-20 11:23发布

刚接触STM32,用407探索者板子做SYSTICK试验,写了个简单的延时程序。遇到个问题百思不得其解,特来请教老鸟。我是从AVR转过来的,对库函数一堆的英文头大,就直接对照数据手册操作的寄存器,所以程序看着很乱。请各位看官多包涵。
#include <stm32f4xx.h>
void System_Init(void)
{   
       RCC ->CR |= 1<<16;                                               //打开HSE
        while(!(RCC ->CR & 0X00020000));                                //等待HSE时钟稳定
         PWR -> CR |= 0X00004000;                                        // 电源模式1
        RCC -> CFGR |=(0<<4) | (1<<15) | (1<<12) | (1<<10);             // 设置 AHB不分频,APB1,APB2 总线时钟分频系数
        RCC -> CR &= ~(1<<24);                                          
        RCC -> PLLCFGR |=(1<<22) | (1<<14) | (1<<12) | (1<<10) | (1<<3); //设置选择PLL时钟源为HSE.和分频系数,M=8,N=336,P=2;
        RCC -> CR |= (1<<24);                                          //打开PLL
        while(!(RCC -> CR&0X02000000));                               //等待PLL系统时钟稳定
        FLASH ->ACR =0X00000705;
        RCC -> CFGR&=~(3<<0);
        RCC -> CFGR |= (1<<1);                                         // 选择SW,PLL为系统时钟来源
        while(!(RCC->CFGR&0X00000008));
}        
void delay_us(u32 us)
{
        SysTick ->LOAD =0;
        SysTick ->LOAD =us*21;
        SysTick ->VAL =0;
        SysTick ->CTRL &=~ (1<<2);
        SysTick ->CTRL |= 1<<0;
        while(!(SysTick ->CTRL&0x00010000));
        SysTick ->CTRL &= ~(1<<0);
        SysTick ->VAL=0;
}


运行结果测试延时不准确,多了差不多一倍,比如延时50us, 其结果就有将近100us
问题:红 {MOD}高亮那一句如果改为RCC -> PLLCFGR =(1<<22) | (1<<14) | (1<<12) | (1<<10) | (1<<3);则延时时间就十分准确。
就是把|= 换成 = 就正常了。请问这是为什么? C中或运算比如,temp=100, temp = (1<<0); 结果是1,如果是temp |= (1<<0) 那结果就是101;那么RCC -> PLLCFGR初始复位值是0,或上后面的值应该是一样的啊。为什么或运算就不行,直接赋值就正常呢?

0条回答

一周热门 更多>