0%

STM32CubeMX使用指南

STM32CubeMX

  • STM32CubeMX这个页面里的Tools&Software包含开发工具与嵌入式工具两大部分.
    ![STM32CubeMX -devtools.png](/imgs/stmcubemx/STM32CubeMX -devtools.png)
    ![STM32CubeMX -Embedded.png](/imgs/stmcubemx/STM32CubeMX -Embedded.png)
    ![STM32CubeMX -Embedded.png](/imgs/stmcubemx/STM32CubeMX -Embedded1.png)
    ![STM32CubeMX -Embedded.png](/imgs/stmcubemx/STM32CubeMX -Embedded2.png)

开发工具

STM32CubeIDE

  • STM32CubeIDE是的ST的官方IDE工具,下载后会得到一个很大zip包,解压后会有SetupSTM32CubeMX-5.4.0.app,SetupSTM32CubeMX-5.4.0.exe,SetupSTM32CubeMX-5.4.0.linux三个项目,其中SetupSTM32CubeMX-5.4.0.linux就是Linux下的安装脚本,安装完成后,使用手册在安装目录下的help/UM1718.pdf里,11~19 章是具体的示例教程.Linux 安装后运行截图如下:
    STM32CubeMX.png
  • 如上图所示,可以安装相应的嵌入式的软件,就是各种MCU的库文件,模版文件,也可以通过手动下载,如:STM32Cube MCU Package for STM32F7 series .
  • 也可以通过这里这种几只平台的发行版本包.
  • Linux 下安装完成,它没有自动在系统菜单添加条目录.可以参照下面路径与文件格式新建一个用户菜单项.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
~$ cat ~/.local/share/applications/stm32cubemx.desktop
[Desktop Entry]
Type=Application
Name=STM32CubeMX
GenericName=STM32CubeMX
Comment=STM32CubeMX
Terminal=false
Categories=Development;IDE;Electronics;
Keywords=embedded electronics;electronics;avr;microcontroller;
Exec=/home/michael/IDE_DIR/STM32CubeMX-5.4/STM32CubeMX
Terminal=false
# 这里要安装了相应的插件在才有的.
Icon=/home/michael/.p2/pool/plugins/com.st.stm32ide.common.utils_1.0.0.201902141520/icons/stm32cube 32x32.png
Categories=GNOME;GTK;Development;
StartupNotify=true

# 保存上面文件,更新系统菜单项.
~$ update-menus

STSW-STM32095 Eclipse 插件

  • 下载STSW-STM32095到本地,打开 Eclipse,进入Help-->Installl New Software... --> 点击 Add --> 在Name里输入一个名字,--> 点击 Archive... --> 选择刚才下载的en.stsw-stm32095.zip --> 确定进行安装.
  • 安装完成后,在 Eclipse 里可以通过右上角的图标打开STM32CubeMXPerspective, 也可以通过菜单栏Windows-->Perspective-->Open Perspective-->Other 选择STM32CubeMX打开,打开的界面如同上面的STM32CubeIDE原生界面.

STM32CubeMX 创建工程

创建基于 STM32F4-discovery 评估板的工程

  • 在初次打开STM32CubeMX时可能会从通过网络去到ST官网下载一些默认的BSP支持文件,还有在新建项目时,如果本地没有相关的文件件,它也会自动去官网下载,所以联网是必须的.

新建工程

  • 打开File -> New Project -> Board Selector,右边栏显示所有支持的板子型号,左边栏可以通过一些参数过滤,找到我们要匹配的板子型号.Type -> Discovery kit, MCU/MPU Series -> STM32F4,这里大概会列表 7 个候选板子,我选择最后一个,点击右上解Start Project,它会联网下载一些文件,完成后就会打开一个配置界面.

配置 Pinout & Configuration

  • 中间件 FreeRTOS,配置如下:
    f407-rtos-freertos.png

  • USB OTG,配置如下:
    f407-rtos-usb-otg.png

  • USB Device,配置如下:
    f407-rtos-freertos.png

  • GPIO,如果我这里要点亮某些板子上的 LED,在这里需要配置好相应的 GPIO 模式.配置如下:
    f407-rtos-gpio.png

  • USART2,串口通讯配置如下:
    f407-rtos-usart2.png

