历史上的今天
返回首页

历史上的今天

今天是:2025年03月25日(星期二)

正在发生

2021年03月25日 | 为mspdebug的prog命令添加烧写uuid序列号的功能

2021-03-25 来源:eefocus

msp430系列单片机是不包含唯一序列号的,想用?Sorry,自己烧写到flash里面去!

虽然这个功能使用mspdebug的mw命令很容易实现,可难道每烧写一块单片机都要执行一次uuidgen命令,然后将序列号粘贴在mw命令里,uuidgen的输出还得分割成一个字节一个字节才能使用,这样实在是有点麻烦。


一直说Linux代表了freedom,代表了unlimited possibility,眼下这个情况,正是发挥源代码魔力的机会^_^


Step 1:在sourceforge上下载mspdebug的源代码

http://mspdebug.sourceforge.net/index.html

安装库依赖:

[root@localhost msp430]# yum install readline

[root@localhost msp430]# yum install readline-devel

[root@localhost msp430]# yum install libusb

[root@localhost msp430]# yum install libusb-devel


编译源代码:

[maria@localhost msp430_workspace]$ tar xvf mspdebug-0.23.tar.gz

[maria@localhost msp430_workspace]$ cd mspdebug-0.23/

[maria@localhost msp430_workspace]$ make


创建软链接并在单片机代码目录运行它:

[root@localhost constant_current]# ln -s /home/maria/maria_work/msp430_workspace/mspdebug-0.23/mspdebug /usr/bin/mspdebug-new

[root@localhost constant_current]# mspdebug-new -j uif -d /dev/ttyUSB4


(它和运行mspdebug的效果是一样的。)

(ttyUSB4是仿真器FET430UIF对应的设备号。)

(这里就不要用make install了,从mspdebug源代码目录运行,不要覆盖原来的版本。)


Step 2:修改ui/devcmd.c文件:


#include

#include


#define UUID_TEST "/home/maria/.mspdebug/uuid_test"


static int do_cmd_prog(char **arg, int prog_flags)

{

/* 原来的内容不要动它 */

/* mw the uuid to 0xF000*/

int pid;

if ((pid = fork()) < 0) {

printc_err("Cannot fork child.n");

goto END;

} else if (pid == 0) {

FILE *file;

printc("==> child: fopen uuid_testn");

if ((file = fopen(UUID_TEST, "w+")) == NULL) {

printc_err("Cannot open uuid_testn");

exit(1);

}

printc("==> child: dup2 uuid_test STDOUT_FILENOn");

if (dup2(fileno(file), STDOUT_FILENO) == -1) {

printc_err("Cannot dup2 uuid_testn");

fclose(file);

exit(2);

}

fflush(stdout);

fclose(file);

execlp("/usr/bin/uuidgen", "", "-r", (char *)0);

}


int status, i, j;

FILE *file;

char uuid[37];

uint8_t uuid_2[37], hex[16];


waitpid(pid, &status, 0);

if ((file = fopen(UUID_TEST, "r+")) == NULL) {

printc_err("Cannot open uuid_test.n");

goto END;

}

fread(&uuid, 36, 1, file);

fclose(file);


uuid[36] = '';

printc("==> uuid: %sn", uuid);

for (i = 0, j = 0; i < 37; i++) {

if (uuid[i] == '-')

continue;

if (uuid[i] >= '0' && uuid[i] <= '9') {

uuid_2[j++] = uuid[i] - '0';

continue;

}

if (uuid[i] >= 'a' && uuid[i] <= 'f') {

uuid_2[j++] = uuid[i] - 'a' + 10;

continue;

}

}

for (i = 0; i < 16; i++)

hex[i] = uuid_2[i * 2] * 16 + uuid_2[i * 2 + 1];

if (device_writemem(0xF000, hex, 16) < 0)

printc_err("==> device_writemem error.n");


END:

if (device_ctl(DEVICE_CTL_RESET) < 0)

printc_err("warning: PRog: "

"failed to reset after programmingn");


unmark_modified(MODIFY_SYMS);

return 0;

}


这一段看着挺复杂,其实功能很简单:

首先使用子进程调用execlp,从而执行uuidgen,在此过程中使用dup2将子进程的输出重定向到文件uuid_test;

然后将uuid_test的内容读到数组中;

接着将数组的ascii码转换成hex数据;

最后调用device_writemem,将数据写入0xf000地址处,即flash的segment0起始位置。


这段程序有很多可以优化的地方,目前就是顺溜下来实现功能,以后再优化(maybe never)。

原谅俺停留在《UNIX环境高级编程》第十章信号的编程水平~(线程、管道和网络,还不知何年何月再相约,先搞搞单片机^_^)


Step 3:编译并运行:


[root@localhost constant_current]# mspdebug-new -j uif -d /dev/ttyUSB4


(mspdebug) reset

(mspdebug) prog hexout

Erasing...

Programming...

Writing 1756 bytes at 1100 [section: .text]...

Writing 74 bytes at 17dc [section: .rodata]...

Writing 32 bytes at ffe0 [section: .vectors]...

Done, 1862 bytes total

==> child: fopen uuid_test

==> child: dup2 uuid_test STDOUT_FILENO

==> uuid: a5747abb-8d99-4590-a71d-a42bea494570

==> hex: a5 74 7a bb 8d 99 45 90 a7 1d a4 2b ea 49 45 70

(mspdebug) md 0xf000

0f000: a5 74 7a bb 8d 99 45 90 a7 1d a4 2b ea 49 45 70 |.tz...E....+.IEp|

