用arduino对stm32编程(二)

       经过上一篇搭建好自己的硬件平台后就开始准备愉快的编程了,但是想用它开发产品还是得弄清楚它上电运行的所有流程。直接开始吧,在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库函数进行编程了。

你可能感兴趣的:(单片机)