配置 Clock Configuration

  • 注意,这里的时钟树配置与上面的 Pinout 配置会有相互影响,比如:各种复用功能之间的资源冲突, 这里需要根据手册去调整.

    f407-rtos-clock.png

配置工程

  • 在配置完成上述功能,可以打开Project Manager页面,主要配置的是Project页面里的参数,注意Heap与Stack的大小是否合适,比如Toolchain/IDE这里有几个选项, 支持不同的厂商 IDE 如,IAR,MDK-ARM,TrueStudio 等, 我这边会选择SW4STM32类型,使用 Eclipse 在 Linux 下导入它,应该还可以选择Makefile类型,也可以通过 Eclipse 导入.至于Code Generator页面里,保持默认选择Copy only the necessary library files就可以了,不然会把工程文件搞大吗?完成后,点击右上角GENERATE CODE生成代码,再完成之后,可以直接打开目录查看生成的代码.
  • f407-rtos-project-cfg.png

安装 OpenSTM32 环境

  • Importing a STCubeMX generated project

  • System Workbench for STM32

  • Linux环境下,我这里选择Eclipse做为开发IDE,但是要安装一个插件,请参考ST官网SW4STM32.这里两种方式安装:

    • 1.下载 Linux 安装程序.
      • 这里其实包含一个完整 EclipseSystemWorkbench 的安装包,如果系统已经有 Eclipse 了可以选择第二种安装方式(插件安装),独立安装如图:
        SystemWorkbench.png
    • 2.添加Eclipse插件源,从Eclipse 安装,Help-->Installl New Software... --> Add,在 location 里输入http://ac6-tools.com/Eclipse-updates/org.openstm32.system-workbench.update-site-v2,点击 OK 新建一个更新站点.
      • 但是因为网络原因,通过http://www.ac6-tools.com/Eclipse-updates/org.openstm32.system-workbench.update-site-v2/安装会很慢,而且会断线.所以这里会先使用 wget -r -np -nH -R -c http://www.ac6-tools.com/Eclipse-updates/org.openstm32.system-workbench.update-site-v2/把它的网站目录下载到本地.进入到 org.openstm32.system-workbench.update-site-v2使用find . -iname "index.*"清除这些无用的index.html文件,还可以用此脚本清除一些旧版的 jar,减小体积.再通过Help-->Installl New Software... --> Add创建一个 本地安装源 如 openstm32 - file:/home/lcy/Downloads/Eclipse-updates/org.openstm32.system-workbench.update-site-v2/ 就可以正常使用了. 更新后会出现:
      • External Tools # 这里出现版偏旧,可以参考使用 https://github.com/gnu-mcu-eclipse/eclipse-plugins
        • ARM Compiler for MCU
        • OpenOCD
        • STLinkServer
      • OpenSTM32 Tools
      • STM32-Copro-MPU
    • 这里就把上面三个大选项都选上安装.

导入 STM32CubeMX 生成工程文件

  • 打开 Eclipse,从File -> Import...,选择General组下的Existing Projects into Workspace,会打开导入工程对话框.根目录选择在STM32CubeMX --> Project Manager里的工程配置页里工程生成路径,如图:
    ac6-prj-import.png

重命名生成的工程

  • 右键project->Properties,进入到C/C++ Build -> Settings -> Build Artifact
    /imgs/stmcubemx/prj-rename.png

指定交叉编译工具链

  • 在右键project->Properties,进入到C/C++ Build -> Settings -> Tools Settings -> MCU Setings里面的 path 值是${openstm32_compiler_path},这里出现找不到arm-none-eabi-gcc的错误提示.把这个变量名换成它带的ARM Compiler for MCU工具链的安装绝对路径就可以正常编译了.ARM Compiler for MCU工具链默认是解压在插件路径里,也可以复制到其它的路径里.这里把上述path里的变量改成/home/michael/IDE_DIR/Ac6/SystemWorkbench/plugins/fr.ac6.mcu.externaltools.arm-none.linux64_1.17.0.201812190825/tools/st-gnu-arm-gcc-7-2018-q2-update_gdb-5_4-2016q3/bin后,成功编译.如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
