单片机爬坑记-05-编译环境(完)

在搞定了 VSCode + Makefile 玩弄 TivaWare C 库的环境之后,我们很容易想到,是否能以同样的方式玩弄其他单片机库。基本套路是,确保系统环境能够直接通过命令行调用arm-none-eabi-gcc进行编译,然后通过Makefile来组织并完成编译。

目标对象:STM32全系列(ST)、NuTiny-SDK-M051(Nuvoton)、STC89C51(STC)。

1、STM32全系列(ST)

ST官方出了一款极为方便且跨平台的工具叫做STM32CubeMX,这很好,不需要再去下载各种BSP包慢慢裁剪、分割、修改,利用STM32CubeMX可以直接生成基于Makefile的工程,算是上手难度最低的官方库玩弄方式。

目前STM32CubeMX最新版本5.1.0。

首先,当然是用STM32CubeMX生成一个STM32工程代码,在STM32CubeMX中将硬件、时钟等等配置好之后,在Project Manager选项卡中,有“Toolchain / IDE”可以选择,看到可选项中有Makefile,就选它(此时“Toolchain Folder Location”不可更改,暂时不管),然后生成项目代码。

然后,打开项目文件夹,可以看到一个大大的Makefile,发现目标是让人激动的,按照一般操作,先打开Makefile文件检查一下编译链工具设置是否有问题,STM32CubeMX生成的Makefile依然是直接调用arm-none-eabi-gcc,环境同样没问题,很好,更激动了一点……但是这时候如果直接在命令行下make,结果可能是残酷的,在Windows 7 x64系统下,make会得到一个关于hex文件地址的错误,据称这是因为GNU工具链有个小bug,而通过检查Makefile文件的内容发现其中有

all: $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/%.hex $(BUILD_DIR)/$(TARGET).bin

$(BUILD_DIR)/%.hex: $(BUILD_DIR)/%.elf | $(BUILD_DIR)
     $(HEX) $< $@

这时候我们需要知道hex文件是否必须的,打开STC32的烧写软件可以看到能够接受的文件包括hex和bin,所以bin文件完全可以替代hex文件进行烧写,那接下来就好办,删除“all”所在行的$(BUILD_DIR)/%.hex,再将其余两行用#注释掉,保存,再make一下,OK!

针对开发过程中自行添加的库,头文件目录可在C_INCLUDES下方添加,C语言或汇编语言的代码文件可放在Src目录(main.c所在目录)下。

2、NuTiny-SDK-M051(Nuvoton)

Nuvoton官网下载的BSP包里是没有Makefile的,但是好在Nuvoton新出了一个魔改Eclipse的IDE,叫做NuEclipse,而Eclipse在编译时是可以生成Makefile的,所以我们就需要用NuEclipse生成Makefile。

喜剧的是,在Nuvoton推出的所有官方工具中,这魔改Eclipse版的NuEclipse,反倒是兼容性最好的,安装过程一路顺畅。

用NuEclipse新建一个工程(选择了芯片还得自己填容量,差评!),进到工程目录下可以发现工程目录没有包含官方库“StdDriver”中所有文件(虽然官方库文件出奇的少),而其他文件除了路径稍有不同之外基本和BSP中没什么区别,所以将BSP包中“Library\StdDriver\src”目录下的文件全部放到工程的“Library”目录下,在NuEclipse中对Library目录右键执行以下刷新“Refresh”操作,然后Build All(快捷键Ctrl + B),此时就可以看到在工程目录下的“Debug”文件夹中有了makefile,通过对该makefile分析可以看到实质上这里是引入了相对目录,但这个makefile文件却又不在工程根目录下,所以我们需要再新增一个Makefile来调用执行这个“Debug”文件夹中的makefile。

“Debug”文件夹中的makefile文件复制到工程根目录下,用文本编辑器打开,先将内容清空,然后增加如下内容:

DIRS = Debug

all::
     @for i in ${DIRS};                  \
      do                                 \
          if [ -f $${i}/makefile ];      \
          then                           \
              make -C $${i} || exit $$?; \
          fi;                            \
      done

保存后就可以在工程根目录下直接make完成编译。

当需要更改(新增)工程的头文件和代码文件(一般都是需要的,将代码全部写入至main.c文件是很恶心人的做法)时,最简单的办法是直接将头文件全部放入“Library\StdDriver\inc”文件夹下,将代码文件全部放入“Library”文件夹下,亦即和工程中的标准库文件放在一起……

3、STC89C51(STC)

参考项目:https://github.com/haozewu/C51

并不推荐用VSCode对51单片机进行开发,也未实际测试。

--------------------------------------------------

后续有空再看MSP430G2和FRDM-KL02Z的库函数玩弄方法,此部分待续……

