Python intelhex 包

需求

拿到手一款NXP的LPC824-DIP开发板,好简单,与我之前的LPC812 Mini Kit一样简单:板载USB/UART转换IC,甚至使用了转换IC内部的LDO做供电,预留SWD引脚。

离开NXP之后,NXP/Freescale的工程和工具链就摸的少了。STM32F072的JLINK-OB不知道是否可以支持LPC824,或者拿个FRDM的板载CMSIS-DAP来试试看。

bin2hex转换

不过这么简单的MCU,可以采用编译下载和printf的方式。我目前用的最多的还是mbed在线编译器,它仅支持bin格式。而NXP推荐的FlashMagic只支持intel hex格式。而bin2hex的方法虽然有许多种,但是都嫌麻烦。Keil推荐的bin2hex早就落伍了,gcc的objcopy还需要记录一大堆参数。

Python intelhex包

忽然想起Python有一个intelhex包,重来没有用过,使用pip安装了一下:

pip install intelhex

转换下载

安装完毕后,在Python\Scripts下可以直接访问几个工具脚本:

> dir c:\Python27\Scripts\*hex*.py
 驱动器 C 中的卷是 HP_HDD
 卷的序列号是 48F7-515A

 c:\Python27\Scripts 的目录

2017/09/28  14:20             3,825 bin2hex.py
2017/09/28  14:20             4,684 hex2bin.py
2017/09/28  14:20             4,549 hex2dump.py
2017/09/28  14:20             2,857 hexdiff.py
2017/09/28  14:20             3,681 hexinfo.py
2017/09/28  14:20             6,214 hexmerge.py
               6 个文件         25,810 字节
               0 个目录 210,940,616,704 可用字节

我们把mbed产生的bin文件转换成hex格式。

allankliu@ALLANKLIU-HP C:\Users\allankliu\Downloads
> bin2hex.py -h
Bin2Hex convertor utility.
Usage:
    python bin2hex.py [options] INFILE [OUTFILE]

Arguments:
    INFILE      name of bin file for processing.
                Use '-' for reading from stdin.

    OUTFILE     name of output file. If omitted then output
                will be writing to stdout.

Options:
    -h, --help              this help message.
    -v, --version           version info.
    --offset=N              offset for loading bin file (default: 0).


allankliu@ALLANKLIU-HP C:\Users\allankliu\Downloads
> bin2hex.py mbed_blinky_LPC_LPC824.bin mbed_blinky_LPC_LPC824.hex

allankliu@ALLANKLIU-HP C:\Users\allankliu\Downloads
> hexinfo.py mbed_blinky_LPC_LPC824.hex
- file: 'mbed_blinky_LPC_LPC824.hex'
  data:
  - { first: 0x00000000, last: 0x00002AFF, length: 0x00002B00 }

我们可以看一下转换后的hex文件。

