文章目录
- 整理工程目录
-
- [修改 Paths and Symbols](#修改 Paths and Symbols)
- 配置链接脚本
-
- [修改 `STM32N647X0HXQ_LRUN_RAMxspi1.ld`](#修改
STM32N647X0HXQ_LRUN_RAMxspi1.ld) - [修改 `STM32N647X0HXQ_ROMxspi2_RAMxspi1.ld`](#修改
STM32N647X0HXQ_ROMxspi2_RAMxspi1.ld) - 配置工程使用的链接脚本
- [修改 `STM32N647X0HXQ_LRUN_RAMxspi1.ld`](#修改
- 编译、调试和烧录
-
- [编译工程(Build Project)](#编译工程(Build Project))
- STM32的启动模式
- 调试(Debug)
- 烧录(Release)
- 其他问题
-
- 把模板工程复制过来使用
- [make: *** No rule to make target 错误原因、分析和解决办法](#make: *** No rule to make target 错误原因、分析和解决办法)
- [STM32CubeMX 中,外设怎么配置](#STM32CubeMX 中,外设怎么配置)
- 代码生成器中的配置都是什么
整理工程目录
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 中,修改成如下图所示:
注意:
- 路径中的斜杠也必须删掉!
- 别忘了配置 Release(最上方的 Configuration 进行切换),也是一样的操作!

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

建议:
- 使用 Export Settings 对这些配置进行导出备份,万一其他项目需要用到直接导入就行了。
- 经测试,使用 STM32CubeMX 再次生成代码不会对目录结构造成破坏,也不会修改这些配置。不过每次生成的时候总会在根目录 N647_LED/ 下又生成一个 Drivers 和 STM32CubeIDE(直接删掉即可)两个文件夹,直接把新的 Drivers 里面的子文件夹跟项目的 Drivers 合并就行了。
- 多使用 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' 配置。
先后将工程配换到 Debug 和 Release 配置后,依次点击工具栏中的 Project -> Build Project,即可分别编译 Debug 和 Release 配置的工程。
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)
- 将 STM32 调整至
Development boot模式,具体见上表。 - 将工程切换到
Debug配置后,选中工程并依次点击工具栏中的 Run -> Run Configurations...,打开运行配置窗口,并双击STM32 C/C++ Application新建一个运行配置。 - 在运行配置的
Main配置页中,将C/C++ Application:配置为Debug配置工程生成的elf文件(位于/Appli/Debug,需要在Debug配置下 Build Project 才有该文件)。 - 点击调试配置窗口右下角的
Debug,即可开始调试。 - 若需要直接查看运行结果,点击运行配置窗口右下角的
Run,并等待操作完成,即可开始运行。
调试器的 Reset Behavior 的 Type 设置为 None
烧录(Release)
- 将 STM32 调整至
Flash boot模式,具体见上表。 - 将工程切换到
Release配置后,选中工程并依次点击工具栏中的 "Run" -> "Run Configurations...",打开运行配置窗口,并双击STM32 C/C++ Application新建一个运行配置。 - 在运行配置的
Main配置页中,将C/C++ Application:配置为Release配置工程生成的elf文件(位于/Appli/Release中,需要在Release配置下 Build Project 才有该文件)。 - 在运行配置的
调试器配置页的External loaders中添加 STM32N647 开发板软件包中提供的External Loader文件。 - 点击运行配置窗口右下角的
Run,并等待烧录完成即可。
其他问题
把模板工程复制过来使用
复制以后,需要修改的地方仅有一处------把 .project 文件中原本的项目名称改成现在的名称即可。然后把 debug 和 release 文件夹删掉。
make: *** No rule to make target 错误原因、分析和解决办法
问题的产生的根本原因是工程更改路径或者更改了其中的文件夹名称之后,之前生成的 .o 和 .d 文件在再次编译时并不会重新编译,因而导致该问题。根源解决办法是删除编译后生成的文件夹。然后重新编译就行了。
STM32CubeMX 中,外设怎么配置
要先在右边的针脚图中选择外设对应的针脚,然后在左边选择外设。顺序别搞错了,否则配置不了外设的参数。
代码生成器中的配置都是什么
