首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用STM32CubeMX启动一个最小的项目?

如何用STM32CubeMX启动一个最小的项目?
EN

Stack Overflow用户
提问于 2018-05-15 16:10:34
回答 2查看 1.1K关注 0票数 1

我正在尝试学习嵌入式开发,我目前正在玩一个STM32F407G板。

到目前为止,我已经能够使用CubeMX提供的高级驱动程序API来切换基于用户按钮的LED。

但是,我现在想在没有任何API帮助的情况下重新创建相同的功能。相反,使用参考手册中提供的基本地址和寄存器,我想基本上重新创建API。

到目前为止,我已经使用GUI禁用了所有外围设备:

但我觉得有更好的方法。我不完全确定我确实需要哪些外设来调试板上的代码。

本质上,我需要足够的启动代码,以便能够加载(闪存?)将代码导入微控制器,并调试main()。其他一切(如切换LED、检测用户按钮中断等)都是我想要处理的事情。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-15 16:42:29

您不需要重新创建API。使用寄存器的玩笑程序。我几乎在所有的项目中都这么做(除非使用某种HAL是我的客户需求)。

你需要:

  1. 使用向量表启动代码。
  2. 为了方便起见,CMSIS头。

如何使用CubeMx将其存档。其实是很容易的。

  1. 创建项目
  2. 导入到您最喜欢的IDE。
  3. 在项目选项中删除USE_HAL_DRIVER定义
  4. 从构建(或删除)中排除/驱动器/STMxxxxx_HAL_Driver中的所有文件
  5. 从main.c文件中删除所有内容

添加:

代码语言:javascript
复制
#include "stm32f4xx.h" // CMSIS headers

int main(void)
{
}

并享受:)

票数 3
EN

Stack Overflow用户

发布于 2018-05-15 19:55:39

flash.s

代码语言:javascript
复制
.cpu cortex-m4
.thumb

.thumb_func
.global _start
_start:
stacktop: .word 0x20001000
.word reset
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang

.thumb_func
reset:
    bl notmain
    b hang
.thumb_func
hang:   b .

.align

.thumb_func
.globl PUT32
PUT32:
    str r1,[r0]
    bx lr

.thumb_func
.globl GET32
GET32:
    ldr r0,[r0]
    bx lr

.thumb_func
.globl dummy
dummy:
    bx lr

so.c

代码语言:javascript
复制
void PUT32 ( unsigned int, unsigned int );
unsigned int GET32 ( unsigned int );
void dummy ( unsigned int );

int notmain ( void )
{
    unsigned int ra;

    for(ra=0;ra<1000;ra++) dummy(ra);

    return(0);
}

flash.ld

代码语言:javascript
复制
MEMORY
{
    rom : ORIGIN = 0x08000000, LENGTH = 0x1000
    ram : ORIGIN = 0x20000000, LENGTH = 0x1000
}

SECTIONS
{
    .text : { *(.text*) } > rom
    .rodata : { *(.rodata*) } > rom
    .bss : { *(.bss*) } > ram
}

构建(不需要you eabi,使用此代码,您可以使用arm gnueabi或任何arm-gcc/as/ld(在合理范围内))。

代码语言:javascript
复制
arm-none-eabi-gcc -Wall -Werror -O2 -nostdlib -nostartfiles -ffreestanding  -mthumb -mcpu=cortex-m4 -c so.c -o so.o
arm-none-eabi-ld -o so.elf -T flash.ld flash.o so.o
arm-none-eabi-objdump -D so.elf > so.list
arm-none-eabi-objcopy so.elf so.bin -O binary

从我花了一段时间的笔记来看,你可以用dfu-util来写二进制文件。

dfu-util -d 0483:dfu 11 -c 1 -i 0 -a 0 -s 0x08000000 -D myprogram.bin

上面的功能不多,但是是一个框架,您可以添加gpio块的启用功能,使led引脚成为输出,然后用一些代码关闭或打开它,以便在循环中消磨时间。和/或轮询一个gpio引脚和驱动另一个匹配(使用按钮点燃或关闭一个led)。

openocd和这个董事会/家庭连接得很好.

你一开始就不需要中断或时钟提示(如果有的话)。

啊,不管你走哪条路,都要构建right...After,检查二进制文件,确保它有工作的机会。

代码语言:javascript
复制
08000000 <_start>:
 8000000:   20001000    andcs   r1, r0, r0
 8000004:   08000041    stmdaeq r0, {r0, r6}
 8000008:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 800000c:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 8000010:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 8000014:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 8000018:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 800001c:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 8000020:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 8000024:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 8000028:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 800002c:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 8000030:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 8000034:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 8000038:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 800003c:   08000047    stmdaeq r0, {r0, r1, r2, r6}

08000040 <reset>:
 8000040:   f000 f808   bl  8000054 <notmain>
 8000044:   e7ff        b.n 8000046 <hang>

08000046 <hang>:
 8000046:   e7fe        b.n 8000046 <hang>

向量表前面有堆栈指针,这很好,不用使用它,忽略stmdaeq反汇编--它只是试图反汇编向量条目,因为我使用objdump检查二进制文件。向量表需要奇数,条目ORRED的地址为1。从技术上讲,如果足够小,您可以在这些部件上使用0x00000000,因为在引导此代码时,它实际上就是映射的位置,但是由于它也是在0x08000000映射的,所以对于这些ST部件,您通常会看到这样做。如果你从另一个家族(NXP、Atmel/Microchip等)切换到另一个基于皮层的部分,那么您可能需要使用另一个地址,无论是0x00000000还是该部分家族使用的其他地址。

如果您没有看到像这样的二进制的开头与堆栈指针init值和向量表,那么您不太可能对booting...no有多大的运气,不管你选择什么样的库/软件路径。

注意,在对这个问题的评论中给出了正确的答案。它主要是基于意见的。有多种库解决方案,随着时间的推移,供应商将不断地改变它们,以满足各种(一般是非技术的)需求。在职业上,你应该能够走上任何一条路,真正赤裸的金属,或一些沙箱或在中间的某处。如果你不写所有的代码,并且使用你仍然负责这个项目的人,那么你应该花时间去挖掘它,检查代码的质量和准确性。你应该对你发现的东西感到惊讶,你拥有它,如果你不喜欢和/或更换它,你应该修复它。

路径既不会自动更简单,也不会更快,也不会更可靠。没有正确的答案,所以你需要灵活。

文档和库代码都是错误的,请期待这个,期望能够处理这个问题。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50354795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档