初级会员

- 积分
- 154
- 金钱
- 154
- 注册时间
- 2012-5-11
- 在线时间
- 18 小时
|

楼主 |
发表于 2012-9-6 10:35:57
|
显示全部楼层
回复【3楼】正点原子:
---------------------------------
蒽,那我能指出一个小小的问题吗?
在你的库函数的程序中,有一个小小的问题,想在这里说一下。
在主函数的程序里面,你是这样写的:
int main(void)
{
SystemInit(); //系统时钟初始化为72M SYSCLK_FREQ_72MHz
delay_init(72); //延时函数初始化
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
LED_Init(); //LED端口初始化
while(1)
{
LED0=0; // 这里使用了位带操作,也可以使用 GPIO_ResetBits(GPIOA,GPIO_Pin_8);
LED1=1; // 也可以使用 GPIO_SetBits(GPIOD,GPIO_Pin_2);
delay_ms(300);
LED0=1; // 也可以使用 GPIO_SetBits(GPIOA,GPIO_Pin_8);
LED1=0; // 也可以使用 GPIO_ResetBits(GPIOD,GPIO_Pin_2) ;
delay_ms(300);
}
}
在每次进入主函数之后,你对SystemInit(); 系统时钟都进行了初始化,按照我们常规的思维来说,这是没有错的。
但是我在学习这一段代码的时候,我先看了一下STM32的启动函数,发现出了你程序里面的一个小瑕疵。
我们都知道,STM32的程序刚刚启动的时候不是直接就从MAIN开始的,而是先从启动函数开始执行的。下面我们看一下,SRM32F103RBT6启动函数程序里面的一部分:
Reset_Handler   ROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
IMPORT SystemInit
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
; Dummy Exception Handlers (infinite loops which can be modified)
从这段函数中可以看出,STM32在启动的时候,已经引进了系统时钟初始化函数SystemInit,它可以直接使用啦。意思就是我们在后续写主函数的时候,不在需要调用SystemInit来对系统时钟进行初始化,它已经在开始运行啦。
上面是我小小的想法,不知道对与错,还请原子哥指点。 |
|