刚买了 STM32F446,但 STM32IDE 没有达到我的预期

Just bought STM32F446 but the STM32IDE is not doing what I expect

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

  }

我安装了 STMCubeMX 并为 STM32 构建了一个项目IDE

在 IDE 我使用以下方法成功构建了项目:project -> build all

鉴于我的 while 循环完全空白,我希望看到默认 LED 停止闪烁,但它仍在疯狂闪烁。

尝试这个,非常简单,将测试您的工具和将文件复制到电路板的能力。我假设这是一块 NUCLEO 板。

.cpu cortex-m0
.thumb
.thumb_func
.global _start
_start:
stacktop: .word 0x20000100
.word reset
.word reset
.word reset
.word reset
.thumb_func
reset:
    b .

建设

arm-none-eabi-as flash.s -o flash.o
arm-none-eabi-ld -Ttext=0x08000000 flash.o -o flash.elf
arm-none-eabi-objdump -D flash.elf > flash.list
arm-none-eabi-objcopy -O binary flash.elf flash.bin

检查构建

猫flash.list

Disassembly of section .text:

08000000 <_start>:
 8000000:   20000100
 8000004:   08000015
 8000008:   08000015
 800000c:   08000015
 8000010:   08000015

08000014 <reset>:
 8000014:   e7fe        b.n 8000014 <reset>

看起来不错,正是我们想要的。

现在复制命令行或拖放flash.bin到插入NUCLEO板时安装的虚拟驱动器。它将把它加载到板上的目标 mcu 中。 STM32F446,应该重置它,你将进入这个循环,没有闪烁的用户指示灯。

当您制作更复杂的项目时,您只需在此 bootstrap 上扩展一个程序,链接(选中)并复制到虚拟闪存驱动器。

当我得到一块新的 NUCLEO 板时,我通常会对调试端(stlink 加上拇指驱动器)进行固件升级。 ST 提供了一个基于 Java 的工具,该工具本身并不经常更新,但它会检查电路板与我猜他们站点上的数据库,并且可以升级您的闪存。根据您的主机 OS 我有一些 NUCLEO,您只能复制几次或一次,并且您必须拔下并重新插入,这些问题的更新固件版本和更新的电路板几乎已经消失。它会说设备上没有剩余空间,unplug/replug 没问题。

还提供 stlink 功能,您可以使用 openocd 或其他工具停止并检查设备,例如,当您通过 telnet 登录到 openocd 服务器时,您可以使用 mdw 0x08000000 20 并检查用户闪存的启动查看它是否与您认为已加载到设备上的二进制文件匹配。根据部件的不同,您还可以 write/erase 通过 openocd 闪存,但不要假设所有 ST 或其他品牌部件始终都支持。从那里写入 ram 和 运行(不同的启动而不是向量 table)当然可以,但是闪烁需要有人将对每个部分或系列的支持添加到 openocd 中。

正如评论中所指出的,要么您没有按照您的想法构建,要么您实际上没有将程序加载到闪存中。检查二进制文件检查闪存以查看实际发生的情况(如果有的话)。以上应该避免所有成功的障碍,CMSIS,IDE 工具,STMCubeMX 等。一旦你能够成功,然后从两端(在这个简单的例子和​​你的项目之间)开始工作并找到真正的问题在哪里is/was。例如,您应该能够使用 IDE 和所有这些东西来构建二进制文件,使用 gnu 工具检查该二进制文件,使用 hexdump/whatever 检查 .bin 文件,然后拖放到外部IDE 进行编程。