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

    /* USER CODE BEGIN 3 */

  }

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

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

我希望看到默认导致停止闪烁,因为我的 while 循环完全是空白的,但它仍然像疯了一样闪烁。

4

1 回答 1

0

试试这个,非常简单,将测试你的工具和将文件复制到板上的能力。我认为这是一个 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

检查构建

cat 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 板时安装的虚拟驱动器。它将把它加载到板上的目标单片机中。STM32F446,应该重置它,你将进入这个循环,没有闪烁的用户 LED。

当您制作更复杂的项目时,您只需在此基础上扩展一个引导程序、一个程序、链接(检查)并复制到虚拟闪存驱动器。

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

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

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

于 2020-01-22T10:28:36.010 回答