本帖最后由 xx-mcu 于 2012-7-26 16:27 编辑
这是小肖发的第二贴,不能能否给个“酷”,期待中。。。。
后续相继上传例程,小肖例程写的很用心当然“剽窃”官方是必须的:lol ,也自知老菜鸟能力有限,后期上传的例程如果写的不是很好的地方还望大伙指教指教。
/*********** 分割线 ***********/
1、启动代码分析—SystemInit (void)系统时钟初始化
SystemInit (void)是系统初始化函数,很多新手不知其在何处调用,小肖马上为你解惑。
startup_stm32f0xx.s文件中汇编代码为STM32启动代码。
启动代码步骤一般为:
1)堆和栈的初始化;
2)向量表定义;
3)地址重映射及中断向量表的转移;
4)设置系统时钟频率;
5)中断寄存器的初始化;
6)进入主程序。
废话太多,估计也看烦了。现在挑重点讲,重点在第4个步骤。(第5、6一般编程时在用户代码中执行)。
Reset_Handler
PROC;标记一个函数的开始,也就是复位入口。
IMPORT
__main ; 通知编译器要使用的标号在其他文件
IMPORT
SystemInit; 同上
关键在这里了,
LDR
R0, =SystemInit;
这里的“=”表示LDR目前是伪指令不是标准指令。这里是把SystemInit的地址给RO。也就是说SystemInit (void)在这里被调用编译。所以用户编在写程序时无需编写PLL配置程序。
BX
R0;BX是ARM指令集和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();
}
2、SetSysClock()设置系统时钟
由于之前选择定义了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\PCLK。PLL倍频如下图红线所示,修改RCC_CFGR_PLLMULL实现倍频(默认6倍频)。
|