allankliu@ALLANKLIU-HP C:\Users\allankliu\Downloads
> hex2dump.py mbed_blinky_LPC_LPC824.hex
0000  00 20 00 10 DD 00 00 00 ED 00 00 00 E5 00 00 00  |. ..............|
0010  00 00 00 00 00 00 00 00 00 00 00 00 51 DD FF EF  |............Q...|
0020  00 00 00 00 00 00 00 00 00 00 00 00 E7 00 00 00  |................|
0030  00 00 00 00 00 00 00 00 E9 00 00 00 EB 00 00 00  |................|
0040  ED 00 00 00 ED 00 00 00 00 00 00 00 ED 00 00 00  |................|
0050  ED 00 00 00 ED 00 00 00 00 00 00 00 ED 00 00 00  |................|
0060  ED 00 00 00 ED 00 00 00 ED 00 00 00 ED 00 00 00  |................|
0070  ED 00 00 00 ED 00 00 00 ED 00 00 00 ED 00 00 00  |................|
0080  ED 00 00 00 ED 00 00 00 ED 00 00 00 ED 00 00 00  |................|
0090  ED 00 00 00 ED 00 00 00 ED 00 00 00 00 00 00 00  |................|
00A0  ED 00 00 00 ED 00 00 00 ED 00 00 00 ED 00 00 00  |................|
00B0  ED 00 00 00 ED 00 00 00 ED 00 00 00 ED 00 00 00  |................|
00C0  05 48 85 46 00 F0 12 FB 00 F0 EE F8 00 F0 86 F8  |.H.F............|
00D0  00 48 00 47 E5 02 00 00 00 20 00 10 04 48 80 47  |.H.G..... ...H.G|
00E0  04 48 00 47 FE E7 FE E7 FE E7 FE E7 FE E7 00 00  |.H.G............|
00F0  39 08 00 00 C1 00 00 00 F8 B5 17 46 0E 46 05 46  |9..........F.F.F|
0100  00 2B 07 D0 10 46 58 43 44 19 E4 1B 20 46 B0 47  |.+...FXCD... F.G|
0110  A5 42 FA D1 28 46 08 38 F8 BD 38 B5 05 46 68 46  |.B..(F.8..8..FhF|
0120  05 70 0C 46 08 68 00 23 01 22 69 46 01 F0 92 FC  |.p.F.h.#."iF....|
0130  00 28 02 D0 00 20 C0 43 38 BD E0 68 40 1C E0 60  |.(... .C8..h@..`|
0140  28 46 38 BD 30 B5 0B 46 01 46 00 20 20 22 01 24  |(F8.0..F.F.  ".$|
0150  09 E0 0D 46 D5 40 9D 42 05 D3 1D 46 95 40 49 1B  |...F.@.B...F.@I.|
0160  25 46 95 40 40 19 15 46 52 1E 00 2D F1 DC 30 BD  |%F.@@..FR..-..0.|
0170  03 46 0B 43 9B 07 03 D0 09 E0 08 C9 12 1F 08 C0  |.F.C............|
0180  04 2A FA D2 03 E0 0B 78 03 70 40 1C 49 1C 52 1E  |.*.....x.p@.I.R.|
0190  F9 D2 70 47 42 1C 01 78 40 1C 00 29 FB D1 80 1A  |..pGB..x@..)....|
01A0  70 47 10 B5 00 22 00 E0 52 1C 83 5C 8C 5C A3 42  |pG..."..R..\.\.B|
01B0  01 D1 00 2B F8 D1 D8 B2 E1 B2 40 1A 10 BD 30 B5  |...+......@...0.|
01C0  05 46 00 20 03 46 00 E0 5B 1C 93 42 05 D2 EC 5C  |.F. .F..[..B...\|
01D0  C8 5C 20 1A 01 D1 00 2C F6 D1 30 BD 70 B5 05 4C  |.\ ....,..0.p..L|
01E0  05 4D 03 E0 20 68 00 19 80 47 24 1D AC 42 F9 D1  |.M.. h...G$..B..|
01F0  70 BD 00 00 94 2A 00 00 98 2A 00 00 02 46 70 B5  |p....*...*...Fp.|
0200  4A 40 D3 0F DB 07 40 00 2D D0 4A 00 2A D0 01 0E  |J@....@.-.J.*...|
...
2900  6F 72 6B 73 70 61 63 65 2F 62 6D 5F 77 72 61 70  |orkspace/bm_wrap|
2910  2F 31 33 38 34 2F 6D 62 65 64 2D 6F 73 2F 74 61  |/1384/mbed-os/ta|
2920  72 67 65 74 73 2F 54 41 52 47 45 54 5F 4E 58 50  |rgets/TARGET_NXP|
2930  2F 54 41 52 47 45 54 5F 4C 50 43 38 32 58 2F 67  |/TARGET_LPC82X/g|
2940  70 69 6F 5F 61 70 69 2E 63 00 00 00 2F 68 6F 6D  |pio_api.c.../hom|
2950  65 2F 61 72 6D 2F 6D 62 65 64 5F 6A 65 6E 6B 69  |e/arm/mbed_jenki|
2960  6E 73 2F 77 6F 72 6B 73 70 61 63 65 2F 62 6D 5F  |ns/workspace/bm_|
2970  77 72 61 70 2F 31 33 38 34 2F 6D 62 65 64 2D 6F  |wrap/1384/mbed-o|
2980  73 2F 42 55 49 4C 44 2F 6D 62 65 64 2F 54 41 52  |s/BUILD/mbed/TAR|
2990  47 45 54 5F 4C 50 43 38 32 34 2F 54 41 52 47 45  |GET_LPC824/TARGE|
29A0  54 5F 4E 58 50 2F 54 41 52 47 45 54 5F 4C 50 43  |T_NXP/TARGET_LPC|
29B0  38 32 58 2F 67 70 69 6F 5F 6F 62 6A 65 63 74 2E  |82X/gpio_object.|
29C0  68 00 00 00 2F 68 6F 6D 65 2F 61 72 6D 2F 6D 62  |h.../home/arm/mb|
29D0  65 64 5F 6A 65 6E 6B 69 6E 73 2F 77 6F 72 6B 73  |ed_jenkins/works|
29E0  70 61 63 65 2F 62 6D 5F 77 72 61 70 2F 31 33 38  |pace/bm_wrap/138|
29F0  34 2F 6D 62 65 64 2D 6F 73 2F 74 61 72 67 65 74  |4/mbed-os/target|
2A00  73 2F 54 41 52 47 45 54 5F 4E 58 50 2F 54 41 52  |s/TARGET_NXP/TAR|
2A10  47 45 54 5F 4C 50 43 38 32 58 2F 70 69 6E 6D 61  |GET_LPC82X/pinma|
2A20  70 2E 63 00 2F 68 6F 6D 65 2F 61 72 6D 2F 6D 62  |p.c./home/arm/mb|
2A30  65 64 5F 6A 65 6E 6B 69 6E 73 2F 77 6F 72 6B 73  |ed_jenkins/works|
2A40  70 61 63 65 2F 62 6D 5F 77 72 61 70 2F 31 33 38  |pace/bm_wrap/138|
2A50  34 2F 6D 62 65 64 2D 6F 73 2F 70 6C 61 74 66 6F  |4/mbed-os/platfo|
2A60  72 6D 2F 6D 62 65 64 5F 63 72 69 74 69 63 61 6C  |rm/mbed_critical|
2A70  2E 63 00 00 98 2A 00 00 C0 00 00 10 68 00 00 00  |.c...*......h...|
2A80  4C 0E 00 00 00 2B 00 00 28 01 00 10 E8 01 00 00  |L....+..(.......|
2A90  5C 0E 00 00 D9 E3 FF FF 00 00 00 00 00 00 00 00  |\...............|
2AA0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  |................|
2AB0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  |................|
2AC0  00 00 00 00 80 C3 C9 01 00 87 93 03 00 00 00 00  |................|
2AD0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  |................|
2AE0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  |................|
2AF0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  |................|

话说回来,觉得HEX中带有这么多的源码字符串有些怪异,可能与mbed平台内调试需求有关联。但是最好有个编译开关能够把这些没有必要的调试信息给关闭。这在小资源MCU还蛮重要的。

下载测试

把HEX代码下载后,一开始没有任何动静。想想可能是LED的GPIO配置不同,改动代码后,重复了整合流程,绿色LED开始闪烁,UART也有输出了。好简单!

#include "mbed.h"

DigitalOut myled(LED2); // Change LED1 to LED2 on LPC824-DIP board
Serial pc(D1, D2);

int main() {
    while(1) {
        myled = 1;
        wait(0.2);
        myled = 0;
        wait(0.2);
        pc.printf(".");
        printf("#");
    }
}

改进余地

  • Python intelhex不仅提供了命令行工具软件,更重要的是可以实现批量的程序化定制,比如根据MCU的UID进行部分代码的加密。
  • LPC系列中,8051/ARM7/Cortex-M3/M4/M0/M0+,无论哪种内核,都可以直接使用串口的RTS等串口流控线来控制目标MCU的RST/ISP引脚,而且逻辑电平都是负电平。
  • Python pyserial可以很容易地操控流控引脚,继而操控RST/ISP来控制MCU的工作模式,可以用于自动读取UID,计算密钥,将密钥hex与原始hex进行合并,烧入固件,启动CRP代码保护,直至复位。
  • 基于这些设计,可以实现主机端(包括PC/平板和手机)动态更新MCU固件,在同一硬件上实现固件的动态功能变化。不过嵌入式系统往往不具备通用性,即时代码更新缺乏业务支点和市场需求。不过我个人觉得可以先拿通用遥控器来玩玩、试试。话说,好古老的需求。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • 1 mbed介绍 1.1 什么是mbed mbed是什么? mbed是一个面向ARM处理器的原型开发平台,它具体包...
    barryzxy阅读 12,513评论 1 16
  • # Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列...
    aimaile阅读 26,436评论 6 428
  • GitHub 上有一个 Awesome - XXX 系列的资源整理,资源非常丰富,涉及面非常广。awesome-p...
    若与阅读 18,612评论 4 418
  • 我没有华丽的辞藻,没有吸引人的故事, 我只是把我脑海中一闪而过的文字敲打下来, 我没有奢望多少人去阅读,我只是想记...
    笔畅意安阅读 712评论 1 2
  • 一 距离之远 今天外出培训学习,下地铁后不识路,抬眼刚好看到一个穿校服的初中女生戴着耳机迎面走来,一种自然的亲切感...
    鹿鸣阁主阅读 283评论 0 1