STM32CubeIDE使用教程(自用)

文章目录

整理工程目录

PS:正点原子使用的 STM32Cube MCU 软件包(STM32CubeN6)的版本是STM32Cube_FW_N6_V1.0.0

使用 STM32CubeMX 生成工程后的目录如下(BSP 为自己添加的文件夹,内有 Inc 和 Src 两个子文件夹):

复制代码
N647_LED/
|-- Drivers/
|   |-- BSP/
|   |-- CMSIS/
|   |-- STM32N6xx_HAL_Driver/
|-- N647_LED_Appli (in Appli)/
|   |-- Includes/
|   |-- Core/
|   |-- Debug/
|   |-- Release/
|   |-- N647_LED_Appli Debug.launch
|   |-- N647_LED_Appli Release.launch
|   |-- STM32N647X0HXQ_LRUN_RAMxspi1.ld
|   |-- STM32N647X0HXQ_LRUN_RAMxspi2.ld
|   |-- STM32N647X0HXQ_LRUN.ld
|   |-- STM32N647X0HXQ_ROMxspi1_RAMxspi2.ld
|   |-- STM32N647X0HXQ_ROMxspi1.ld
|   |-- STM32N647X0HXQ_ROMxspi1xspi2_RAMxspi3.ld
|   |-- STM32N647X0HXQ_ROMxspi2_RAMxspi1.ld
|   |-- STM32N647X0HXQ_ROMxspi2.ld
|   `-- STM32N647X0HXQ_ROMxspi3_RAMxspi1xspi2.ld
|-- Secure_nsclib/
`-- N647_LED.ioc

直接在 IDE 的 Project Explorer 中,将 Drivers 移入到 Appli 文件夹中,变成如下结构:

复制代码
N647_LED/
|-- N647_LED_Appli (in Appli)/
|   |-- Includes/
|   |-- Core/
|   |-- Debug/
|   |-- Drivers/
|     |-- BSP/
|     |-- CMSIS/
|     |-- STM32N6xx_HAL_Driver/
|   |-- Release/
|   |-- N647_LED_Appli Debug.launch
|   |-- N647_LED_Appli Release.launch
|   |-- STM32N647X0HXQ_LRUN_RAMxspi1.ld
|   |-- STM32N647X0HXQ_LRUN_RAMxspi2.ld
|   |-- STM32N647X0HXQ_LRUN.ld
|   |-- STM32N647X0HXQ_ROMxspi1_RAMxspi2.ld
|   |-- STM32N647X0HXQ_ROMxspi1.ld
|   |-- STM32N647X0HXQ_ROMxspi1xspi2_RAMxspi3.ld
|   |-- STM32N647X0HXQ_ROMxspi2_RAMxspi1.ld
|   |-- STM32N647X0HXQ_ROMxspi2.ld
|   `-- STM32N647X0HXQ_ROMxspi3_RAMxspi1xspi2.ld
|-- Secure_nsclib/
`-- N647_LED.ioc

STM32CubeIDE 的工程目录是随着实际文件目录结构变化的,如果你在 IDE 外面移动了文件,可在 IDE 的 Project Explorer 中右键并选择 Refresh,能看到工程目录结构也随之发生变化(反之亦然,IDE 里移动了文件,外面也会跟着变化,因此请不要在 IDE 里直接删除文件)。不过,在移动文件夹后通常需要修改路径配置。

修改 Paths and Symbols

在 IDE 的 Project Explorer 中,右键 N647_LED_Appli (in Appli),选择 Properties -> C/C++ General -> Paths and Symbols -> Includes 中,修改成如下图所示:

注意:

  1. 路径中的斜杠也必须删掉!
  2. 别忘了配置 Release(最上方的 Configuration 进行切换),也是一样的操作!

添加自己的文件夹,点击 Add -> Workspace,IDE 会自动添加路径 /${ProjName}/Drivers/BSP/Inc

建议:

  1. 使用 Export Settings 对这些配置进行导出备份,万一其他项目需要用到直接导入就行了。
  2. 经测试,使用 STM32CubeMX 再次生成代码不会对目录结构造成破坏,也不会修改这些配置。不过每次生成的时候总会在根目录 N647_LED/ 下又生成一个 Drivers 和 STM32CubeIDE(直接删掉即可)两个文件夹,直接把新的 Drivers 里面的子文件夹跟项目的 Drivers 合并就行了。
  3. 多使用 Git 工具进行备份。

