赞
踩
经过上一篇搭建好自己的硬件平台后就开始准备愉快的编程了,但是想用它开发产品还是得弄清楚它上电运行的所有流程。直接开始吧,在keil中用startup_stm32xx.s文件开始初始化,最后调用main函数。在arduino中能找到STM32\tools\CMSIS\5.5.1\Device\ARM\ARMCM3\Source\GCC\startup_ARMCM3.S和startup_ARMCM3.c两个文件,用哪个初始化还是没搞清楚,它们最后都会调用_start函数,在startup_ARMCM3.c中能够找到如下定义
extern void _start (void) __attribute__((noreturn)); /* PreeMain (C library entry point) */
也就是直接调用premain函数。
在STM32\hardware\stm32\1.6.1\cores\arduino\main.cpp中有premain和main两个函数
__attribute__((constructor(101))) void premain()
{
// Required by FreeRTOS, see http://www.freertos.org/RTOS-Cortex-M3-M4.html
#ifdef NVIC_PRIORITYGROUP_4
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
#endif
#if (__CORTEX_M == 0x07U)
// Defined in CMSIS core_cm7.h
#ifndef I_CACHE_DISABLED
SCB_EnableICache();
#endif
#ifndef D_CACHE_DISABLED
SCB_EnableDCache();
#endif
#endif
init(); (调用hal库进行初始化外设、系统时钟、USBcdc)
}
int main(void)
{
initVariant(); (空)
setup(); (应用程序setup调用接口)
for (;;) {
#if defined(CORE_CALLBACK)
CoreCallback();
#endif
loop(); (应用程序loop调用接口)
if (serialEventRun) { (如果有串口事件,进行串口处理,可见默认的串口处理是个循环扫描处理方法)
serialEventRun();
}
}
return 0;
}
到此为止我们就可以放心的用hal库函数进行编程了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。