您的位置:首页 > 其它

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

2017-07-19 14:20 507 查看
[align=left]Cortex-M4的指令集分两部分,一部分是在M3的指令集外增加了一些扩展功能。另一部就是用于FPU单元的单精度浮点运算指令。这部分指令都是用V-开头的汇编指令,仅在FPU功能被使能时使用。[/align]
[align=left]需要注意的是FPU单元是指的芯片上的一个独立于CPU处理的浮点运算单元,整个单元在大多数厂家的芯片中都是可以被使能和关闭的。相对于芯片,编译器也设置了相应的FPU功能开启/关闭的选项,在编译时需要告诉编译器是否开启FPU功能。编译器一旦开启FPU功能,在处理单精度浮点运算的语句时就会用带V-开头的汇编指令进行编译。如果编译器使能了FPU功能,而芯片未开启FPU单元,程序运行到浮点语句时就会出现异常。相反,如果编译器未使能FPU功能,芯片即使开启了FPU单元,程序还是会按照未使能FPU的代码进行处理。[/align]
[align=left]  所以:在配置系统时钟时,一定先看下咱们Keil软件是否已经配置使用FOU功能:如图1:[/align]
[align=left]
[/align]
[align=left]那么:我们在系统时钟初始化时,需要添加SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));[/align]
[align=left]如果没有配置:如图2:[/align]
[align=left]
[/align]
[align=left]就不需要配置上述语句。[/align]
[align=left]使用配置代码如下:[/align]
//系统时钟初始化

/*

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,否则程序发生紊乱

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