...
Building file: ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_usb.c
Invoking: MCU GCC Compiler
/home/michael/eclipse-workspace/stm32f407_discovery_rtos/Debug
arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 '-D__weak=__attribute__((weak))' '-D__packed="__attribute__((__packed__))"' -DUSE_HAL_DRIVER -DSTM32F407xx -I"/home/michael/eclipse-workspace/stm32f407_discovery_rtos/Inc" -I"/home/michael/eclipse-workspace/stm32f407_discovery_rtos/Drivers/STM32F4xx_HAL_Driver/Inc" -I"/home/michael/eclipse-workspace/stm32f407_discovery_rtos/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy" -I"/home/michael/eclipse-workspace/stm32f407_discovery_rtos/Middlewares/Third_Party/FreeRTOS/Source/include" -I"/home/michael/eclipse-workspace/stm32f407_discovery_rtos/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2" -I"/home/michael/eclipse-workspace/stm32f407_discovery_rtos/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F" -I"/home/michael/eclipse-workspace/stm32f407_discovery_rtos/Middlewares/ST/STM32_USB_Device_Library/Core/Inc" -I"/home/michael/eclipse-workspace/stm32f407_discovery_rtos/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc" -I"/home/michael/eclipse-workspace/stm32f407_discovery_rtos/Drivers/CMSIS/Device/ST/STM32F4xx/Include" -I"/home/michael/eclipse-workspace/stm32f407_discovery_rtos/Drivers/CMSIS/Include" -Og -g3 -Wall -fmessage-length=0 -ffunction-sections -c -fmessage-length=0 -MMD -MP -MF"Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_usb.d" -MT"Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_usb.o" -o "Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_usb.o" "../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_usb.c"
Finished building: ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_usb.c

Building target: stm32f407_rtos.elf
Invoking: MCU GCC Linker
arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -specs=nosys.specs -specs=nano.specs -T"../STM32F407VGTx_FLASH.ld" -Wl,-Map=output.map -Wl,--gc-sections -o "stm32f407_rtos.elf" @"objects.list" -lm
Finished building target: stm32f407_rtos.elf

make --no-print-directory post-build
Generating hex and Printing size information:
arm-none-eabi-objcopy -O ihex "stm32f407_rtos.elf" "stm32f407_rtos.hex"
arm-none-eabi-size "stm32f407_rtos.elf"
text data bss dec hex filename
26768 492 27996 55256 d7d8 stm32f407_rtos.elf


21:34:37 Build Finished. 0 errors, 0 warnings. (took 12s.463ms)

测试流水灯代码

  • 因为在STM32CubeMX加入了 FreeRTOS 的模块,所以 main.c 有一些系统相关的代码,下面只在 main.c 里的 while(1)里,简单测板上的四个流水灯.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//  osKernelInitialize();
// const osThreadAttr_t defaultTask_attributes = {
// .name = "defaultTask",
// .priority = (osPriority_t) osPriorityNormal,
// .stack_size = 128
// };
// defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);
// osKernelStart();
// 需要注释上面的代码才能运行到while这里.
while (1)
{
/* USER CODE END WHILE */
HAL_GPIO_TogglePin(LD3_GPIO_Port,LD3_Pin);
HAL_Delay(500);//毫秒级延迟
HAL_GPIO_TogglePin(LD4_GPIO_Port,LD4_Pin);
HAL_Delay(500);
HAL_GPIO_TogglePin(LD5_GPIO_Port,LD5_Pin);
HAL_Delay(500);
HAL_GPIO_TogglePin(LD6_GPIO_Port,LD6_Pin);
HAL_Delay(500);

/* USER CODE BEGIN 3 */
}
  • 添加上述代码,重新编译,连接上开发板,选择工程右键Run As -> Ac6 STM32 C/C++ Application就会下载代码到开发板,会看四个 LED 轮流慢闪.也可以运行Debug As单步调试每一条指令.

谢谢支持