最近在用simpleFOC调试电机,simpleFOC库针对开源硬件平台Arduino编写的,所以想先用arduinoIDE先熟悉simpleFOC库和源码后,再做裁剪和优化移植到STM32平台上去。
硬件介绍
![在这里插入图片描述](https://img-blog.csdnimg.cn/d3c8ac63a66f4bae8de35a48739e15a3.png
硬件使用STM32F103C8T6最小系统板,官方叫做Bluepill,某宝上面一大堆。需要注意芯片是STM32还是其他国产的兼容芯片。我测试过GD32F103C8T6,WCH32F103C8T6,这两个可以用STM32CubeMX生产的程序直接下载,但是在ArduinoIDE里面很多功能都无法正常使用,比如SPI接口,时钟设置等。所以要用arduinoIDE开发的话还是要用STM32F103,不要用兼容芯片,否则出了问题都不知道怎么解决。目前STM32对ArduinoIDE的支持是最到位的。详细可以参考stm32duino的GitHub说明,还有stm32duino论坛。
开发过程
安装stm32duino开发板
首先需要在ArduinoIDE里面安装STM32的支持包,有两个版本,一个是stm32duino官方版,具体参考Getting started;另一个版本是rogerclark的版本,具体参考STM32F103C8T6在Arduino IDE里编程。亲测觉得官方版更稳定一些,配置端口也更灵活。推荐新手直接用官方版的
烧录方式
烧录方式主要有三种,三方方式的原理各不相同:可以参考Upload methods
- 用STLink烧录器烧录,需要单独的烧录引脚SWIO、SWCLK。如果习惯了用MDK开发,手上有STLink,这种方式是最稳定,速度最快的。上图中STM32CubeProgrammer(SWD)就是这种方式,BMP(Black magic Probe)应该也是这种方式,需要BMP烧录器,具体没有测试过。目前我使用的方式
- 用串口烧录,需要TX、RX引脚,并通过USB转串口工具连接电脑。先把Boot0接3.3V,boot1接0V,从SRAM启动,程序烧录完成后,再把boot0接0,从Flash启动。这种方式比较麻烦。上图中STM32CubeProgrammer(Serial)就是这种方式
- USB烧录,直接用开发板上的USB接口烧录,不需要额外的硬件支持。这种方式的优点是不需要额外的硬件。但是需要先给芯片烧录一个引导程序,也就是BootLoader,这个BootLoader需要占用一定的flash空间。上图中的STM32CubeProgrammer(DFU)、HID BootLoader(2K)、Maple DFU BootLoader(20K)、Maple DFU BootLoader original都是这种方式。
- 本人亲测,用maple DFU boatloader只能烧录一个,烧录完了之后,程序会覆盖掉BootLoader引导程序,使得无法进行多次烧录。但是用rogerclark的版本的开发板支持包就不存在这个问题。
- HIDbootloader采用的是USB协议中的HID(Human Interface Device )子类,具体烧录过程可以参考这个视频
(PS:rogerclark的版本的开发板支持包存在另外的问题:simpleFOC使用6PWM驱动时无法正常输出PWM,同样的程序官方版开发板支持包可以正常输出)
用stm32programmer时,官方建议STLink的1脚TVCC不要连接,只接GND、SWIO和SWCLK三个引脚,但是我实测TVCC脚必须接,否则stm32programmer无法识别MCU芯片。虽然TVCC电压只有1.6V,无法给MCU供电,官方解释避免USB供电与STLink供电发生意外。不知道什么原因。
bootloader 下载安装方式
bootloader的下载实际上跟电脑主板上的很相似,只是更小一些,其本质就是放在STM32芯片Flash区域的一段引导代码,程序开始启动的时候会率先执行,然后再BootLoader的引导下再进入自己编写的主程序当中。需要先把BootLoader.hex/.bin文件先烧录到flash的首地址区域0x08000000,可以通过STLink、UART、USB等不同的方式烧录。
maple bootloader对STM32官方包支持不太好,本人测试每次烧录完都会把BootLoader覆盖掉,重新烧录BootLoader才能再次烧录。而且maple bootloader占用20K的flash空间,本来STM32F103C8T6只有64K的flash空间,BootLoader就占了将近1/3.
HID BootLoader采用USB的子模块,把USB动作human interface device,占用的flash空间也很小,只有2k。烧录完HID BootLoader后,重新插上USB,在PC设备管理器中会增加一个人体学输入设备–USB输入设备。PS:只有刚烧录完BootLoader,还没有下载任何arduino程序时才会出现,如果arduino程序中设置了使用USB,那么芯片从boatloader启动后会立即跳转到main程序中,所以PC端口会出现STM Serial设备,而不是USB输入设备了,用户程序中USB设备的设置详见下文。
注意:HID BootLoader下载时需要把其它的USB设备都拔掉(比如USB转串口,STLink、JLink等),因为在下载时arduinoIDE会在PC的设备列表中自动查找适合的USB设备,多个USB设备很可能导致查找USB设备失败。
烧录过程信息输出如下图
其它问题
使用ST官方版本的开发板支持包,想要把PA11、PA12脚的USB脚作为USART串口使用需要设置相关USB选项为CDC(Communication Device Class)模式。通过ST官方提供的协议把USB口作为虚拟串口来用,好处是不用外接USB转串口板了,代价是需要一定的Flash空间烧录对应的USB协议。
三个子选项含义:
-
CDC(generic ‘serial’ superede U(S)ART),作为系统默认串口,自动编译,无需在程序中再次声明即可使用。如果在程序中声明则会报错:重复定义
-
CDC(no generic 'serial),不作为系统默认串口,使用前需要首先声明
-
HID(keyboard and mouse),是USB协议中的HID子类(Human Interface Device),是直接与人交互的设备,例如键盘、鼠标与游戏杆等。
U(S)ART配置三个子选项含义: -
Enabled(generic ‘serial’ ),作为Serial1,自动编译,无需在程序中再次声明即可使用。如果在程序中声明则会报错:重复定义
-
Enabled(no generic 'serial),不作为系统默认串口serial1,使用前需要首先声明
-
Disabled(no serial support),不支持硬件串口,只能使用软件模拟串口
//STM32 hardware serial instances
HardwareSerial Serial1(PA10, PA9); //已经在generic serial中设置,再次声明会报错。只能在设置generic serial和声明中二选一
HardwareSerial Serial2(PA3, PA2);
HardwareSerial Serial3(PB11, PB10);
void setup()
{
Serial.begin(115200);
Serial1.begin(115200); //TX=PA9,RX=PA10
Serial2.begin(115200); //TX=PA2,RX=PA3
Serial3.begin(115200); //TX=PB10,RX=PB11
}
void loop()
{
delay(100);
Serial.println("Test Serial");
Serial1.println("Test Serial1");
Serial2.println("Test Serial2");
Serial3.println("Test Serial3");
}