前言
这一份文档是STM32duino的github的wiki里面所包含的教程,目前这一个项目支持的板子(他们叫做varient,变体)还很少,所以就有了这样一个自己添加板子的教程。
正文
Frederic Pillon 在6月12日的时候编辑了这一个页面 · 23 revisions
此文档中显示了以下所有步骤的示例: Add Nucleo-F207ZG (无视最后两项)
自从此PR创建以来,已经做了一些改进。
- 不需要定义CMSIS启动文件,因为它们现在都是在核心中定义的。 See #70
- 现在可以定义自定义的启动文件了(startup file). #353
- 在
variant.h
.中使用define而不是enum来定义引脚 详情见 #356 - 不需要做更多对STM32 HAL 库的配置了. See #518
创建一个新的板子
到STM32 core的variant' 文件夹下
可以参考这一个页面: Where are sources
1 - 建立一个stm32/variants/board_template 文件夹的新的拷贝,你可以随便命名它
举个例子: 添加一块 Nucleo-F207ZG
cp -a board_template NUCLEO_F207ZG
(linux)
也可以复制最相似的板子的文件
2 - 添加引脚映射
适用于所有STM32 MCU的STM32工具包还有PeripheralPins.c
文件和PinNamesVar.h
文件都已提供了,你可在这里获得你想要的资料: Arduino_Tools/genpinmap/Arduino
也可以手动生成它们,请参见genpinmap。
将PeripheralPins.c和PinNamesVar.h文件复制到创建的板子文件夹中。
genpinmap/Arduino/STM32F207Z(C-E-F-G)Tx/PeripheralPins.c
和
genpinmap/Arduino/STM32F207Z(C-E-F-G)Tx/PinNamesVar.h
放在
variant/NUCLEO_F207ZG/
文件夹里面
3 预览引脚映射
添加PeripheralPins.c之后,请仔细检查。
如果针对相同的IP多次生成了引脚,则注释一行
如果不使用该引脚(例如,在板上屏蔽掉一些硬件)
你可以使用相关的用户手册来定义最佳的引脚映射:
以Nucleo-F207ZG 为例:
UM1974: STM32 Nucleo-144 boards
也可以检查mbed os的等效文件: ST-Nucleo-F207ZG
4 - 查看引脚和信号引脚编号
按需求来编辑variant.h和variant.cpp文件。
在variant.cpp中:
- 你要填写数组const PinName digitalPin []。 该数组的功能是将Arduino引脚号(Dx或x或PYx)对应到STM32引脚(PY_x)。
在variant.h文件中:
- 对齐variant.h中digitalPin []数组中上面定义的PinName的数量。
定义所有可用的引脚及其链接的引脚号,该数字是digitalPin []数组中的索引。
举个例子:
#define PG9 0
#define PG14 1
#define PF15 2
#define PE13 3
#define PF14 4
- 查看宏以指向正确的引脚名称/编号:LED_BUILTIN,MOSI,MISO,SCLK,SDA,SCL,...
请注意,其中一些在内核中具有默认值。 仅当与默认值不同时才重新定义它们。
参考: https://github.com/stm32duino/Arduino_Core_STM32/blob/c392140415b3cf29100062ecb083adfa0f59f8b1/cores/arduino/pins_arduino.h#L142到这里,你能添加自定义的定义,去匹配你的需求了
5 - 系统时钟配置
在variant.cpp文件中, void SystemClock_Config(void)
需要定义。
可以通过STM32CubeMX或复制自STM32CubeYY项目示例(其中“ YY”是MCU系列)
关于操作STM32CubeMX :
- 运行STM32CubeMX,创建一个新项目,然后选择目标MCU或开发板(如果列表中有列出)。
- 转到“引脚分配”选项卡,启用所需的外围设备:I2C,SDIO,SPI,USB,...
配置时钟:
- 如果电路板具有外部晶振:在“ Pinout”选项卡RCC-> HSE外设中设置为Crystal。
- 在“时钟配置”中,将HSE输入频率设置为晶体1,然后将PLL Source Mux设置为HSE。
- 将HCLK设置为最大频率,STM32CubeMX将自动配置时钟树并解决冲突问题。
生成代码:
- 设置工具链/ IDE:SW4STM32
- 在生成代码的时候,还将生成外设的时钟配置
- 将src / main.c中生成的void SystemClock_Config(void)复制到variant.cpp中
6 - 更新 ldscript.ld
可以通过STM32CubeMX或
复制自STM32CubeYY项目示例(其中“ YY”是MCU系列)
将变体文件夹中的ldscript.ld替换为根文件夹中STM32CubeMX生成的STM32YYxxxxxx_FLASH.ld。
Nucleo-F207ZG的示例:STM32F207ZGTx_FLASH.ld
7 - HAL库的配置
如果说你的核心版本大于1.5.0,那么每个STM32系列均提供默认的STM32 HAL配置。 请参阅hal-configuration。
在variant.h中添加任何其他的HAL库的模块定义。
以Nucleo-F207ZG为例:
/ *额外的HAL模块* /
#定义HAL_DAC_MODULE_ENABLED
#定义HAL_ETH_MODULE_ENABLED
在variant.h中添加任何其他HAL配置。
Example #define HSE_VALUE 25000000U
8 - 声明板子,添加到ArduinoIDE
仍然要手动的添加菜单并添加相关信息(闪存和SRAM大小,CPU频率等)。 更多可选项可以看这一份文档 Arduino Boards.txt specifications
编辑boards.txt 文件,操作如下:
- 复制文件中与你的芯片最类似的部分内容
- 通过menu.pnum。<new_board_name>重命名所有menu.pnum下的<old_board_name>
- 将build.mcu =和build.cmsis_lib_gcc =更新到正确的cortex-mX版本
- 将build.series =更新为正确的STM32YYxx(其中YY是MCU系列,比如F4比如G0)
- 将build.product_line =更新为正确的STM32YYXXxx MCU版本。
- 将upload.maximum_size =和upload.maximum_data_size =更新为正确的Flash和SRAM大小
9 - 重新启动
重新启动Arduino IDE,并且使用Blink-example 测试你的板子