6378|7

7815

帖子

56

TA的资源

裸片初长成(中级)

楼主
 

GNU_ARM系列:可用于STM32F3 Discovery的例程 以及 makefile注释理解版 [复制链接]

本帖最后由 辛昕 于 2014-12-6 01:55 编辑

       晚上我又接着看了 我之前寄予厚望的 LibOpenCm3.没想到,连编译都无法通过。而且能发现的情况是,不是小问题。好些头文件的位置完全不对,不是差什么路径的问题。要是逐个逐个改,按道理应该是可以解决,可惜实在太多了,而且做起来遇到了不少麻烦。

      于是我开始放弃,中途我又折回去研究过一下 GNU_ARM工具里的例程,打算研究研究makefile要是有一丁点能看懂,理解,修改的可能性就好了。
可是看来看去还是不行......

      时间过得很快,当我看到11点多的时候,突然感到很麻烦。想了想,我只不过是想找到一个可以编译真正跑起来的例程,作为一个我研究通用写法做法的起点而已。我完全可以找一个更简单的例程。只要有makefile和ld就好了。

     于是我决定去搜索,我就跑到GitHub上搜索。GitHub上能搜到的不多,所幸(当然,如果是不幸的话,我就会通过其他途径继续搜索)。
     所幸,我居然找到一个 stm32f3 discover的例程!我手头恰好有这个板子,而且我就一直在这个上面玩gnu_arm的尝试。

     找这种单纯例程的好处是,不像 libopencm3或者gnu_arm这种一样,因为它们的定位是通用,因此相关的makefile或者ld文件就会显得比较复杂,我作为一个入门的看起来会非常痛苦。甚至连编译都成问题(刚才已经试过了)

     果然,我马上下载下来,打开编译,噢yes!编译通过,成功了。为了验证果然能用。
     我打开程序,这才发现原来这个程序居然还是官方释出的例程版本的内容。于是,我把八个LED轮流闪烁改成了四个LED轮流闪烁,然后st-util烧进去,噢yes!!成功!

     今晚没时间继续往下倒腾了。只能放到周末什么的了。我先把文件发上来。编译起来很简单。解压文件,直接在根目录下,在msys环境下 make clean
make就可以了。       这个makefile特别好的地方还在于,它直接给你加入了 objcopy转换成bin的命令。你可以直接得到相应的bin文件直接烧写就可以。
      另外就是,这个makefile还生成可以用于gdb调试的镜像。


      总之,我想,它将是我们学会自己写自己的makefile以及ld,并适应自己的板子,cpu的良好起点!

      PS:我在github上没搜到 针对stm32f0(30)的例子,如果你用的是这个你可以到其他地方试试搜索——建议雅虎英文搜索,别用百度中文,百度英文没用,太多乱七八糟的破玩意,没用。
       github上还有 stm32f4xx的(但不是discover的版本),或者stm32fvl discover的版本,如果你碰巧有这两个板子,可以下来试试。
       随后,我会试图慢慢理解这些makefile ld,然后自己把它改造成可以用于不同芯片的版本。
       到了那一步,那这个事情才算真的可以告一段落了.
stm32f3discovery-test-c-master.zip (509.85 KB, 下载次数: 79)

stm32f3discovery-test-c-master.zip (509.85 KB, 下载次数: 79)

此帖出自编程基础论坛

最新回复

mark 就该这么干  详情 回复 发表于 2016-12-23 20:33
点赞 关注
 

回复
举报

5979

帖子

8

TA的资源

版主

沙发
 
so good!
此帖出自编程基础论坛
 
个人签名生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙
===================================
做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

板凳
 
那什么
今晚把makefile看了看,这个makefile稍微简单点——没有复合包含,没有什么太复杂的命令。

偶把几个地方注释了也基本看懂了。

然后试着拿在 stm32f3的资料里——我在里面挑出相关的代码和文件,然后跑到自己建立的一个最最简单的 led闪烁项目,修改了一下makefile
oh,yeah

搞定了

至于ld,这玩意我觉得我一时半会很难看得懂,而又不同于 makefile需要时时根据新的项目配置去修改也就没办法了。

