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

一.为什么要学习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超频设置时。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Visual Studio Code使用PlatformIOArduino框架烧录STM32芯片并进行调试,可以按照以下步骤进行操作: 1. 准备工作: - 确保你已经安装了Visual Studio Code和PlatformIO插件。 - 创建一个新的PlatformIO项目,并选择使用Arduino框架。 - 你还需要连接好STM32开发板,并确保开发板与计算机之间建立了正确的连接。 2. 编写代码: - 在PlatformIO项目的`src`文件夹下创建一个新的`.cpp`文件,写入你的Arduino代码。 3. 配置调试环境: - 在Visual Studio Code打开PlatformIO项目。 - 在左侧的侧边栏,点击调试按钮(调试图标)打开调试视图。 - 点击调试视图的齿轮图标,选择“添加配置”并选择“PlatformIO: STM32”。 - 这将在`.vscode/launch.json`文件创建一个调试配置。 4. 调试配置: - 在`.vscode/launch.json`文件,找到刚刚创建的调试配置,并根据你的配置需求进行修改。 - 确保以下几个配置项是正确的: - "executable": "${command:platformio.device}", - "servertype": "platformio", - "filterStderr": false 5. 开始调试: - 在调试视图点击绿色的启动按钮开始调试。 - 如果一切顺利,PlatformIO将自动构建、烧录代码到STM32芯片,并开始在调试器运行你的代码。 - 现在你可以在调试视图设置断点、单步调试等操作。 请注意,上述步骤假设你已经正确配置了PlatformIOArduino框架,并且你的STM32开发板已经连接并可以正常工作。如果你遇到任何问题,请参考PlatformIO的官方文档或在PlatformIO的社区寻求帮助。 希望这对你有所帮助!如果你还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值