原文地址:https://www.cnblogs.com/zarlinq/p/10459663.html

时间: 2024-10-12 06:06:37

单片机爬坑记-05-编译环境(完)的相关文章

单片机爬坑记-03-编译环境

Arduino IDE是最难用又最好用的单片机IDE,没有之一!难用之处在于没有自动补全(这一点最是难受,但又最是无处说理),库文档也常常不全,时不时就要开Source Insight看看库文件的源代码,很是麻烦:好用之处则在于库管理和开发板管理极为方便,调用某个库的时候需要#include的头文件也是一键完成,尤其适用于新建工程(先把所有头文件#include上)和库管理(开发板相关文件一般不怎么变动). 寻求一个"能自动补全.方便管理项目.省心省事不折腾.能跨平台作业"的IDE是自

单片机爬坑记-02-资源紧缺

当下FreeRTOS得到了Keil.STM32Cube MX等开发环境的大力支持,很大程度上无需再考虑移植等底层问题,简单设置后在代码中直接调用即可. 不得不说,这是激动人心的,RTOS的各项特性所带来的方便给予我们极大的诱惑,总觉得只要用好RTOS,我们能把单片机玩出各种花样,再也不用考虑什么全局变量.轮循顺序.执行时长等恼人的问题,只要设置好优先级.信号量和任务参数,剩下的就可以安心于用代码实现功能. 现实总是残酷帅毙的!Keil中一堆"--axf: Error: L6406E: No sp

.NET Core爬坑记 1.0 项目文件

前言: 之所以要写这个系列是因为在移植项目到ASP.NET Core平台的过程中,遇到了一些“新变化”,这些变化有编译方面的.有API方面的,今天要讲的是编译方面的一些问题.我把它们整理后分享出来,以便各位博友不要再遇到这些坑. 在Dotnet Core RC2版本中,project.json 管理着整个项目,包括编译文件.依赖包管理.版本信息.平台依赖与发布等功能. 关于项目中引用: 比如我们一般看到Project.json中一般会有如下内容: "dependencies": { &

webpack 爬坑记

1. css modules 里中划线命名的类名 在 css 中 类似 '.progress-bar' 这样带中划线的类名是合法的. 但是在 JS 里, 会把中划线当成减号, css modules 可能无法按我们的意图解析类名. 编译出来的东西放浏览器里运行,会在控制台里看到变量未声明的错误. 解决方法: 1. 假如我们是按这样引入样式 import styles from '../style/style.css'; 那么我们再引入里面的 '.progress-bar' 时得 {styles[

Git爬坑记

Git记录 使用git 也有一段时间了, git的入门级了解也就不再多说, 但平常使用中, 仍然会遇到很多问题, 在此记录一二. 在查资料的过程中, 发现了两个比较好的资料: 特别是第二个, 相当详细的 Git教程, 如果看完的话, 相信对 Git的使用理解已经基本不是问题了. 常用Git命令清单 Git 分支 - 何谓分支 Git基础命令 git config --global user.name "myname" git config --global user.email &qu

redis 从库数据同步失败——爬坑记

早上上班,发现redis的一个slave节点down了一个.对,没错,不是数据不同步那么简单,连redis服务进程都自动退出了. 场景:主从同步模式 master-->slave1 master-->slave2 master-->slave3 info状态: slave1,slave2 都是state=online,offset=5744884846,lag=1正常状态,slave3是state=send_bulk,offset=0,lag=0 1.重启redis操作 日志内容:WAR

爬坑记:内联元素的padding-top属性

midifan.com/moduleuser-index-449513.htmmidifan.com/moduleuser-index-449492.htmmidifan.com/moduleuser-index-449411.htmmidifan.com/moduleuser-index-449495.htmmidifan.com/moduleuser-index-449440.htmmidifan.com/moduleuser-index-436149.htmmidifan.com/modu

微信小程序爬坑记

1.this.setData修改数组里的值1).data: { hide:[true,true] },this.setData({ 'hide[0]': false});2).var str = "hide[" + id + "]"//重点在这里,组合出一个字符串 var 是在function里的this.setData({ [str]: false//用中括号把str括起来即可 })3)key-value类型data: { main_view_bgcolor: &

Spring-Data-JPA 爬坑记

一: 实体类的常用注解 2.1 @Entity 标识这个 pojo 是一个 jpa 实体 2.2 @Table(name = "表名") 指定类对应的数据库表名 2.3 @Id 标记某一字段为表主键 2.4 @GeneratedValue 标记主键生成策略 2.5 @Column 标记为字段,有如下属性 2.5.1 name 对应数据库的字段名,默认为 属性名 2.5.2 unique 是否唯一,默认 false 2.5.3 nullable 是否可以为空 默认为 true 2.5.4