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,否则程序发生紊乱
}
[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,否则程序发生紊乱
}
相关文章推荐
- STM32F407系统时钟配置
- vue实现学生录入系统之添加删除功能
- 回发或回调参数无效。在配置中使用 或在页面中使用 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterF
- 在嵌入式系统添加邮件发送功能---支持带SSL的GMAIL邮箱
- Win 2003系统传真功能的配置及使用
- SUSE linux 修改系统启动顺序,共享windows文件和配置无线上网功能
- 配置时间同步并将系统时间写入硬件时钟和配yum
- U-Boot-2010.06添加烧写yaffs根文件系统功能
- C8051F340系统时钟配置
- 配置 JobhistoryServer 历史服务器,日志聚集功能,HDFS 文件系统用户权限检查,取消HDFS警告提示
- STM32学习笔记2-系统时钟知识及程序配置
- 在app未开启时,实现对用户进行通知提醒功能总结(添加事件到手机系统日历并设置闹钟提醒)
- ESB v6.6 关于“应用系统中增加账号及密码配置后,对应服务调用时允许进行账号及密码认证功能”
- 为android系统添加USB AUDIO设备的放音和录音功能
- 关于 Slackware 9.1.0 系统配置防火墙和NAT功能的配置说明
- android monitor tool (8.0 监控文件系统 添加哪个进程修改文件功能)
- u-boot与uClinux下系统时钟和波特率配置文件
- 学习下stm32 配置 HSI作为系统时钟,但意义不大,一般不这样做!
- Android 4.1.2系统添加重启功能
- 系统负载均衡功能配置