前言
本文引用地址:http://www.eepw.com.cn/article/201706/346836.htm
目前嵌入式开发平台按照性能可以分为两类,一种是CPU只有数十兆的单片机,一种是比较高级的可以跑Linux甚至Android的嵌入式平台(其实iPhone、Android手机都属于嵌入式产品)。
后者一般基于Linux/unix操作系统做交叉编译,但是前者往往更多的是在Keil上做开发,但由于本人个人关系,比较不喜欢Keil界面,所以一般在做嵌入式开发的时候,都会优先考虑是否有Linux/unix类的SDK(指包含编译工具)。但似乎Mac OSX上做嵌入式开发的人员较稀少,hum...因此资料也会相对较少。
本文所举例子,是千千万万种嵌入式芯片的一种,并不具备普遍性,但读完本文应该也会让你略有收获。
系统环境
操作系统: OS X EI Capitan (10.11.5)
硬件平台: nRF51822 (Nordic BLE 芯片)开发板
什么是嵌入式开发 ?
基于嵌入式平台所进行的底层开发,我们称之为“嵌入式开发”。
那么现在传说中的程序猿,哪些猿类是属于嵌入式开发的呢?
举个列子:虽然手机属于嵌入式设备,但目前人数众多的APP开发者不属于嵌入式开发,而是属于应用开发人员(因为他们都是基于手机操作系统进行编程的)。但手机厂家中那些开发手机底层驱动和底层应用的人员则属于嵌入式开发。
目前,因近几年移动互联网的大力发展,使得 Web猿 和 APP猿 族群最为庞大。
什么是交叉编译?
简单来说,在C语言(包括但不限于)编译过程中会分为四个阶段: 预处理 -> 编译 -> 汇编 -> 链接
但是在以上过程中,需要占用“大量资源”,在嵌入式设备(嵌入式设备的设计要诀之一就是能省则省)中并不具备该资源(如编译器、足够快的CPU、内存等),所以需要借助我们的PC平台进行编译。这种在一种平台编译,另一种平台运行的编译,我们称之为交叉编译。
程序是怎样被创造的?
在程序被创造到用户手上的过程中,除了系统提供的APIs,程序员需要三种必不可少工具:
输入工具:代码编辑器,如 Vim,Notepad++、Sublime
编译工具:编译器,可以将人类所写的代码转化为机器能懂的二进制文件,如 GCC、Clang、Javac
测试工具:程序所运行的环境,如iPhone、Android、PC(Linux、Mac、Windows)
集成了以上前两项工具的工具,我们称之为IDE,如Xcode、Visual Studio 、Eclipse、Keil。
nRF51822开发工具
如果你想要跟随本文一起实验,首先,你需要购入一块nRF51822开发板,像这样的:
本文主要介绍Mac上的软件开发工具,在nRF51822开发过程中,软件我们需要SDK、编译器以及J-Link驱动软件:
nRF5-SDK:SDK由厂商提供,点击进入官方网站后,选择目前最新的11.0.0版本进行下载:
编译器:下载好官方SDK后,打开SDK中的Makefile.posix文件,可以看到该版本SDK所用的gcc编译器版本。
进入到gcc-arm官网后,选择相对应版本的编译器下载(相对于Linux和Windows的下载量,Mac版本好惨淡... =_=)
J-Link驱动:nRF51822采用 J-Link进行程序下载,所以我们需要下载Mac版的J-Link驱动。
nRF51822环境搭建及测试
安装编译器
将下载好的编译工具链解压到 /usr/local 目录下:
sudo tar -jxvf gcc-arm-none-eabi-4_9-2015q1-20150306-mac.tar.bz2 /usr/local/
执行后查看是否成功:
编译例子
进入到下载好的SDK中,找一个例子,如:
cd $(nRF_51SDK)/examples/ble_peripheral/ble_app_beacon/pca10028/s130/armgcc
make all
编译完成后,会生成相对应的bin文件:
下载固件至开发板
J-Link方式写入
在安装完J-Link_for_mac版工具后,我们可以看到系统中已经有了以下命令行工具:
利用命令行进入J-Link提供的shell中:
JLinkExe -device nrf51822_xxaa -if swd -speed 4000
-device 指定了芯片类型,J-Link支持的开发板类型可在jlink_supported_devices查询。
输入烧录命令:
J-Link >loadbin s130_nrf51_2.0.0_softdevice.hex 0
J-Link>loadbin nrf51422_xxac_s130.hex 0x1B000
J-Link>r
J-Link>go
loadbin是烧录的命令,*.hex是烧录的固件,0x1B000是烧录地址。r是reset,go是启动。
当flash出现错误时,我们需要擦除falsh,此时我们要用Magic方法,分别往两个地址中写入1和2:
J-Link>w4 4001e504 2
J-Link>w4 4001e50c 1
可以在Makefile.posix中添加如下命令,让编译完成后自动烧录:
GNU_INSTALL_ROOT := /usr/local/gcc-arm-none-eabi-4_8-2014q2
GNU_VERSION := 4.8.3
GNU_PREFIX := arm-none-eabi
GDB_PORT_NUMBER := 9992
FLASH_START_ADDR = $(shell $(OBJDUMP) -h \
$(OUTPUT\_BINARY\_DIRECTORY)/$(OUTPUT_FILENAME).out -j .text | grep .text | awk {print $$4})
JLINK_OPTS = -device nrf51822 -if swd -speed 4000
JLINK_GDB_OPTS = -noir
JLINK = JLinkExe $(JLINK_OPTS)
JLINKD_GDB = JLinkGDBServer $(JLINK_GDB_OPTS)
flash-jlink: flash.jlink
$(JLINK) flash.jlink
flash.jlink:
printf loadbin $(OUTPUT\_BINARY\_DIRECTORY)/$(OUTPUT_FILENAME).bin $(FLASH_START_ADDR)\nr\ng\nexit\n > flash.jlink
erase-all: erase-all.jlink
$(JLINK) erase-all.jlink
erase-all.jlink:
# Write to NVMC to enable erase, do erase all, wait for completion. reset
printf w4 4001e504 2\nw4 4001e50c 1\nsleep 100\nr\nexit\n > erase-all.jlink
run-debug:
$(JLINKD\_GDB) $(JLINK_OPTS) $(JLINK\_GDB\_OPTS) -port $(GDB_PORT_NUMBER)
.PHONY: flash-jlink flash.jlink erase-all erase-all.jlink run-debug
利用官方提供的命令行工具
在 官方固件下载列表中提供了命令行工具:nrfjprog and mergehex。
其中nrfjprog用于烧录程序,mergehex用于合并hex文件。安装好nrfjprog和mergehex工具后,我们只需要在上述的工程目录下,输入:
make flash #烧录应用程序
make flash_softdevice #烧录系统内核
即可完成固件的烧写。
至此,nRF51822 在Mac中的开发环境搭建完毕。
原网址: 访问
创建于: 2020-06-21 15:15:02
目录: default
标签: 无
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论