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