PlatformIO中arduino框架下stm32编程实现原理

PlatformIO中arduino框架下stm32编程实现原理在arduino框架下进行stm32编程依赖于PlatformIO的packages中包含了framework-arduinoststm32框架不知道这个和github上的stm32duino是不是一个东西,有点搞混了,单原理都是一样的,都是利用对stm32官方的HAL库LL库进一步封装成arduino语法实现的关于HAL库和LL库的介绍:ST为开发者提供了标准外设库(STD库)、HAL库、LL库三种,还有一个支持芯片较少的STM32Snippets。前两者都是常用的库,后面的LL库是ST

一.为什么要学习arduino

  1. 学习arduino不为了用面包板搭电路,而是为了利用基础C++面向对象编程条理清晰的经过稳定验证的开源库,用来学习模块驱动编写还是很香的

二.在arduino框架下进行stm32编程

  1. 依赖于PlatformIO的packages中包含了 framework-arduinoststm32框架
    不知道这个和github上的stm32duino不是一个东西,有点搞混了,但原理都是一样的,都是利用对stm32官方的HAL库,目前已经有Stm32duino,Arduino_stm32以及platformIO的ststm框架,
    导致基于不同的框架写应用不能通用,例如使用platormIO的ststm工程 想使用arduino_stm32上的
    usbcomposite HID类库就不容易了。

    LL库进一步封装成arduino语法实现的

  2. 于HAL库和LL库的介绍: ST为开发者提供了 标准外设库(STD库)、HAL库、LL库
    三种,还有一个支持芯片较少的STM32Snippets 。前两者都是常用的库,后面的LL库是ST最近才添加。
    其中,STD库和HAL库两者相互独立,互不兼容。

三.下面讲arduinoststm32框架是如何实现

  1. 在.platformio\packages\framework-arduinoststm32\cores\arduino\main.cpp
    中可以找到
__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();   

  for (;;) { 
   
#if defined(CORE_CALLBACK)
    CoreCallback();
#endif
    loop();
    serialEventRun();
  }

  return 0;
}

就是在arduino入口xx.ino执行前会执行上面两个函数
然后才执行我们编写的void setup()及void loop()函数

转到init()定义

void __libc_init_array(void);

WEAK void init(void)
{ 
   
  hw_config_init();
}

继续跳转

void hw_config_init(void)
{ 
   
  /* Init DWT if present */
#ifdef DWT_BASE
  dwt_init();
#endif

  /* Initialize the HAL */
  HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();

#if defined (USBCON) && defined(USBD_USE_CDC)
  USBD_CDC_init();
#endif

#if defined (STM32MP1xx)
  __HAL_RCC_HSEM_CLK_ENABLE();
#endif

}
#ifdef __cplusplus
}

可以看到在这里完成了HAL库初始化 时钟初始化和USB的初始化
所以我们其实仍然可以直接使用HAL对stm32底层的操作
同时可以看到init() 和 SystemClock_Config(void) 都是虚函数
当我们需要根据自己需求更改时可以自行重新编写该函数
例如需要对stm32超频设置时。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/35543.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注