参考文章:http://www.stmcu.org/module/forum/forum.php?mod=viewthread&tid=603753&highlight=ubuntu

准备工具:

arm-none-eabi-gcc

https://launchpad.net/gcc-arm-embedded/+download

stm32f4官方库

http://www.stmcu.org/document/list/index/category-150#524(搜索STSW-STM32065)

vs code(看代码用)

建立工程文件夹

stlib/inc和stlib/src这两个文件夹是官方库文件夹里面的inc和src,分别对应.h和.c



stlib/cminc里面是官方库里面的

startup_stm32f40xx.S(后缀S要改成大写)是使用官方库里面TrueStudio的启动文件(注:不可以使用MDK的)

stm32f4xx_conf.h, stm32f4xx.h, system_stm32f4xx.c, system_stm32f4xx.h这几个文件到官方库相应地方复制过来就好了。

STM32F407ZET6_FLASH.ld是从官方库的project/STM32F4xx_stdPeriph_Templates/TrueSTUDIO/STM32F40_41xxx/STM32F417IG_FLASH.ld改名而来的,后面还会修改该文件,使得可以用在407ZET6上

根目录中的main.c,Makefile是自己创建的main。c写自己的程序,Makefile用于编译工程

stm32f4xx_it.c, stm32f4xx_it.h是从官方库中拿来负责写中断函数

arm-none-eabi-gcc安装

解压到任意文件夹,把arm-none-eabi-gcc里的bin文件夹添加到环境变量,注销然后在命令行中输入arm-none-eabi-gcc -v如果显示了版本就说明安装成功

编写Makefile

# 添加包含路径
vpath %.S stlib
vpath %.c stlib stlib/src
vpath %.h stlib stlib/cminc stlib/inc DEFS += -DUSE_STDPERIPH_DRIVER INCS += -Istlib -Istlib/cminc -Istlib/inc # 使用其他外设在这里添加
OBJS += main.o
OBJS += stlib/startup_stm32f40xx.o
OBJS += stlib/system_stm32f4xx.o
OBJS += stlib/src/stm32f4xx_syscfg.o stlib/src/stm32f4xx_gpio.o # 使用了编译优化和硬件浮点数
CFLAGS += -mcpu=cortex-m4 -mthumb -Wall
CFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16
CFLAGS += -Os
CFLAGS += -ffunction-sections -fdata-sections LFLAGS += -mcpu=cortex-m4 -mthumb
LFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16
LFLAGS += -Wl,--gc-sections # 最后生成的bin文件
all:blink.bin clean:
@rm -f $(OBJS) $(OBJ_FLASH) $(OBJ_SRAM)
@rm -f blink.bin blink.elf blinks.bin blinks.elf blink.bin:blink.elf
@arm-none-eabi-objcopy -O binary -S $< $@
blinks.bin:blinks.elf
@arm-none-eabi-objcopy -O binary -S $< $@ blink.elf:$(OBJS) $(OBJ_FLASH)
@arm-none-eabi-gcc $(LFLAGS) $^ -Tstlib/STM32F407ZET6_FLASH.ld -o $@
@arm-none-eabi-size $@ burn:blink.bin
@st-flash write $< 0x08000000 %.o:%.S
@echo cc: $<
@arm-none-eabi-gcc $(CFLAGS) -c $< -o $@
%.o:%.c
@echo cc: $<
@arm-none-eabi-gcc $(CFLAGS) $(DEFS) $(INCS) -c $< -o $@

修改STM32F417IG_FLASH.ld文件

该文件是定义了芯片内存中的代码的存放位置

我们的芯片是stm32f407zet6,RAM是192k(128K SRAM , 64K CCMRAM),flash是512K

修改地方如下

34行

_estack = 0x20020000; /* end of RAM */

43到46行

MEMORY
{
FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 512K
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K
}

修改stlib/stm32f4xx.h

70行去掉#define STM32F40_41xxx的注释

186行添加#define __FPU_USED 1开启芯片的FPU(硬件浮点运算)

编写main函数

打开main.c

#include "stm32f4xx.h"
#include "stm32f4xx_syscfg.h"
#include "stm32f4xx_gpio.h" int main(void)
{
return 0;
}

最后make一下就可以生成.bin文件,然后就可以使用openocd烧写进芯片

