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 中,外设怎么配置

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

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

相关推荐
可乐鸡翅好好吃7 小时前
通讯协议--硬件模拟和软件模拟
stm32·嵌入式硬件
Zw-awa7 小时前
STM32F103C8T6 最小系统板:从型号差异到启动方式
stm32
新思维软件7 小时前
基于边缘计算与多模态感知的服药依从性系统|X604261
嵌入式硬件·物联网开发
天空'之城18 小时前
单片机基础核心知识点汇总(四十)
单片机·嵌入式硬件
LCG元18 小时前
STM32F103 驱动 HX711 称重实战:DOUT 就绪时序、增益切换陷阱与两点标定精度实测
stm32·单片机·嵌入式硬件
染予18 小时前
代码中相关C语言知识点总结
stm32
优信电子19 小时前
STM32 驱动 DHT30 测量环境温湿度(兼容SHT30):从时序解析到完整代码实战
stm32·嵌入式·传感器·sht30·温湿度·环境测量·dht30
小李不想当小白20 小时前
DMA直接存储器存取(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·分享
blue_ice .21 小时前
Verilog DDS 数字信号发生器:DAC 输出模拟波形与 ADC 回采观测
开发语言·单片机·嵌入式硬件·fpga开发
深圳市恒锐丰科技杨生21 小时前
EG4318 / EG4319 / EG4320 铅酸电池三段式充电副边管理芯片|屹晶 EGmicro
嵌入式硬件·硬件工程