0f010: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|

0f020: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|

0f030: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|

(mspdebug)


每执行一次prog,都会调用一次uuidgen,这样即使在批量烧写的时候也可以方便的更改唯一序列号啦!

开源的魅力远远不仅如此,喜欢DIY的你,值得拥有^_^


推荐阅读

史海拾趣

BENCENT公司的发展小趣事

随着国内市场的饱和,BENCENT公司开始将目光投向海外市场。公司制定了详细的国际化战略,包括在海外市场设立分支机构、拓展销售渠道、加强与当地企业的合作等。通过一系列的努力,公司成功打入多个海外市场,实现了业务的多元化和国际化。

Frolyt Condensers & Elements GmbH公司的发展小趣事

随着全球对环保问题的日益重视,Frolyt Condensers & Elements GmbH积极响应号召,将环保理念融入产品设计和生产流程中。公司投入大量资金研发环保型电容器材料和生产工艺,成功推出了多款低能耗、无污染的电容器产品。这些产品不仅满足了市场对环保产品的需求,还帮助Frolyt树立了良好的企业形象,进一步提升了市场竞争力。

AnDAPT__Inc.公司的发展小趣事

面对电子行业的快速变化,Frolyt Condensers & Elements GmbH深知数字化转型的重要性。近年来,公司积极推进数字化转型,引入先进的ERP系统和智能制造技术,实现了生产过程的自动化、智能化和精细化管理。数字化转型不仅提高了公司的生产效率和产品质量,还降低了运营成本,为公司的持续发展奠定了坚实的基础。同时,Frolyt还利用大数据和人工智能技术优化供应链管理,提升了客户服务水平和市场响应速度。

Carlisle Interconnect Technologies公司的发展小趣事

进入21世纪,Carlisle Interconnect Technologies开始了全球化的布局。公司不仅在北美和欧洲设立了多个生产基地和研发中心,还积极开拓亚洲和拉丁美洲等新兴市场。通过全球化的战略布局,公司不仅能够更好地利用全球资源,还能够更深入地了解各地市场需求,进一步推动业务发展。同时,公司还加强了与国际知名企业的合作,共同推动电子行业的发展和进步。

这五个故事只是Carlisle Interconnect Technologies发展历程中的一部分,但它们足以展示公司在电子行业中的创新、进取和不断追求卓越的精神。这些故事也为我们揭示了一个成功企业的发展轨迹:从创业初期的创新与突破,到不断的技术升级和产品多样化,再到全球化的布局与业务拓展,每一步都充满了挑战与机遇。

DESCO公司的发展小趣事

随着防静电产品市场的不断扩大,DESCO公司开始着手进行市场拓展和品牌塑造。公司通过参加国际展会、举办技术研讨会等方式,积极向全球客户展示其防静电产品的技术优势和应用前景。同时,DESCO还加大了品牌宣传力度,提高了品牌知名度和美誉度。这些举措为公司在全球范围内赢得了大量忠实客户,市场份额持续增长。

BEKA Associates Ltd公司的发展小趣事

随着全球电子市场的不断发展,BCD Semi(Diodes)积极寻求国际化拓展的机会。公司通过与国外知名企业的合作,成功进入了多个海外市场。在国际市场上,BCD Semi凭借其高品质的产品和专业的服务,赢得了客户的信赖和支持。同时,公司还积极参加国际电子展会和交流活动,与全球同行进行深入的交流与合作,不断提升自身的国际影响力。

问答坊 | AI 解惑

UC/OS在 320 2812 上的移植和研究

https://bbs.eeworld.com.cn/thread-77147-1-1.html 这里有更加详细的论文!…

查看全部问答>

常用运算放大器型号简介

常用运算放大器型号简介 好辛苦才找到,大家就给点辛苦费吧....…

查看全部问答>

SDK的安装问题

我安装的SDK为什么有的可以在EVC里看得到有的看不到?…

查看全部问答>

请问关于 RHAPSODY.V6.2 的问题

请问一下,有哪位大侠用过 vxworks下的建模软件I-LOGIX.RHAPSODY.V6.2,我在网上下了个这个软件,但结果不能安装,请问上怎么回事呢,我还有个6.0版本的,能安装,但结果却没有帮助文件,就没法学习怎么使用,也很恼火,请高手指点一下,我想学习在vxworks下 ...…

查看全部问答>

重金酬谢!!!!! 求破解手机 代码

重金酬谢!!!!! 求破解手机   代码 现在有个机型是CDMA的 原来是日文和英文 现在想改为法文或其他文字!~!!!!!!!! 芯片\"三洋高通\" 重金酬谢!!!!! 联系13681843776…

查看全部问答>

哪位配置过8962的CAN可以接收任意ID数据

想用CAN接收任意ID的数据,不知道哪位配置过,谢谢…

查看全部问答>

MDK编译提示错误

LedINT.c(36): warning:  #1-D: last line of file ends without a newline     每一个工程都有,为什么?…

查看全部问答>

USBASP制作不成功,希望高手帮忙!!!

半年内做了好几个手工板,一直没有成功,电路是按上面压缩包里做的,固件也是按照里边做的,下载的时候用的也是USBASP下载线下载的,但是插上电脑以后显示 [img]file:///C:/Users/Administrator.PC-20120816MPVV/AppData/Roaming/Tencent/Users/ ...…

查看全部问答>

SM5812-001传感器用51如何才能获得数据

请大家帮个忙看看这个传感器如何写驱动!我自己写了一下但是没有获得数据!我估计是我通信没做好!…

查看全部问答>