一.为什么要学习arduino
- 学习arduino不为了用面包板搭电路,而是为了利用基础C++面向对象编程条理清晰的经过稳定验证的开源库,用来学习模块驱动编写还是很香的
二.在arduino框架下进行stm32编程
-
依赖于PlatformIO的packages中包含了 framework-arduinoststm32框架
不知道这个和github上的stm32duino不是一个东西,有点搞混了,但原理都是一样的,都是利用对stm32官方的HAL库,目前已经有Stm32duino,Arduino_stm32以及platformIO的ststm框架,
导致基于不同的框架写应用不能通用,例如使用platormIO的ststm工程 想使用arduino_stm32上的
usbcomposite HID类库就不容易了。LL库进一步封装成arduino语法实现的
-
于HAL库和LL库的介绍: ST为开发者提供了 标准外设库(STD库)、HAL库、LL库
三种,还有一个支持芯片较少的STM32Snippets 。前两者都是常用的库,后面的LL库是ST最近才添加。
其中,STD库和HAL库两者相互独立,互不兼容。
三.下面讲arduinoststm32框架是如何实现
- 在.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