配置链接脚本

STM32CubeMX 生成的初始化工程中,将自带多个链接脚本:

复制代码
Project_name/Appli/
|-- STM32N647X0HXQ_LRUN.ld
|-- STM32N647X0HXQ_LRUN_RAMxspi1.ld
|-- STM32N647X0HXQ_LRUN_RAMxspi2.ld
|-- STM32N647X0HXQ_ROMxspi1.ld
|-- STM32N647X0HXQ_ROMxspi1_RAMxspi2.ld
|-- STM32N647X0HXQ_ROMxspi1xspi2_RAMxspi3.ld
|-- STM32N647X0HXQ_ROMxspi2.ld
|-- STM32N647X0HXQ_ROMxspi2_RAMxspi1.ld
`-- STM32N647X0HXQ_ROMxspi3_RAMxspi1xspi2.ld

STM32CubeMX 生成的链接脚本文件名字段说明:

  • LRUN:即 Load and Run,该类链接脚本中定义程序的加载地址和运行地址都在 STM32N6 内部的 SRAM 中,主要用于调试使用。
  • RAMxspi[1-3]:该类链接脚本中定义程序使用了外部 RAM,并且外部 RAM 挂在 STM32N6 的 XSPIn上。
  • ROMxspi[1-3]:该类脚本中定义程序的加载地址和运行地址都在 STM32N6 外部的 Flash 中,并且外部 Flash 挂在 STM32N6 的 XSPIn 上。

修改 STM32N647X0HXQ_LRUN_RAMxspi1.ld

打开 STM32N647X0HXQ_LRUN_RAMxspi1.ld 文件,找到 MEMORY,并将其修改为如下:

ld 复制代码
MEMORY
{
  RAM    (xrw)    : ORIGIN = 0x34000400,   LENGTH = 2047K
  EXTRAM (rw)     : ORIGIN = 0x90000000,   LENGTH = 32M
}

接下来,为该链接脚本添加一个给 EXTRAM 分配的 Section,找到 SECTIONS,并在其中添加一个 Section:

ld 复制代码
  /* External RAM */
  .EXTRAM (NOLOAD):
  {
    . = ALIGN(8);
    *(.EXTRAM)
    . = ALIGN(8);
  } >EXTRAM

修改 STM32N647X0HXQ_ROMxspi2_RAMxspi1.ld

打开 STM32N647X0HXQ_ROMxspi2_RAMxspi1.ld 文件,找到 MEMORY,并将其修改为如下:

ld 复制代码
MEMORY
{
  ROM    (xrw)    : ORIGIN = 0x70100400,   LENGTH = 31743K
  RAM    (xrw)    : ORIGIN = 0x34000000,   LENGTH = 2048K
  EXTRAM (rw)     : ORIGIN = 0x90000000,   LENGTH = 32M  
}

接下来,为该链接脚本添加一个给 EXTRAM 分配的 Section,找到 SECTIONS,并在其中添加一个 Section:

ld 复制代码
  /* External RAM */
  .EXTRAM (NOLOAD):
  {
    . = ALIGN(8);
    *(.EXTRAM)
    . = ALIGN(8);
  } >EXTRAM

配置工程使用的链接脚本

选中工程后,依次点击工具栏中的 Project -> Properties,弹出的窗口中依次点击 C/C++ Build -> Settings -> Tool Settings -> MCU/MPU GCC Linker -> General,接着在 Linker Script (-T) 中输入链接脚本的路径,如下:

  • Debug 配置:在Configuration 中切换工程配置为Debug ,然后在 Linker Script (-T) 中输入(注意如果你的路径跟我的不同记得修改)${workspace_loc:/${ProjName}/STM32N647X0HXQ_LRUN_RAMxspi1.ld}
  • Release 配置:在Configuration 中切换工程配置为Release ,然后在 Linker Script (-T) 中输入${workspace_loc:/${ProjName}/STM32N647X0HXQ_ROMxspi2_RAMxspi1.ld}

编译、调试和烧录

编译工程(Build Project)

选中需要配置的工程后,依次点击工具栏中的 Project -> Build Configurations -> Set Active 可以设置当前工程激活的是 'Debug' 配置还是 'Release' 配置。

先后将工程配换到 DebugRelease 配置后,依次点击工具栏中的 Project -> Build Project,即可分别编译 DebugRelease 配置的工程。

STM32的启动模式

BOOT1 BOOT0 启动模式 说明
X 0 ICP / Flash boot 芯片从用户 Flash 启动,运行用户编写的应用程序,适合用于Release
0 1 ISP 芯片从系统存储器启动,运行出厂预置的 BootLoader
1 1 Development boot 芯片从内部 SRAM 启动,代码直接在 RAM 中运行,掉电程序直接丢失,适合用于Debug、快速查看运行结果

X:代表该引脚电平任意,0或1均可

调试(Debug)

  1. 将 STM32 调整至 Development boot 模式,具体见上表。
  2. 将工程切换到 Debug 配置后,选中工程并依次点击工具栏中的 Run -> Run Configurations...,打开运行配置窗口,并双击 STM32 C/C++ Application 新建一个运行配置。
  3. 在运行配置的 Main 配置页中,将 C/C++ Application: 配置为 Debug 配置工程生成的 elf 文件(位于/Appli/Debug,需要在Debug 配置下 Build Project 才有该文件)。
  4. 点击调试配置窗口右下角的 Debug,即可开始调试。
  5. 若需要直接查看运行结果,点击运行配置窗口右下角的 Run,并等待操作完成,即可开始运行。

调试器的 Reset Behavior 的 Type 设置为 None

烧录(Release)

  1. 将 STM32 调整至 Flash boot 模式,具体见上表。
  2. 将工程切换到 Release 配置后,选中工程并依次点击工具栏中的 "Run" -> "Run Configurations...",打开运行配置窗口,并双击 STM32 C/C++ Application 新建一个运行配置。
  3. 在运行配置的 Main 配置页中,将 C/C++ Application: 配置为 Release 配置工程生成的 elf 文件(位于/Appli/Release中,需要在Release 配置下 Build Project 才有该文件)。
  4. 在运行配置的 调试器 配置页的 External loaders 中添加 STM32N647 开发板软件包中提供的 External Loader 文件。
  5. 点击运行配置窗口右下角的 Run,并等待烧录完成即可。

其他问题

把模板工程复制过来使用

复制以后,需要修改的地方仅有一处------把 .project 文件中原本的项目名称改成现在的名称即可。然后把 debug 和 release 文件夹删掉。

make: *** No rule to make target 错误原因、分析和解决办法

问题的产生的根本原因是工程更改路径或者更改了其中的文件夹名称之后,之前生成的 .o 和 .d 文件在再次编译时并不会重新编译,因而导致该问题。根源解决办法是删除编译后生成的文件夹。然后重新编译就行了。

STM32CubeMX 中,外设怎么配置

要先在右边的针脚图中选择外设对应的针脚,然后在左边选择外设。顺序别搞错了,否则配置不了外设的参数。

代码生成器中的配置都是什么

相关推荐
ACP广源盛1392462567326 分钟前
端侧 AI 硬件架构实践@ACP#中端边缘整机 PCIe 扩展与 IX7012 器件分析
大数据·数据库·人工智能·嵌入式硬件·开源·硬件架构
ACP广源盛1392462567328 分钟前
端侧 AI 硬件架构探讨@ACP#多外设高密度整机 PCIe 扩展与 IX7024 器件分析
大数据·数据库·人工智能·嵌入式硬件·开源·硬件架构
智购科技自动售货机工厂44 分钟前
2026自动售货机异常重启根因分析:从日志挖掘到内存取证的技术实践~YH
开发语言·数据库·单片机·嵌入式硬件·人机交互
jianqiang.xue1 小时前
专栏简介:《嵌入式 AI 智能体设计实战》
人工智能·stm32·单片机·物联网·架构·esp32
铅笔小新z1 小时前
【stm32】I2C 通信协议
stm32·单片机·嵌入式硬件
一条破秋裤2 小时前
GPIO输入输出
单片机·嵌入式硬件
单片机仿真设计2 小时前
【proteus仿真】基于 STM32 单片机货架巡检机器人设计(仿真图+程序)
stm32·单片机·嵌入式硬件·机器人·proteus·毕设
虎王物联11 小时前
STM32 HAL库串口DMA空闲中断:高效接收不定长Modbus数据帧
stm32·单片机·嵌入式硬件·dma·modbus
自小吃多11 小时前
DXF文件导入与PCB板框定义笔记
笔记·嵌入式硬件