打印

STM32F051应用笔记-系统时间选择及PLL倍频设置

[复制链接]
7474|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xx-mcu|  楼主 | 2012-7-26 12:05 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 xx-mcu 于 2012-7-26 16:27 编辑

这是小肖发的第二贴,不能能否给个“酷”,期待中。。。。
后续相继上传例程,小肖例程写的很用心当然“剽窃”官方是必须的:lol ,也自知老菜鸟能力有限,后期上传的例程如果写的不是很好的地方还望大伙指教指教。

/***********  分割线 ***********/
1、启动代码分析—SystemInit (void)系统时钟初始化
SystemInit (void)是系统初始化函数,很多新手不知其在何处调用,小肖马上为你解惑。
startup_stm32f0xx.s文件中汇编代码为STM32启动代码。
启动代码步骤一般为:
1)堆和栈的初始化;
2)向量表定义;
3)地址重映射及中断向量表的转移;
4)设置系统时钟频率;
5)中断寄存器的初始化;
6)进入主程序。
废话太多,估计也看烦了。现在挑重点讲,重点在第4个步骤。(第56一般编程时在用户代码中执行)。
Reset_Handler
PROC;
标记一个函数的开始,也就是复位入口。
IMPORT
__main ;
通知编译器要使用的标号在其他文件
IMPORT
SystemInit;
同上
关键在这里了,
LDR
R0, =SystemInit;

这里的“=”表示LDR目前是伪指令不是标准指令。这里是把SystemInit的地址给RO。也就是说SystemInit (void)在这里被调用编译。所以用户编在写程序时无需编写PLL配置程序。
BX
R0
BXARM指令集和THUMB指令集之间程序的跳转。
其他省略。详情如下图所示:


SystemInit初始化RCC之后调用SetSysClock(void)系统时钟设置函数
代码如下:
void SystemInit (void)
{


/* Set HSION bit */


RCC->CR |= (uint32_t)0x00000001;


/* Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE and MCOSEL[2:0] bits */


RCC->CFGR &= (uint32_t)0xF8FFB80C;


/* Reset HSEON, CSSON and PLLON bits */


RCC->CR &= (uint32_t)0xFEF6FFFF;


/* Reset HSEBYP bit */


RCC->CR &= (uint32_t)0xFFFBFFFF;


/* Reset PLLSRC, PLLXTPRE and PLLMUL[3:0] bits */


RCC->CFGR &= (uint32_t)0xFFC0FFFF;


/* Reset PREDIV1[3:0] bits */


RCC->CFGR2 &= (uint32_t)0xFFFFFFF0;


/* Reset USARTSW[1:0], I2CSW, CECSW and ADCSW bits */


RCC->CFGR3 &= (uint32_t)0xFFFFFEAC;


/* Reset HSI14 bit */


RCC->CR2 &= (uint32_t)0xFFFFFFFE;


/* Disable all interrupts */


RCC->CIR = 0x00000000;


/* Configure the System clock frequency, AHB/APBx prescalers and Flash settings */


SetSysClock();

}
2SetSysClock()设置系统时钟
由于之前选择定义了PLL_SOURCE_HSE,执行条件编译。
RCC->CR |= ((uint32_t)RCC_CR_HSEON);//使能HSE,如下图所示:

等待HSE设置完毕,代码如下。


do


{


HSEStatus = RCC->CR & RCC_CR_HSERDY;


StartUpCounter++;


} while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));


if ((RCC->CR & RCC_CR_HSERDY) != RESET)


{


HSEStatus = (uint32_t)0x01;


}


else


{


HSEStatus = (uint32_t)0x00;


}


设置完成,HSEStatus赋值1,代码如下:

if ((RCC->CR & RCC_CR_HSERDY) != RESET)


{


HSEStatus = (uint32_t)0x01;


}


else


{


HSEStatus = (uint32_t)0x00;


}

HSEStatus HSE==1表示HSE状态正常,启用缓冲区和设置FLASH延迟、HCLK\PCLKPLL倍频如下图红线所示,修改RCC_CFGR_PLLMULL实现倍频(默认6倍频)。
沙发
xiaoxibian456| | 2012-8-15 16:51 | 只看该作者
void PLL(void)
{
  RCC_CFGR_bit.PLLSRC=0;
  RCC_CFGR_bit.PLLMUL=0xa;
  while(RCC_CR_bit.PLLRDY);
  RCC_CR_bit.PLLON=1;
  RCC_CFGR_bit.SW=2;
}
搞定

使用特权

评论回复
板凳
秋天落叶| | 2012-8-15 18:09 | 只看该作者
这应用笔记写的有点乱,不过还是值得鼓励

使用特权

评论回复
地板
baidudz| | 2012-8-15 18:16 | 只看该作者
香主可以考虑给条裤子,以示鼓励:lol

使用特权

评论回复
5
txcy| | 2012-8-15 18:28 | 只看该作者
不错的应用笔记,对新手还是很有帮助的

使用特权

评论回复
6
平淡~简单| | 2013-1-19 20:45 | 只看该作者
谢了!看看这个,又学到了一些东西。对初学者的我们还是很受用的。

使用特权

评论回复
7
弯弯的月神| | 2013-5-26 09:59 | 只看该作者
牛人啊

使用特权

评论回复
8
hawksabre| | 2013-5-26 14:59 | 只看该作者
很不错的学习帖子     需要好好看看   谢谢楼主   顶一个

使用特权

评论回复
9
火箭球迷| | 2013-5-26 16:13 | 只看该作者
很不错的应用笔记

使用特权

评论回复
10
baidudz| | 2013-5-26 16:23 | 只看该作者
非常支持原创笔记

使用特权

评论回复
11
永远闪亮| | 2013-9-17 16:06 | 只看该作者
bucuo

使用特权

评论回复
12
永远闪亮| | 2013-9-17 16:07 | 只看该作者
!!!!!

使用特权

评论回复
13
zhentao1321| | 2014-2-21 17:00 | 只看该作者
很到位!今天就是这个小问题,把我给纠结住了!看了这个这个启动代码,瞬间明白了!不错不错~

使用特权

评论回复
14
cnc2020| | 2015-10-28 22:11 | 只看该作者
good, good

使用特权

评论回复
15
zybzyb1| | 2015-12-13 22:31 | 只看该作者
多谢楼主

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:小肖单片机编程交流群 QQ群:47463199 欢迎大家加入,互相学习探讨。

1

主题

47

帖子

3

粉丝