您的位置:首页 > 其它

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  stm32 时钟 寄存器