下一步我打算玩一票更独立点的。
其实也是现实所需。

因为我目前还是在f0上玩的多,这块f3还没怎么玩。
我决定在f0上,自己再做一次。

这样我也就获得了f0的版本,当然,届时我会按照我的习惯来组织代码。

然后接下去我就有可能考虑如何使用 stlink的gdbserver

当然在那之前或者之后,我会把 led timer uart这典型的 入门三件完成。

然后再找个ide,把这个工具链整进去。

其实我还是很喜欢图形化ide的。
其实只要把 背后的操作搞明白,那么这一步其实是不难的。

我原来想着用大一统的codeblocks。不过后来想了想,无所谓了,但也许最后我会把它安在qtcreator上,毕竟我发现我很喜欢它的长相。
是的是的,最近发现自己特么开始纠结软件的界面了。

比如今天下午突然抽风,因为嫌弃 白纸黑字太难看,从希望找个漂亮的编辑器于是倒腾了个把两小时的 代码编辑器,最后意识到其实我只要调整 背景色和前景色就可以得到我喜欢的 非白底 效果。

最后我忽然想起 Ubuntu的紫色终端。

结果我的mdk npp都变成了 41,0,40
哦,这是那个紫色的rgb值,本来最近就在做tft屏,对颜色已经习惯性用rgb精确描述了~~

不说太多了,这事情暂时可以先押一押,毕竟手头还有很多事情要做。

上周倒腾这玩意把正儿八经加班忘到脑后,这次还得加班可不能这样否则会很惨。。。。。。

不过经过这么一周的倒腾,我也算是修成正果了,总算把GNU工具链玩起来了!!

好,先上我加上注释帮助理解的 makefile.

此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

4
 
PROJ_NAME = stm32-serialtest-firmware

##########################################
# Toolchain Settings
##########################################

# 工具链系列宏
TC = arm-none-eabi

CC      = $(TC)-gcc
OBJCOPY = $(TC)-objcopy
OBJDUMP = $(TC)-objdump
SIZE    = $(TC)-size
DBG     = $(TC)-gdb

##########################################
# Files
##########################################

# wildcard 是啥意思呢? 果然没猜错,类似于展开所有同后缀的 文件名

