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

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,否则程序发生紊乱
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值