用arduino对stm32编程(一)

本文主要分析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文件分析

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进行修改。

1、修改PeripheralPins.c和PinNamesVar.h

这两个文件可以通过作者提供的python工具进行生成(在tools文件夹中),命令:python genpinmap_arduino.py -m STM32F103R(C-D-E)Tx.xml。

执行后将输出Arduino\STM32F103R(C-D-E)Tx文件夹里。复制到STM32_F103XX中替换。

2、修改boards.txt

在最后加入自己开发板信息,

# 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中创建的文件夹)

3、修改STM32_F103XX\ldscript.ld

/* 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)
}

4、修改STM32_F103XX\variant.cpp和variant.h

在variant.h中进行功能管脚功能定义,如serial、spi、iic等。需要注意NUM_DIGITAL_PINS定义是可用gpio的数值。NUM_ANALOG_INPUTS和NUM_ANALOG_FIRST需要adc管脚连续排列,但硬件设计经常不是连续的,不知道怎么用好它。

在variant.cpp中修改digitalPin与variant.h定义的管脚一致。SystemClock_Config函数可以参考STM32CubeMX生成的时钟配置进行修改,切勿直接替换!

 

你可能感兴趣的:(单片机)