1.关于时钟系统的配置
2018-01-02 22:46
141 查看
系统时钟是很重要的一部分 作为最小系统的一部分(时钟 复位 电源)开始学习单片机前是必须了解的一个环节 此内容主要针对于想更改任意时钟的情况,不限定死时钟一定要是168Mhz频率,so? 写寄存器至少要包含三个重要的系统文件 1.启动文件 startup_stm32f407xx.s 2 系统文件 system_stm32f4xx.c(.h文件就是关于.c的一些声明) 3.头文件 stm32f4xx.h 简单关于这三个文件的介绍 1.启动文件写的都是汇编,简单看下,刚开始大致就是一些堆栈之类的初始化, 分配空间地址之类的,然后调用Systeminit()函数,调用之前首先得进入 system_stm32f4xx.c 函数,也就是到目前为止,这两个文件都必须需要 2.关于system_stm32f4xx.c (V2.6.1) 这个文件,最重要的东西都在这里面,而且注释写的也很清楚, 接下来简单谈下这个文件 开头是条件编译 到底是 HSE还是 HSI然后是两个函数 Systeminit()函数和SystemCoreClockUpdate()函数 还有一个SystemCoreClock变量,SystemCoreClock这个变量就是系统时钟,也就是说下面给这个变量赋值就相当于 配置系统时钟,然后看第一个比较重要的函数。Systeminit()这个函数就相当于Deinit配置时钟需要用到的 大部分寄存器,但是有一点,这个函数开头是选择了HSI的也就是说,系统时钟默认是HSI->16Mhz,所以如果你 想自己去配置时钟的话,就不需要在去初始化了,因为调用了启动文件,然后启动文件会自动调用这个函数, 然后就是另一个函数了,看注释和函数大概能看懂是什么意思,配置PLL,但是得看前提,tmp变量的来源是 tmp = RCC->CFGR & RCC_CFGR_SWS; 这两个寄存器,也就是说还得重新配置RCC寄存器。 3.这个头文件里面都是些寄存器,如果不包含,第二个文件会报错,因为第二个文件调用了此头文件里面的一些东西, 然后就是,没了,如果需要找寄存器,直接来里面找就行了。 总之就是如果你想配置时钟,只需要自己再写个函数就行了,只需按以下步骤来 1.初始化 2.开启HSE 3.等待HSE稳定 4.设置AHB,APB1,APB2 5.配置PLL (M,N,P,Q参数) /************************************************************************************/ 此步骤设置MNPQ参数时需注意一定要同时设置MNPQ //Attention ! The N value between 192 and 432 !!! //PLL proportion N M P Q #if CLK_168 //168MHZ Only in this case can enable OTG(clock must be 48M) RCC->PLLCFGR = (336<<6) | (8<<0) | (0<<16) | (0<<17) | (7<<24); //PLL_N 336 #elif CLK_160 //160MHZ RCC->PLLCFGR = (320<<6) | (8<<0) | (0<<16) | (0<<17) | (7<<24); //PLL_N 320 #elif CLK_80 //80MHZ RCC->PLLCFGR = (160<<6) | (8<<0) | (0<<16) | (0<<17) | (7<<24); //PLL_N 160 #elif CLK_72 //72MHZ RCC->PLLCFGR = (144<<6) | (8<<0) | (0<<16) | (0<<17) | (7<<24); //PLL_N 144 #endif //<CLK_168> 而不是 RCC->PLLCFGR |= 336<<6; //N 336 RCC->PLLCFGR |= 8<<0; //M 8 RCC->PLLCFGR &= ~(3<<16); //P 2 RCC->PLLCFGR |= 7<<24; //Q 7 实践证明 下面分开设置是存在BUG的,只能按上面那样设置 还有 设置延时函数时,不能直接获取NMPQ的值,实践证明,直接获取值存在BUG #if CLK_168 //168MHZ SysTick->LOAD = num * 168 / 8 ; //Reload #elif CLK_160 //160MHZ SysTick->LOAD = num * 160 / 8 ; //Reload #elif CLK_80 //80MHZ SysTick->LOAD = num * 80 / 8 ; a93c //Reload #elif CLK_72 //72MHZ SysTick->LOAD = num * 72 / 8 ; //Reload #endif //<CLK_168> /************************************************************************************/ 6.打开PLL 7.等待PLL稳定 8.选择PLL作为系统时钟 9.等待系统时钟稳定 然后配置完成 翻译成对应的寄存器就行了 记得把接口留出来 HSE 8MHZ N M P Q AHB APB2 APB1 parameter : 168MHZ 168 4 2 4 1 2 4 parameter : 160MHZ 160 4 2 4 1 2 4 parameter : 80MHZ 80 4 2 4 1 2 2 parameter : 72MHZ 72 4 2 4 1 2 2 So just modify the N parameter what you want.Ensuring M and P parameter steady;S
相关文章推荐
- 关于 Slackware 9.1.0 系统配置防火墙和NAT功能的配置说明
- 关于全志A20的Ubuntu12.04 64位系统下环境配置及编译过程笔记【转】
- 关于remoting的系统配置问题
- 关于centos6.8系统 做raid5自动挂载 samba服务配置遇到的问题
- 关于Ribbon 2.1 的系统配置使用
- uboot优美代码赏析3:系统时钟配置
- 430单片机时钟系统与复位系统的配置(1)
- uboot优美代码赏析3:系统时钟配置
- 关于在omapl138上跑BIOS系统的CLK配置部分学习。
- STM32 时钟 系统时钟 配置 与 时钟树解析
- 关于在mac系统上开发web的配置-PHP
- Tlelechips 8925的时钟系统配置
- STM32 HAL 库学习笔记之-------(系统时钟配置)
- 关于全志A20的Ubuntu12.04 64位系统下环境配置及编译过程笔记
- 关于Win8及以上系统配置wamp的总结。(转帖)
- 关于Ubuntu 13.04 64位系统配置Android SDK环境变量的问题
- 430单片机时钟系统与复位系统的配置(2)
- 关于PC机相关系统的远程桌面协作的相关介绍和配置(转帖整理)
- 重要说明:关于个推SDK Android 5.0的系统配置更新
- 关于电脑误删摸个配置文件导致系统异常的解决方法(知道误删的什么文件)