USER_SRCS      = $(wildcard ../src/*.c)
USER_SRCS_CXX  = $()
STDPERIPH_SRCS = $(wildcard ../src/stm32f4_driver/*.c)
STARTUP_SRC    = $(wildcard ../src/Hardware/*.c)
STARTUP_SRC_S  = $(wildcard ../src/Hardware/*.s)
BOARD_SRC      = $()

# W 是换行或者连接 一类的意思吗? 对,就是连接的意思。去了他,就必须把它们写到一行里,(OBJ起头,这应该是 宏)
# 这还不是一个简单的W,中间有个横杆的东西,但这到底怎么打呢?哦,原来他是 斜杠,\,在makefile里打,你怎么打都会出这个
# -lm -lc 都是什么库? m的确是数学库,那c难道是标准c库?是的;但其实可以不加,只是一个问题是,它这里难道是选择那个nano库?

OBJS       = $(USER_SRCS:.c=.o) \
                         $(USER_SRCS_CXX:.cpp=.o) \
                         $(STDPERIPH_SRCS:.c=.o) \
                         $(STARTUP_SRC:.c=.o) \
                         $(STARTUP_SRC_S:.s=.o) \
                         $(BOARD_SRC:.c=.o)

INCLUDES   = -I../src/Hardware/ \
               -I../src/stm32f4_driver/ \
               -I../src/

LIBS       = -lm -lc

##########################################
# Flag Settings
##########################################
# MCU处 选择 内核 thumb模式
MCU        = -mthumb -mcpu=cortex-m4
FPU        = -mfpu=fpv4-sp-d16 -mfloat-abi=softfp

# DEFINES 是定义项目全局宏

DEFINES    = -DSTM32F3XX -DUSE_STDPERIPH_DRIVER \
             -DSTDOUT_USART=1 -DSTDERR_USART=1 -DSTDIN_USART=1

# -ffunction-sections -fdata-sections 这几个位置我什么地方都见得到,却不知道什么意思
# 干脆试试换用之前的一些部件,看看问题出在哪,比如换一下ld
# 原来是 STM32F303VC_FLASH.ld,换了从atollic中取得的 STM32_FLASH.ld没问题。
# gcc.ld有很多问题,看来它是问题之一。

CFLAGS     = $(MCU) $(FPU) $(DEFINES) $(INCLUDES) \
               -g -Wall -O0 -ffunction-sections -fdata-sections
ASFLAGS    = $(MCU) $(FPU) -g -Wa,--warn -x assembler-with-cpp
LDFLAGS    = $(MCU) $(FPU) -g -gdwarf-2 \
               -Tld/STM32F303VC_FLASH.ld \
               -Xlinker --gc-sections -Wl,-Map=$(PROJ_NAME).map \
               $(LIBS) -o \
               $(PROJ_NAME).elf \
               --specs=nano.specs

##########################################
# Flash Settings
##########################################
FLASH = $(FLASH_SPAWN) $(FLASH_HALT) $(FLASH_WRITE) $(FLASH_EXIT)
FLASH_SPAWN = spawn telnet localhost 4444;
FLASH_HALT  = expect \"> \"; send \"reset halt\n\";
FLASH_WRITE = expect \"> \"; send \"flash write_image erase ../$(PROJ_NAME).elf\n\";
FLASH_EXIT  = expect \"> \"; send \"exit\n\"; interact

##########################################
# Targets
##########################################
all: $(PROJ_NAME).bin info

$(PROJ_NAME).elf: $(OBJS)
        @$(CC) $(OBJS) $(LDFLAGS)
        @echo $@

$(PROJ_NAME).bin: $(PROJ_NAME).elf
        @$(OBJCOPY) -O binary $(PROJ_NAME).elf $(PROJ_NAME).bin
        @echo $@

# 原来真的还可以指定生成的文件格式的,就在这里
info: $(PROJ_NAME).elf
        @$(SIZE) --format=berkeley $(PROJ_NAME).elf

.s.o:
        @$(CC) $(ASFLAGS) -c -o $@ $<
        @echo $@

.c.o:
        @$(CC) $(CFLAGS) -c -o $@ $<
        @echo $@

.cpp.o:
        @$(CC) $(CFLAGS) -c -o $@ $<
        @echo $@

clean:
        rm -f $(OBJS)
        rm -f $(PROJ_NAME).elf
        rm -f $(PROJ_NAME).bin
        rm -f $(PROJ_NAME).map
        rm -f .flash

debug: .flash
        $(DBG) -x gdb/gdb.script \
          -s $(PROJ_NAME).elf \
          -interpreter=mi2

flash: .flash
.flash: $(PROJ_NAME).elf
        expect -c "$(FLASH)"
        touch .flash
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

5
 
先睡觉

关于这个makefile中,和编译,链接有关的部分是我最关心的,因此主要注释集中于这部分。

至于一些附带的比如后面的生成gdb debug 和 flash操作的部分,我不是很懂,而实际上我也没用——理解了没?
这是属于这个make的附带参数所引发的操作。
也就是说实际上因为我从来没写什么
make debug
make flash
所以实质上,这些功能我都没用到。

太晚了太困了,额~~先睡先睡。

这一步迈开了基本标志着搞定了,虽然接下去还有很多细节的活,不过接下去我也得暂时从这里抽出高度注意的精神,去先处理一些其他事情,所以后续的很多事情会押后。

大家不要揍我~~
此帖出自编程基础论坛

赞赏

1

查看全部赞赏

 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

3028

帖子

0

TA的资源

五彩晶圆(初级)

6
 
总之,我想,它将是我们学会自己写自己的makefile以及ld,并适应自己的板子,cpu的良好起点!
顶楼主
此帖出自编程基础论坛
 
 
 

回复

7608

帖子

18

TA的资源

五彩晶圆(高级)

7
 
支持继续完善下去,建议把重点作为总结单列出来突出经验,便于大家轻松之余能抓住主脉
此帖出自编程基础论坛
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

8
 
mark
就该这么干
此帖出自编程基础论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表