STM32F407系统时钟配置是否添加FPU功能

来源:互联网 发布:淘宝卖家参加聚划算 编辑:程序博客网 时间:2024/05/21 04:24
Cortex-M4的指令集分两部分,一部分是在M3的指令集外增加了一些扩展功能。另一部就是用于FPU单元的单精度浮点运算指令。这部分指令都是用V-开头的汇编指令,仅在FPU功能被使能时使用。
需要注意的是FPU单元是指的芯片上的一个独立于CPU处理的浮点运算单元,整个单元在大多数厂家的芯片中都是可以被使能和关闭的。相对于芯片,编译器也设置了相应的FPU功能开启/关闭的选项,在编译时需要告诉编译器是否开启FPU功能。编译器一旦开启FPU功能,在处理单精度浮点运算的语句时就会用带V-开头的汇编指令进行编译。如果编译器使能了FPU功能,而芯片未开启FPU单元,程序运行到浮点语句时就会出现异常。相反,如果编译器未使能FPU功能,芯片即使开启了FPU单元,程序还是会按照未使能FPU的代码进行处理。
  所以:在配置系统时钟时,一定先看下咱们Keil软件是否已经配置使用FOU功能:如图1:

那么:我们在系统时钟初始化时,需要添加SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));
如果没有配置:如图2:

就不需要配置上述语句。
使用配置代码如下:
//系统时钟初始化
/*
HSE(25M) -- M(25) -- PLL(vco)(1M) -- *N(336)(336M) -- /P(2) -- PLLCLK(168M)
-- SYSCLK(168M)  -- AHB(1)(168M) -- APB1(4) -- 42M
                                    APB2(2) -- 84M
*/
void SystemInit1(void)
{
//    SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));
    //1.打开HSE和HSI(备用)
    RCC->CR |= (1<<16);
    //2.等待HSE开启稳定
    while((RCC->CR &(1<<17))==0);
    //3.HSE作为PLL时钟输入源
    RCC->PLLCFGR = 0;
    RCC->PLLCFGR |= (1<<22);
    //4.M分频 25分频
    RCC->PLLCFGR |= (25UL<<0);
    //5.PLL倍频  N倍频
    RCC->PLLCFGR |= (336UL<<6);
    //6.VCO分频 P分频(PLLCLK) == 2
    RCC->PLLCFGR &= ~(0x3<<16);
    //7.VCO分频 Q分频(PLL48CK) == 7
    RCC->PLLCFGR |= (7UL<<24);
    //8.启动PLL
    RCC->CR |= (1<<24);
    //9.等待PLL时钟稳定
    while((RCC->CR &(1<<25))==0);
   
    RCC->CFGR = 0;
    //11.配置AHB时钟 -- 不分频
    RCC->CFGR &= ~(0xf<<4);
    //12.APB1 APB2时钟
    RCC->CFGR |= (5UL<<10);//APB1 -- 42MHz
    RCC->CFGR |= (4UL<<13);//PAB2 -- 84MHz
    //13.FLASH接口与CPU时钟对应
    FLASH->ACR  = 0;
    FLASH->ACR |= (5UL<<0);  //周期为5
    FLASH->ACR |= (1<<8)|(1<<9)|(1<<10);
    //10.配置SYSCLK为PLLCLK
    RCC->CFGR |= (2UL<<0);    //最后把PLLCLK配置为SYSCLK,否则程序发生紊乱
}
原创粉丝点击