arm-none-eabi-gcc,makefile,stm官方库构建stm32f4xx工程的更多相关文章

  1. linux脚本: makefile以及链接库

    Linux makefile 教程 非常详细,且易懂 http://blog.csdn.net/liang13664759/article/details/1771246 //sort.c #incl ...

  2. 关于如何使用Altium Designer 10以上版本官方库

    开卷有益:如果本帖不适合在此板块,请斑竹自行删除,发帖的目的纯属报答各位Amofans.    Altium公司的Altium Designer 09版本及以下还能到Altium官网下载第三方Labr ...

  3. [转]Linux下用gcc/g++生成静态库和动态库(Z)

    Linux下用gcc/g++生成静态库和动态库(Z) 2012-07-24 16:45:10|  分类: linux |  标签:链接库  linux  g++  gcc  |举报|字号 订阅     ...

  4. gcc编译动态和静态链接库

    我们通常把一些公用函数制作成函数库,供其它程序使用.函数库分为静态库和动态库两种.静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库.动态库在程序编译时并不会被连接到目标代码中,而是 ...

  5. gcc 动态编译 动态库路径

    gcc 动态编译(共享库) 动态编译的可执行文件需要附带一个的动态链接库,在执行时,需要调用其对应动态链接库中的命令优点:体积小,编译快缺点:依赖性高 代码如下: [root@74-82-173-21 ...

  6. gcc -rpath 指定动态库路径

    gcc -rpath 指定动态库路径 http://blog.csdn.net/v6543210/article/details/44809405

  7. GCC编译动态和静态链接库例子

    我们通常把一些公用函数制作成函数库,供其它程序使用.函数库分为静态库和动态库两种.静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库.动态库在程序编译时并不会被连接到目标代码中,而是 ...

  8. (4)ardunio 矩阵求解官方库改造,添加逆的求解

    多此一举,原来官方库给了求逆的函数,在源码里 除此之外,还有转置矩阵,只不过样例没显示出来. //Matrix Inversion Routine // * This function inverts ...

  9. libpomelo 增加编译静态库cocos2d-x xcode 工程

    离 https://github.com/NetEase/libpomelo 下载最新版本.拉开拉链,静态库 ./pomelo_gyp -DTO=ios ./build_ios ./build_ios ...

随机推荐

  1. Hadoop YARN配置参数剖析—RM与NM相关参数

    注意,配置这些参数前,应充分理解这几个参数的含义,以防止误配给集群带来的隐患.另外,这些参数均需要在yarn-site.xml中配置. 1.    ResourceManager相关配置参数 (1) ...

  2. 关于Java中计算日期差值不准确问题

    1.字符串日期相减 如:2016-4-1,必须先将此字符串转成Date对象,并且, 格式必须为:yyyy—MM—dd  HH:mm:ss. 如果不转就直接计算(2016-4-1)两个这样的日期,则误差 ...

  3. Cocos2d-JS地图性能问题

    如图所示游戏场景,它是我们以往介绍的实例,在场景中有三个方块精灵(BoxA.BoxB和BoxC)和背景精灵,这个背景叫做“地图”有点牵强,地图采用了有规律的纹理. 游戏场景 那么我们如何设计这个游戏地 ...

  4. JavaScript学习笔记 - 进阶篇(2)- 数组

    什么是数组 我们知道变量用来存储数据,一个变量只能存储一个内容.假设你想存储10个人的姓名或者存储20个人的数学成绩,就需要10个或20个变量来存储,如果需要存储更多数据,那就会变的更麻烦.我们用数组 ...

  5. 理解C#系列 / 结束

    结束 开始写的原因 因为不知道自己有多牛. 因为需要一个备忘录. 因为要把知识梳理清楚,以便机器学习. 结束写的原因 因为想知道自己有多牛,不是把知识统统都摆出来,而是运用知识去做出东西来. 即将开发 ...

  6. (转)对DotNet分布式应用搭建的考虑

    设计前的考虑和准备工作 1 对业务需求的理解重要性远远胜于对技术架构的理解 2 架构包含技术架构和业务架构 3 没有万能和通用的架构,只有符合自身业务需求的架构 4 架构本身的复杂性要截至在架构设计阶 ...

  7. 防止双击选中html中文字

    在开发过程中很常用的会给<span></span>等内联元素增加一个onlick事件,但是经常发生的一件事情就是点击的时候,选中了span中的字体:倒是不影响主逻辑,但是很难受 ...

  8. 基础学习总结(六)--getContentRolver()的应用、内容监听者ContentObserver

    ContentResolver / getContentResolver()   外界的程序通过ContentResolver接口可以访问ContentProvider提供的数据,在Activity当 ...

  9. net.sf.json.JSONException: java.lang.NoSuchMethodException

    在尝试将json对象转换为list时候出现了如下错误 Exception in thread "main" net.sf.json.JSONException: java.lang ...

  10. 关于Protobuf在游戏开发中的运用

    最近在研究protobuf在项目中的使用,由于我们项目服务端采用的是C++,客户端是cocos2dx-cpp,客户端与服务端的消息传输是直接对象的二进制流.如果客户端一直用C++来写,问题到不大,但是 ...