历史上的今天
返回首页

历史上的今天

今天是:2025年06月14日(星期六)

2020年06月14日 | msp430单片机 程序升级实例

2020-06-14 来源:eefocus

MSP430单片机简介

TI公司的MSP430系列单片机是一种超低功耗的混合信号控制器,它采用16位精简指令集,集成了16个通用寄存器和常数发生器,极大的提高了代码的执行效率;简洁的27条内核指令方便学习;同时灵活的时钟源选择可最大限度的延长电池寿命。MSP430系列单片机的不同型号针对不同应用领域,集成了丰富的外围模块,包括: 看门狗(WDT)、定时器A(Timer-A)、定时器B(Timer-B)、比较器、串口0、1(USART0、1)、硬件乘法器、液晶驱动器、8路12/16位ADC、端口、基本定时器(Basic Timer)。

由于其杰出的低功耗设计和丰富的片上外围模块,使其非常适合于要求低功耗,高性能的嵌入式智能系统中。

MSP430程序升级方式

对MSP430系列单片机进行编程的方式有以下三种:利用JTAG接口,利用BSL固件和利用用户自定义的升级固件。由于利用自定义升级固件进行程序升级的方式比较灵活,并且用途广泛,本文将对它作重点介绍。

1. 利用JTAG接口

MSP430系列的单片机都集成了JTAG接口,该接口实现了遵循IEEESTD1149.1规定的测试访问端口状态机(TAP Controller)。它使用一个四线串行接口(TEST用于引脚较少的芯片)。数据或指令从TDI(测试数据输入)移入;串行数据从 TDO(测试数据输出)移出; TCK(测试时钟)作为时钟信号输入;TMS(测试模式选择)信号控制TAP 控制器的状态。利用该接口可以移入指令和数据,从而控制目标芯片的地址线和数据线,达到读写目标芯片FLASH和仿真调试的目的[1]。另外TI现在推出了新型的调试接口―SPY-BI-WIRE,它采用两线制,其中一根为数据线(双向),一根为时钟线。

利用该接口的优点是不需要设计额外的电路和程序,采用仿真器即可下载程序。缺点是一旦用户为了保证代码的安全,烧断了JTAG的熔丝,那么就永久性的破坏了该接口,也就不能再使用该接口了。

2.利用BSL接口

BSL是 Bootstrap Loader的缩写,中文名称是程序装载器。它实质是固化在芯片中的一段通信程序(占用0C00h-1000h的地址空间),利用它可实现对FLASH的擦除和读写。由于其是固化在芯片中的,因此不必担心其被更改或丢失。

该接口使用5根线:GND,TX(P1.1/P1.0),RX(P2.2/P1.1),RST,TCK(TEST),在RST和TCK(TEST)加特定的电平时序信号,即可启动BSL程序,从而实现与目标芯片的通信。通信的字符格式是8个数据位,一个停止位和一个偶校验位。起始波特率为9600bps(BSL 1.6版本可更改波特率到38400bps)。BSL协议要求首先接受一个80h字符用于同步时钟,然后发送应答字符90h。接着接受8个字符,并根据命令跳转到相应的处理例程。BSL程序的C语言描述如下

Void main()

{

Byte B,bArray[8];

LOCKSTATE = LOCK;

InitPorts();

While(1)

{

B=ReceiveSyncByte();

SyncTimer(B);

SendAck();

For( I = 0 ; I < 8 ;i++) bArray[i] = ReceiveByte();

Switch(bArray[i])

{

0x12: //写FLASH

For(I = 0 ; i
{

B=ReceiveByte();

If(LOCKSTATE ==UNLOCK) WriteByte(B);

}

Break;

0x10://接收口令

Receive32Byte();

If(PassWordCorrect) LOCKSTATE = UNLOCK;

Break;

0x18..0xn:

If(PassWordCorrect) DoTask();

}

If(NoError) SendNak();

Else

If(TxData) SendData();

else

SendAck();

}

其实现细节可能因版本不同而变化。若用户想利用它来实现程序升级,可参考文[2][3]。 利用BSL程序进行升级的优点是节省代码空间,用户不需要实现自己的升级固件,而且现在已经有很多现成的BSL升级工具;缺点是需预留BSL接口,并且需要现场接线。


3.利用自定义升级固件

MSP430系列单片机的FLASH存储器模块是一个可独立操作的物理存储单元。全部模块安排在同一个线性地址空间中,存储器被分为多个512字节的段(信息段大小为128/64字节)。各段可单独擦除,并且在正常工作电压下程序可对FLASH进行擦写操作,因此特别适合在线程序升级(in-system program)。

自定义升级固件就是在程序中内置一段用于升级应用程序的代码,即可利用现有通信接口进行远程代码的升级。其实现原理是在目标芯片中放置2段代码:一段为应用程序,一段为升级程序。两者的地址段不重叠,这样就可以利用升级程序擦除应用程序并写入新的代码。


3.1引导程序

复位后先进入引导程序,由它来决定进入升级程序或应用程序。引导程序的意义在于当应用程序不存在或错误时能直接进入升级程序,从而保证升级不成功可进行再次升级。

引导程序的描述如下

Void main()

{

While(1)

{

If(ResetVectorValid()) Application();

Updata();

}

}

其中的ResetVectorValid()函数用于检测应用程序是否存在或是否有效。实现可以是检测EnterApplication的入口地址是否合法,一种简单的实现是

#define ResetVectorValid() (ResetVector !=FFFF)

其中ResetVector为应用程序的入口地址,该地址通常放在一个固定的地址中,升级程序后修改该入口地址。Application() 为应用程序,它若正常执行不会返回 , 只有在接受到升级指令后才返回。可在Application()中使用Return语句进入升级程序。

Updata()为升级程序,其入口处必须加检测指令,以确认是正常进入升级程序。进入升级程序后,通信端应先发送擦除指令,擦除原有代码,然后发送升级代码更新FLASH。若是具有外部扩展存储器或用户程序较小,可先接收整个程序段,若校验正确再写入,这样可靠性会更高。

这里有个策略就是最先擦除包含ResetVector的块,最后写入ResetVector的值,这样可以尽量保证不会进入不完整的应用程序。


3.2应用程序的编写

应用程序的编写没有什么大的变化,需要在通信协议中加入自定义的一个升级命令,用于进入升级程序。另外需更改链接文件(*.XCL),指定应用程序的地址范围,如下以应用程序地址范围为2500-F7DC为例(用//注释掉的为默认的设置)

// Code

//-Z(CODE)CSTART=2500-FFDF

//-Z(CODE)CODE=2500-FFDF

-Z(CODE)CSTART=2500-F7DF

-Z(CODE)CODE =2500-F7DF

// Constant data

//-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT,CHECKSUM=2500-FFDF

-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT,CHECKSUM=2500-F7DF


// Interrupt vectors

//-Z(CONST)INTVEC=FFE0-FFFF

-Z(CONST)INTVEC=F7E0-F7FF

修改完毕后将该文件添加到工程。编译后的代码即可作为升级代码。

3.3升级程序的编写

新建一个工程,按如上的方法将升级代码定位到与应用程序不重叠的区域,如F800-FFFF,此时不修改

-Z(CONST)INTVEC=FFE0-FFFF

在升级程序中将除复位中断外的所有中断映射到应用程序中,一种办法是嵌入汇编,采用汇编的定位指令ORG;或者写15个中断影射函数,如下

//重新映射中断向量地址

#pragma vector=0x0

__interrupt void intvec_0(void)

{

asm("br & 0F7E0h"); //假设F7E0中存放中断15的地址

}

另外也可以采用动态确定中断入口地址的方法,即将中断向量地址放入约定好的RAM中,如下

__no_init void (*intvec1[16])() @ 0x200; //定义指向函数指针的数组,用于映射新的中断向量

//重新映射中断向量地址

#pragma vector=0x0 //

__interrupt void intvec_0(void)

{

asm("push R15");

asm("mov #0x200,R15");

asm("call @R15");

asm("pop R15");

}

然后在应用程序中进行中断向量的映射,如

intvec1[TIMERA0_VECTOR/2]=Timer_A_0;

即在TIMERA0中断时执行Timer_A_0()函数。这样做的优点是可以在运行时动态决定中断函数的入口,即如高级语言中的虚函数(Virtual Function)。

当这两个函数块编写完毕后就可以进行工程测试了。

3.4应用程序与升级程序同时完成

也许您还希望两个函数在一个工程里完成。这时除了需要修改链接文件外,还需要注意以下几点:

(1)将升级程序的所有函数定位到升级程序空间,即在函数前面加定位指令

#pragma location="UPDATECODE" // UPDATECODE为升级程序所在段的名称

(2)修改函数返回调用的例程。当函数返回时会调用弹出寄存器的默认例程,而这些例程可能并不在升级程序的地址空间内。一种解决方法是利用编译环境生成的LST文件(汇编代码),逐个修改函数返回时调用的弹出寄存器例程,这样就可以保证两者代码独立。这样做的缺点是每次更改C语言代码后,就要重新修改汇编代码,比较繁琐。另一种方法是考虑到升级程序所做的就是接受和发送数据,一般不需要使用中断。这样就可以在升级函数前面加入__monitor 编译指令,指明该函数为原子操作。这类函数入口处先压入SR并禁止中断,返回时使用RETI返回,此时编译器并不调用例程弹出保存的寄存器,而是根据进栈情况逐个弹出寄存器。

(3)更改SWITCH语句。使用SWITCH语句时编译器也会产生默认例程调用,很难屏蔽掉,故只有将SWITCH修改为多个判断语句。

结语

本文对MSP430系列单片机的升级方案作了详细的介绍,读者只要按照一定的步骤,就可以轻松实现远程程序升级,这在实际应用中具有重要的意义。并且本文的升级方法并不极限于MSP430系列,它也可以应用到类似单片机系列中。


参考文献

1 《Programming a Flash-Based MSP430 Using the JTAG Interface》Literature no. SLAA149

2 《Features of the MSP430 Bootstrap Loader》 Literature no. SLAA089A

3 《Application of Bootstrap Loader in MSP430 With Flash Hardware and Software Proposal》Literature no. SLAA096B

4 《MSP430 Family Mixed-Signal Microcontroller Application Reports》Literature no. SLAA024

5 《MSP430 IAR C/C++ Compiler Reference Guide》

6 刘宏志 谢利理.《FLASH单片机自编程技术的探讨》 单片机与嵌入式系统应用 2004.3

推荐阅读

史海拾趣

AUK Contractors Co Ltd公司的发展小趣事

近年来,电子行业面临着原材料成本上升、环保要求提高等多重挑战。AUK Contractors Co Ltd积极应对这些挑战,通过优化生产流程、采用环保材料等方式降低成本、提高效益。同时,公司还加大了对新能源、智能制造等领域的研发投入,实现了从传统电子制造向高科技领域的转型升级。

Hoffman Engineering公司的发展小趣事

在电子行业快速发展的背景下,Hoffman Engineering也面临着诸多市场挑战。为了应对这些挑战,公司不断进行战略调整和优化。例如,在市场竞争日益激烈的情况下,Hoffman Engineering加强了品牌建设和市场推广力度,提升了品牌知名度和市场影响力。同时,公司还注重与产业链上下游企业的合作与共赢,共同推动行业的健康发展。这些战略调整和优化措施的实施,使Hoffman Engineering在激烈的市场竞争中保持了稳健的发展态势。

Fabrimex AG公司的发展小趣事

1982年,Fabrimex AG收购了瑞士领先的实验室电源制造商Erlenbach的K. Witmer Elektronik AG博士。这一收购不仅增强了公司在实验室电源领域的实力,还进一步巩固了其在电子行业中的地位。通过整合双方的技术和资源,Fabrimex AG在实验室电源领域取得了更高的市场份额和更广泛的客户认可。

Chemi-Con公司的发展小趣事

在追求经济效益的同时,Chemi-Con公司也积极履行社会责任。公司注重环保和可持续发展,采用环保材料和生产工艺,减少对环境的影响。此外,Chemi-Con还积极参与社会公益事业,为社会的和谐发展做出贡献。这种负责任的态度不仅赢得了社会各界的认可,也为公司的长远发展注入了正能量。

这五个故事展示了Chemi-Con公司在电子行业中的发展历程和取得的成就。通过技术创新、品质管理、市场拓展、多元化发展和社会责任等方面的努力,Chemi-Con逐渐在电子行业中崭露头角,成为了铝电解电容器领域的佼佼者。

D+H Mechatronic AG公司的发展小趣事

在电子行业的激烈竞争中,D+H Mechatronic AG公司凭借其在精密机械与电子技术结合领域的深厚积累,成功研发出一款具有划时代意义的智能机械臂。这款机械臂不仅具有高精度、高速度的运动性能,还能通过智能算法实现自主学习和优化操作路径。这一技术的突破为公司在工业自动化领域赢得了极高的声誉,也为其后续的市场拓展奠定了坚实的基础。

General Electric Company公司的发展小趣事
内部集成了频率补偿机制,确保在高频信号下电路的稳定性。

问答坊 | AI 解惑

哪位兄弟有PT100的测温电路啊

能否共享呢 要求能实际使用的…

查看全部问答>

涛行MP3开发板焊接体会

收到soso发来的涛行MP3板后,抽空进行了焊接。在焊接过程中有点体会,一个是作者古道热肠设计制作板子精美元件布设合理,整体比较漂亮。但是也有不足之处就是图纸上的元件序号比较乱,比如焊接C5在焊接C6时候就得去另一个地方找了,这样不利于焊接 ...…

查看全部问答>

FPGA学习资料(日后有时间将不断跟新)

还有很多资料 有些也是坛子里以前就有的资料 有空再陆续上传…

查看全部问答>

如何使30万像素的摄像头支持130万像素

如何使30万像素的摄像头支持130万像素 就是说,在系统中能看到支持1028*1024的分辨率…

查看全部问答>

S3C6410 CE6 RAM从128M升级到256M,修改config.bib和image_cfg.h,导致无法启动系统了。

config.bib如下 IF IMGMULTIXIP ! #define     NKNAME       NK #define     RAMNAME      RAM #define     NKSTART     ...…

查看全部问答>

SD卡初始化及读写问题

我在初始化时下CMD0, CMD55等命令均不能成功,不知道是什么原因? 还有CMD命令的执行是否牵涉到Interrupt,也就是说CMD命令的执行是否用到Interrupt, 我对这方面了解不多,请各位多多指点。…

查看全部问答>

IAR ARM5.20调试时光标不在源文件窗口

IAR ARM5.20调试时光标不在源文件窗口,有的项目则能在源文件窗口,很奇怪!…

查看全部问答>

LM3S811串口下载程序问题

买的LM3S811开发板中自带boot_serial中,自动检测某个GPIO引脚(该引脚的作用是接收更新程序的信号)是被屏蔽掉的。出厂的芯片中的boot_serial只检测2K(默认的应用程序起始位置)处是否存在有效的堆栈指针和复位向量,如果有的话则执行应用程序, ...…

查看全部问答>

步进增益放大(含源代码,51勿喷)

0.1v步进,利用DAC0832的倒T型电阻网络…

查看全部问答>

基于瑞萨RL78/G14的车载报警器

希望 我的方案能够通过审核 谢谢网站举行的这次活动…

查看全部问答>