本文主要分析stm32duino文件和自建stm32开发板的过程。
开发板:xx(未知,用别人买的山寨板mini_stm32)
stm32:stm32f103rct6
arduino版本:1.8.9
stm32duino:https://github.com/rogerclarkmelbourne/STM32duino-bootloader
(在arduino IDE 文件->开发板管理器网址:https://github.com/stm32duino/BoardManagerFiles/raw/master/STM32/package_stm_index.json)
stm32duino相关文件都存在C:\Users\xx\AppData\Local\Arduino15\packages\STM32
stm32duino文件夹说明
STM32
---->hardware
-------->stm32
------------>1.6.1
---------------->CI (xx,未知)
---------------->History (开发板历史信息,boards.txt历史)
---------------->libraries (一些stm32duino作者自己写的库)
---------------->system (stm32底层驱动文件)
---------------->variants (开发板信息)
---------------->platform.txt (包含stm32使用到的编译器,编译参数,烧录工具等)
---------------->boards.txt (包含开发板的信息)
---------------->keywords.txt (包含编程时的关键字)
---------------->programmers.txt (空)
---->tools (编译工具,创建自己开发板的工具)
分析一下stm32duino中的开发板variants/PILL_F103XX,其芯片型号STM32F103CBT6与我的相似,包含如下文件
variants/PILL_F103XX
---->ldscript.ld (链接文件,)
---->PeripheralPins.c (管脚复用功能定义,如serial、spi、iic、adc、pwm等等)
---->PinNamesVar.h (唤醒管脚、usb数据管脚定义)
---->variant.cpp (与variant.h中管脚定义对应的stm32管脚数组定义,stm32时钟定义)
---->variant.h (开发板管脚定义、其它功能定义)
通过上面分析,可见arduino是对应开发板进行编程的。variants里肯定就没有我使用的山寨板,也没有我使用的同型号芯片的开发板,所以需要自己添加一些信息。
建立文件夹variants\STM32_F103XX,芯片型号与PILL_F103XX开发板相似,拷贝PILL_F103XX文件夹中的文件到STM32_F103XX进行修改。
这两个文件可以通过作者提供的python工具进行生成(在tools文件夹中),命令:python genpinmap_arduino.py -m STM32F103R(C-D-E)Tx.xml。
执行后将输出Arduino\STM32F103R(C-D-E)Tx文件夹里。复制到STM32_F103XX中替换。
在最后加入自己开发板信息,
# MINISTM32_F103RC board
GenF1.menu.pnum.MINISTM32_F103RC=MiniStm32 F103RC (arduino中选择开发板可见)
GenF1.menu.pnum.MINISTM32_F103RC.upload.maximum_size=262144 (stm32的flash大小)
GenF1.menu.pnum.MINISTM32_F103RC.upload.maximum_data_size=49152 (stm32的ram大小)
GenF1.menu.pnum.MINISTM32_F103RC.build.board=MINISTM32_F103RC
GenF1.menu.pnum.MINISTM32_F103RC.build.product_line=STM32F103xE (stm32型号和容量类型)
GenF1.menu.pnum.MINISTM32_F103RC.build.variant=STM32_F103XX (variants中创建的文件夹)
/* Specify the memory areas */
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = LD_MAX_DATA_SIZE (按照stm32型号修改ORIGIN)
FLASH (rx) : ORIGIN = 0x8000000 + LD_FLASH_OFFSET, LENGTH = LD_MAX_SIZE - LD_FLASH_OFFSET (按照stm32型号修改ORIGIN)
}
在variant.h中进行功能管脚功能定义,如serial、spi、iic等。需要注意NUM_DIGITAL_PINS定义是可用gpio的数值。NUM_ANALOG_INPUTS和NUM_ANALOG_FIRST需要adc管脚连续排列,但硬件设计经常不是连续的,不知道怎么用好它。
在variant.cpp中修改digitalPin与variant.h定义的管脚一致。SystemClock_Config函数可以参考STM32CubeMX生成的时钟配置进行修改,切勿直接替换!