刚接触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,或上后面的值应该是一样的啊。为什么或运算就不行,直接赋值就正常呢?
一周热门 更多>