msp430单片机 程序升级实例

发布者:丹青妙手最新更新时间:2018-07-11 来源: eefocus关键字:msp430  单片机  程序升级 手机看文章 扫描二维码
随时随地手机看文章

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

关键字:msp430  单片机  程序升级 引用地址:msp430单片机 程序升级实例

上一篇:【MSP430】捕获模式测量信号占空比
下一篇:基于msp430的单片机的DES加密程序

推荐阅读最新更新时间:2024-03-16 16:08

学习STM32CubeMX与HAL库吐槽
最近因为一个小项目(智能穿戴),用到了STM32L0(低功耗 Cortex M0)系列的MCU, 查了官网,居然没有提供固件库,只有HAL库,于是STM32CubeMX生成了HAL库的工程,学习HAL的使用: STM32CubeMX与HAL库的优点: 1、降低了使用外设的门槛,所有时钟设置等一目了然。 2、统一了代码的架构、风格,让源代码的可读性“保底线“提高。 吐槽如下: 1、工程的架构很死了,只能在框框条条里填写内容,这完全违背了C程序员们的习惯。例如,要自己加上OS,代码结构会很难看。 2、但一但遇上了坑,就无法解决。 3、依赖性更高了,而且这工具有BUG,例如:在生成代码时,终止ST
[单片机]
51单片机FFT运算转换程序 adc数据
#include STC12C5A.H #define uchar unsigned char #define uint unsigned int #define channel 0x01 //设置AD通道为 P1.1 //--------------------------------------------------------------------- sbit SDA_R=P1^2; sbit SDA_R_TOP=P1^3; sbit SDA_G=P1^4; sbit SDA_G_TOP=P1^5; sbit STCP=P1^6; sbit SHCP=P1^7;
[单片机]
单片机控制GSM模块实现短信收发的软件设计
GSM(Global System for Mobile communication)系统是目前基于时分多址技术的移动通信体制中,比较成熟完善,且应用最广泛的一种系统。目前已建成的覆盖全国的GSM数字蜂窝移动通信网,是我国公众移动通信网的主要方式。基于GSM的短信信息服务,是一种在移动网络上传送简短信息的无线应用,是一种信息在移动网络上存储和转寄的过程。由于公众GSM网络在全球范围内实现了联网和漫游,建议上述系统不需再组建专用通信网络,所以具有实时传输数据功能的短信应用将得到迅速普及。笔者开发设计的基于GSM网络的温度数据采集与无线传输系统正是借助该网络平台,利用短信息业务实现数据的自动双向传递。系统模型图如图1所示。 本
[单片机]
<font color='red'>单片机</font>控制GSM模块实现短信收发的软件设计
基于数字PID和89C52单片机的温度控制系统
在工业生产过程中,温度是工业生产过程中常见的工艺参数之一,对温度控制的好坏直接影响产品的质量。及时准确地得到温度信息并对其进行适当的控制,在许多工业场合中都是重要的环节。对于不同生产情况和工艺要求下的温度控制,所采用的加热方式和控制方式均不同。本文介绍了一种基于89C52单片机的温度控制系统,本系统的任务是对温度进行实时监控与控制。它以温度传感器DSl820对温度进行测量、采样与转换,并将测量结果送给单片机;单片机将输人的温度值与内部指定单元的给定温度值进行比较,根据比较结果,通过一个执行机构(可控硅)对加热源(加热炉的温度)的开关状态进行控制。在控制环节中,本系统采用的是数字PID控制算法来实现上述功能。传统的PID控制电路结
[单片机]
基于数字PID和89C52<font color='red'>单片机</font>的温度控制系统
基于MCU实现蓝牙与PC机之间HCI层传输
摘要:分析了蓝牙HCI层的主要功能,并简述了蓝牙HCI层数据传输的单片机控制方案。HCI指令从RS232串口通过单片机的UART输入,经校验后发送至蓝牙模块,蓝牙模块返回的HCI事件在单片机内进行分组打包后发送至PC机。 关键词:蓝牙协议HCI 单片机 UART蓝牙模块 蓝牙是正在兴起的短距离无线通信技术,工作在2.4GHz ISM频段。蓝牙技术可在各种移动设备、计算机外设等数字设备间实现廉价的无线连接,灵活便捷地实现设备间的数据交换。本文介绍利用双串口单片机在PC机与蓝牙模块间实现蓝牙HCI层数据传输。 1 系统的硬件组成 采用爱立信生产的ROK 101 007蓝牙模块,使用51增强型单片机W77E58,用MAX3222
[单片机]
利用MSP430™ FRAM微控制器实现能量采集
对于很多人来说,第一次接触能量采集可能是在早期使用太阳能便携式计算器的时候,虽然如今这种类型的计算器已不再是主流,但是它所使用的技术和理念仍然应用于我们的日常生活中。目前,我们在许多的应用中都能看到能量采集的身影,例如传感器节点、风力涡轮机和室内供能应用等。不过,即使对于这项技术的讨论较之前已经有了很大的发展,当涉及到能量采集时,开发人员仍然面临着与数十年前一样的挑战。 为了在不带来负面影响的情况下产生出所需的能量,通常需要一块物理尺寸很大的太阳能板和一套巨大的热能采集装置,或者是通过设备发出不同频率范围的振动来获得能量,而一切都是由所使用的系统决定。因此,在很多情况下,这个系统的成本甚至会超过取代传统电源所带来的优势。当然,如果
[电源管理]
利用<font color='red'>MSP430</font>™ FRAM<font color='red'>微控制器</font>实现能量采集
MCU通用微秒计时函数框架设计
在嵌入式软件开发里,计时可以说是非常基础的功能模块了,其应用也非常广泛,比如可以辅助计算信号脉冲宽度时间,也可以直接用于常规延时等。相信很多人初次领略 MCU 的神奇,都是从计时功能相关小程序开始的。 在 MCU 里要想实现精确计时,往往都是利用其内部硬件定时器。不同厂商的 MCU,其定时器设计与使用都不太一样。即使是同一 MCU 内,通常也会有好几种不同类型的定时器共存。 基于此,今天分享一种非常简单实用的通用计时函数框架。这个框架的目的是统一计时函数接口,并且在实现上将通用部分和硬件相关部分剥离开。这样你的嵌入式项目在使用这个框架时,可以无缝快捷地切换底层定时器。 注:本框架主要适合定时器时钟源不小于 1MHz 的
[单片机]
单片机各类指令详解
  数据传递类指令   以累加器为目的操作数的指令   MOV A,Rn   MOV A,direct   MOV A,@Ri   MOV A,#data   第一条指令中,Rn代表的是R0-R7。第二条指令中,direct就是指的直接地址,而第三条指令中,就是我们刚才讲过的。第四条指令是将立即数data送到A中。   下面我们通过一些例子加以说明:   MOV A,R1 ;将工作寄存器R1中的值送入A,R1中的值保持不变。   MOV A,30H ;将内存30H单元中的值送入A,30H单元中的值保持不变。   MOV A,@R1 ;先看R1中是什么值,把这个值作为地址,并将这个地址单元中的值送入A中。如执行命令前R1中的值为20
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved