TI的iar msp430 6.4注册机能实现哪些算法,如TTF

&&&&TI msp430/cc430单片机CRC16校验码计算器V1.0.3
TI msp430/cc430单片机CRC16校验码计算器V1.0.3
一个很好的TI msp430/cc430单片机CRC16校验码计算器,输入待校验数据,直接计算出校验码,目前网上几乎没有TI的校验码工具
使用说明:
软件旨在计算TI公司MSP430和CC430单片机CRC校验码,在输入数据框内输入十六进制数据串(如&7E 0F 5A&不区分大小写)计算该数据串校验码。
您在使用过程中遇到任何问题请联系作者,十分感谢。
更新说明:
V1.0.1 版本更新
1、修正了输入中文等其他非法字符的BUG
2、输入数据框加入文本提示功能
V1.0.2 版本更新
1、更新支持以0x00的写法输入进制数
2、更新支持以逗号为分隔符的数据串,
如0x01,0xFE(不区分大小写)
V1.0.3 版本更新
1、新增MSP430F1/2/4xx和MSP430F5/6xx BSL版本选择
2、1/2/4xx版本BSL校验包含所有数据,包括80起始帧和长度(80后两字节)
3、5/6xx版本BSL校验不包含起始帧(80)和长度(80后两字节)
若举报审核通过,可奖励20下载分
被举报人:
sunjiaqi2004
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
VIP下载&&免积分60元/年(1200次)
您可能还需要
开发技术下载排行MSP430FFT 基于 的FFT精简算法 包含了LCD显示模块 SCM 单片机开发 238万源代码下载-
&文件名称: MSP430FFT
& & & & &&]
&&所属分类:
&&开发工具: C-C++
&&文件大小: 152 KB
&&上传时间:
&&下载次数: 16
&&提 供 者:
&详细说明:基于MSP430的FFT精简算法 包含了LCD显示模块-fft based on MSP430
文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&基于MSP430的FFT精简算法\基于MSP430的FFT精简算法\fft_new\ascii_tab.c&&.......................\.......................\.......\config.h&&.......................\.......................\.......\Debug\Exe\simulate.d43&&.......................\.......................\.......\.....\Obj\ascii_tab.r43&&.......................\.......................\.......\.....\...\fft.r43&&.......................\.......................\.......\.....\...\gui.r43&&.......................\.......................\.......\.....\...\lcd.r43&&.......................\.......................\.......\.....\...\main.r43&&.......................\.......................\.......\.....\...\simulate.pbd&&.......................\.......................\.......\fft.c&&.......................\.......................\.......\fft.h&&.......................\.......................\.......\gui.c&&.......................\.......................\.......\gui.h&&.......................\.......................\.......\lcd.c&&.......................\.......................\.......\lcd.h&&.......................\.......................\.......\main.c&&.......................\.......................\.......\Release\Obj\ascii_tab.r43&&.......................\.......................\.......\.......\...\fft.r43&&.......................\.......................\.......\.......\...\gui.r43&&.......................\.......................\.......\.......\...\lcd.r43&&.......................\.......................\.......\.......\...\main.r43&&.......................\.......................\.......\.......\...\simulate.pbd&&.......................\.......................\.......\settings\simulate.cspy.bat&&.......................\.......................\.......\........\simulate.dbgdt&&.......................\.......................\.......\........\simulate.dni&&.......................\.......................\.......\........\simulate.wsdt&&.......................\.......................\.......\simulate.dep&&.......................\.......................\.......\simulate.ewd&&.......................\.......................\.......\simulate.ewp&&.......................\.......................\.......\simulate.eww&&.......................\.......................\使用说明请参看右侧注释====〉〉.txt&&.......................\.......................\fft_new\Debug\Exe&&.......................\.......................\.......\.....\List&&.......................\.......................\.......\.....\Obj&&.......................\.......................\.......\Release\Exe&&.......................\.......................\.......\.......\List&&.......................\.......................\.......\.......\Obj&&.......................\.......................\.......\Debug&&.......................\.......................\.......\Release&&.......................\.......................\.......\settings&&.......................\.......................\fft_new&&.......................\基于MSP430的FFT精简算法&&基于MSP430的FFT精简算法
&[]:很好,推荐下载
&近期下载过的用户:
&相关搜索:
&输入关键字,在本站238万海量源码库中尽情搜索:
&[] - 关于nrf24l01的资料,非常全,有pdf说明文档以及程序设计
&[] - 基于MSP430的红外人体温度,室温,脉搏采集及显示代码
&[] - 2维弹道沉积,自己设计的方案让点落下并沉积在下方,落在何处用随机抽样
&[] - c++指定半径画圆,源代码以及详解PPT,vc++入门编程
&[] - 基于MSP430的FFT精简算法,基于MSP430的FFT精简算法,
&[] - MSP430ADC内部温度采集,ADC12位,msp430F5438类型
&[] - MSP430 常用的模块代码,为西电测控系谢楷老师编写,不是TI官网上的代码,比官方的代码更好,看看接口就可以直接拿来使用。非常标准的商业级C语言源码,各种接口宏定义和注释写的非常清晰。包括16位ADC,BasicTimer,Flash,LCD,PWM,UART,蜂鸣器,KeyBoard,RTC.非
&[] - 基于msp4301611 的AD转换 及 FFT 算法
&[] - 基于MSP430的FFT算法 FFT利用基-2算法实现 包括倒序和蝶形循环两部分
&[] - 基于 MSP430单片机 实现的FFT 算法你的位置:
史上最全MSP430技术文档大收集
[i=s] 本帖最后由 vipjph 于
10:35 编辑
什么是 MSP430?
德州仪器 (TI) 的超低功率 16 位 RISC 混合信号处理器的 MSP430 产品系列为电池供电测量应用提供了最终解决方案。作为混合信号和数字技术的领导者,TI 创新生产的 MSP430,使系统设计人员能够在保持独一无二的低功率的同时同步连接至模拟信号、传感器和数字组件。
典型应用包括实用计量、便携式仪表、智能传感和消费类电子产品。
MSP430主要特性和产品系列
可被纳入世界上功耗最低的微处理器系列。MSP430 可提供 200 多种超低功耗微处理器器件。每个器件都具有灵活的时钟系统,启用了多达 7 种低功率模式 (LPM),可提高优化性能。如果配以低于 1us 的即时唤醒时间以及各种中断源,MSP430 可确保您的应用仅使用手动执行任务时所需的相应时钟和外设。
主要的超低功耗度量标准:
各种低功耗工作模式
-------超低功耗工作模式:最低 120 &A/MHz @ 2.2V
-------待机模式,具有自我唤醒功能、RAM 保持模式 (LPM3):最低 0.7&A @ 2.2V
-------待机模式,具有自我唤醒功能 (LPM4):最低低于 100nA @ 2.2V
-------停机模式,具有 RAM 保持模式 (LPM3.5):最低低于 100nA @ 2.2V
-------低功率模式下低于 1us 的即时唤醒时间
-------始终接通的零功耗掉电复位
高性能 16 位架构。采用冯诺依曼架构,通过通用存储器地址总线 (MAB) 和存储器数据总线 (MDB) 将 16 位 RISC CPU、多种外设和灵活的时钟系统进行完美结合。MSP430 通过将先进的 CPU 与模块化内存映像模数外设相结合,为当今和未来的混合信号应用提供了解决方案。
( 22:08:18, Size: 198 KB, Downloads: 182)
( 22:08:18, Size: 183 KB, Downloads: 49)
( 22:08:19, Size: 430 KB, Downloads: 34)
( 22:08:19, Size: 146 KB, Downloads: 80)
( 22:08:20, Size: 390 KB, Downloads: 57)
( 22:08:20, Size: 343 KB, Downloads: 64)
( 22:07:57, Size: 95 KB, Downloads: 52)
( 22:07:57, Size: 32 KB, Downloads: 45)
( 22:08:03, Size: 65.1 KB, Downloads: 72)
( 22:08:03, Size: 3.55 MB, Downloads: 58)
( 22:08:04, Size: 1.03 MB, Downloads: 83)
( 22:08:05, Size: 166 KB, Downloads: 37)
( 22:08:05, Size: 363 KB, Downloads: 90)
( 22:08:05, Size: 31.5 KB, Downloads: 36)
( 22:08:08, Size: 247 KB, Downloads: 87)
( 22:08:08, Size: 402 KB, Downloads: 43)
( 22:08:09, Size: 187 KB, Downloads: 43)
( 22:08:10, Size: 25 KB, Downloads: 33)
( 22:08:10, Size: 183 KB, Downloads: 49)
( 22:08:11, Size: 187 KB, Downloads: 48)
( 22:08:11, Size: 153 KB, Downloads: 43)
( 22:08:12, Size: 186 KB, Downloads: 43)
( 22:08:12, Size: 22.5 KB, Downloads: 31)
( 22:08:12, Size: 20.5 KB, Downloads: 32)
( 22:08:12, Size: 24.5 KB, Downloads: 13)
( 22:08:13, Size: 76 KB, Downloads: 36)
( 22:08:15, Size: 1 MB, Downloads: 175)
( 22:08:16, Size: 1.05 MB, Downloads: 178)
( 22:08:17, Size: 159 KB, Downloads: 88)
( 22:08:17, Size: 252 KB, Downloads: 56)
( 22:08:17, Size: 78.2 KB, Downloads: 36)
欢迎大家补充完善,谢谢[转载]TI-MSP430F149在TCP/IP上的扩展
TI-MSP430F149在TCP/IP上的扩展
http://zoglab.vicp.net/self/doc/MSP430_tcp.asp
richardL 原稿 (在ZOGLAB BBS上的精彩留言)
richardL是一个加拿大的华裔移民,从事嵌入式系统的开发,现居住在加拿大蒙特利尔
应FFT邀请,谈谈在F149的TCP/IP功能上的增强,实际上我接触430的时间很短(FFT,moom知道,只有半年多),只是天天跟
CaptureCIS+Allegro,IAR Compiler, CodeWright, VisualC++, cvs,
gcc打交道,方方面面都要做(谁叫我在小公司打
工呢),上手快些而已.就如FFT所说,希望在不触及(或自己不觉得影响到)商业/工业秘密的时候,各位同行多多交流交流,互促进步.
程序以TI网站上原码为最初原型(其实当初我最早想移植uIP的,后来看到时间紧,放弃了)
1.文件结构调整
当我一看到TI的范例,就对其结构不已为然,通篇项目只有一个C,其他都是关联近来的,这完全不时一个标准C/C++程
序员的风格嘛,对功能扩展,错误跟踪分析不利,所以我第一件事就改了文件结构划分.
使各个C文件单独编译,最后连接,其他应用程序当然是单独的文件了,
免得在调试和分析的时候在整个项目到处乱翻
编量和代码实现.
另外由于Socket的应用显然包括网络的两端,因此单独列出一两个H文件,方便和其他系统C的编译连接(如port定义,
各个socket命令参数,格式等),由于平台的相关性,强烈建议采用uIP等的数据类型定义方式,以免以后与32位系统
socket联调时麻烦.
2.FLASH区域的详细划分:
主要代码区
应用数据区
系统升级代码及永久数据区(永久数据包括MAC地址等,注意IP地址并不在此内,其实IP,Gateway,等参数随时可能改
网络信息区(IP地址,SubNetMask,别名等等)
系统版本区(软硬件版本信息,只有系统在线自升级才修改,保留信息结构的一致性,要有扩充余地,方便高端程序对
该设备基本软硬件信息的访问)
中断向量区(系统固定,但软件在线升级时要更改,
因为很可能你的产品安装后要在线升级软件版本,而你的新的软
件版本改变了中断方式和中断数量!!!)
3.编译器连接器的设定
配合FLASH的划分,设定相关的连接参数: 我的如下XXXX代表应用层)
-Z(DATA)UDATA0,IDATA0,ECSTR=0200-09FF
-Z(DATA)CSTACK# //keep 300b+(12c) for stack!!! (check map
-Z(CODE)INFO=1000-10FF
// Main memory (FLASH)
//map of msp430f149
//f Segment B (system mode) (128 bytes) Segment B
//1080-10ff Segment A (node-net info) (128 bytes) Segment A
//1100-11ff NOT USED ..............!!!!!!!!!!..................
(256 bytes) Segment 119# //special
for F149!!! see slas272d.pdf P12
//1200-91ff xxxx-zone (32k bytes) Segment 55# - 118#
//9200-f9ff general code,const -- changed under system upgraded
(26k bytes) Segment 3# - 54#
(512B/seg)
//fa00-fbff chip info --maybe changed under system upgraded (512
bytes) Segment 2#
//fc00-fdff mac address --never change!!! (512 bytes) Segment
//fe00-ffff interrupt vectors -- maybe changed (512 bytes) Segment
w/Interrupt Vectors
-Z(CODE)SYS_MODE_TABLE=F
-Z(CODE)NODE_INFO_TABLE=1080-10FF
-Z(CODE)xxxx_ZONE=1200-91FF
-Z(CODE)CODE,CONST,CSTR,CDATA0,CCSTR=9200-f9ff
-Z(CODE)CHIP_INFO=fa00-fbff
-Z(CODE)MAC_TABLE=fc00-Fdff
-Z(CODE)INTVEC=FFE0-FFFF
4.变量和代码的优化
TCP/IP协议中用了很多全局/局部变量,我更改了一些简单变量为结构模式,有些直接放在响应的FLASH区,从而提高代
码的效率和节约了内存.有些函数的参数尽量减少到2个以内(或分开列出),而有些函数根本不必要单独列出,用宏来代
替就可以了(效率),以下范例:
a. 合并两个重复的代码:
//#define SwapBytes(Data) ((u16_t)((Data && 8) | (Data
#define SWAPB(Word) ((u16_t)((Word) && 8) | ((Word) &&
b. TxTCPBuffer 和 RxTCPBuffer
的直接访问(不用多次拷贝----浪费内寸和时间!!!)
extern u8_t RxTCPBuffer[MSP_MAX_TCP_RX_DATA_SIZE]; // space for
incoming TCP-data
//pointer of RX_BUFFER
#define TCP_REQ_PTR_KEY ((u8_t *)TCP_RX_BUF)
#define TCP_REQ_PTR_ORDER ((u8_t *)TCP_REQ_PTR_KEY
+sizeof(u32_t))
#define TCP_REQ_PTR_LEN ((u8_t *)TCP_REQ_PTR_ORDER
+sizeof(u16_t))
#define TCP_REQ_PTR_DATA ((u8_t *)TCP_REQ_PTR_LEN
+sizeof(u16_t))
#define TCP_REQ_KEY ((u32_t)*((u32_t *)TCP_REQ_PTR_KEY))
#define TCP_REQ_ORDER ((u16_t)*((u16_t *)TCP_REQ_PTR_ORDER))
#define TCP_REQ_LEN ((u16_t)*((u16_t *)TCP_REQ_PTR_LEN))
#define TCP_REQ_DATA_U8 ((u8_t)*((u8_t *)TCP_REQ_PTR_DATA))
#define TCP_REQ_DATA_U16 ((u16_t)*((u16_t
*)TCP_REQ_PTR_DATA))
#define TCP_REQ_DATA_U32 ((u32_t)*((u32_t
*)TCP_REQ_PTR_DATA))
#define TCP_REQ_DATA_U16A TCP_REQ_DATA_U16 //first 16bit
#define TCP_REQ_DATA_U16B ((u16_t)*((u16_t
*)(TCP_REQ_PTR_DATA+2)))
c. 定义通用head file
#ifdef PLATFORM_MSP //special for MSP 16bit
typedef unsigned char u8_t;
typedef signed char s8_t;
typedef unsigned int u16_t;
typedef signed int s16_t;
typedef unsigned long u32_t;
typedef signed long s32_t;
#else //Win32 Linux Unix ---Client 32bit-platform
typedef unsigned char u8_t;
typedef signed char s8_t;
typedef unsigned short u16_t;
typedef signed short s16_t;
typedef unsigned int u32_t;
typedef signed int s32_t;
//packet id define for client/MSP
#define PKTID_GENERAL 'G0'
#define PKTID_CHANGE_MODE (PKTID_GENERAL+0 ) //change mode between
(XXXXserver/ SYSburnserver/
HTTPserver)
#define PKTID_DUMP_FLASH (PKTID_GENERAL+1 ) //download ANY datas
from any positon in flash-
mem Data-Zone
typedef struct struReqHead_XXX{
u32_ // key for security
u16_ // same as order_code (see above) = PKTID_...
typedef struct struNetInfo_XXX{
u16_t MyIP[2];
u16_t MasterIP[2];
u16_t SubnetMask[2];
u16_t GatewayIP[2];
//for protocal_
#define PROTOCAL_SUPPORT 0x0001
#define PROTOCOL_ICMP (PROTOCAL_SUPPORT&&0)
#define PROTOCOL_BROADCAST (PROTOCAL_SUPPORT&&1)
#define PROTOCAL_FULL_SUPPORT
(PROTOCOL_ICMP|PROTOCOL_BROADCAST)
#define TCP_PORT_XXX 4112
#define TCP_PORT_MASTER 5001
(一次传不了,见下)
//------------------------------------------------------------------------------------
TI-MSP430F149在TCP/IP上的扩展(续)
d. 几个优化:
#define SendFrame1() {CopyToFrame8900(&TxFrame1,
TxFrame1Size);}
#define SendFrame2() {CopyToFrame8900(&TxFrame2,
TxFrame2Size);}
#define TCPRestartTimer() {TCPTimer = 0;}
#define TCPStopTimer() {TCPFlags &= ~TCP_TIMER_RUNNING;}
将CalcChecksum()划分成两个,
内部代码做简单优化(在C-spy中看看汇编就知道了)
u16_t CalcChecksum(...)
u32_t Sum = 0;
Sum = (Sum && 16) + (Sum & 0xffff); // add hi 16 to low
Sum += (Sum && 16); // add carry
5. BROADCAST功能支持的扩展
UDP的扩展(很容易的,见:http://www.faqs.org/rfcs/rfc768.html)
7. 系统在线升级:
基本流程(直到旧系统擦除前,随时可以Cancel)
a.模式切换(权限验证)
b.代码dump(由于接收缓冲区小,这是最耗时间的地方,目前12K的新系统代码dump所需时间大概15秒)
c.代码验证
d.全部FLASH擦除(除了系统升级代码区和dump区).
e.代码解析和复制
f.reboot. #define REBOOT {WDTCTL=0x1000;} //(PUC) is generated see
slau049.pdf p146
注:在d和e运行其间如果掉电的话,就只有到现场去取下设备来JXXX/BSL编程了.
转换程序:将msp430.txt格式的代码文件转为适合在线系统升级的数据包(编码前---保护版权哦)
int main(int argc, char* argv[])
FILE *fin,*
char fout_name[80];
char line[80];
char line_bin[40];
char addr_str[5];
addr_str[4]=0;
printf("nt%s (%s)ntt%s
%snn",__PRODUCT__,__PRODUCTVERSION__,__COMPANY__,__COPYRIGHT__);
if (argc&=2) {
printf("tformat error! usage: CCC input_file_name
versionntexample: CCC xxx.d43 101n";
return -1;
if( (fin= fopen( argv[1], "rt" )) == NULL )
printf( "The file %s was not openedn",argv[1]);
return -1;
if ((version=atoi(argv[2]))==0)
printf( "tversion should not be ZERO!n";
return -1;
sprintf(fout_name,"XXX%04d.sys",version);
printf("tinput: t%sntoutput: t%sn",argv[1],fout_name);
int linecnt=0;
block.len=0;
block.addr=0;
while ( fgets( line, 100, fin) != NULL)
if (line[0]=='@')
if (block.len&0) write_block(&block);
memcpy(addr_str,&line[1],4);//get addr
block.addr=hex2uint(addr_str);
block.len=0;
else if (line[0]=='q')
if (block.len&0) write_block(&block);
//end of code
int len=asc2char(&line[0],&line_bin[0]);
if ((block.len+len)&=MAX_BLOCK_LEN)
int num=MAX_BLOCK_LEN-block.
memcpy(&block.buff[block.len],&line_bin[0],num);
block.len=MAX_BLOCK_LEN;
write_block(&block);
block.len=len-
memcpy(&block.buff[0],&line_bin[num-1],block.len);
block.addr+=MAX_BLOCK_LEN;
memcpy(&block.buff[block.len],&line_bin[0],len);
block.len+=
//write end block (addr=len=0)
block.len=0;
block.addr=0;
write_block(&block);
checksum=CalcChecksum(&TotalBlock[0],TotalBlock_Len);
printf("tlenght: t%d bytesntchecksum:
t%04xn",TotalBlock_Len+2,checksum);
memcpy(&TotalBlock[TotalBlock_Len],&checksum,2);
TotalBlock_Len+=2;
fclose(fin);
//save to file
if ((fout=fopen(fout_name,"wb") ==NULL)
printf( "The file %s can not be createdn",fout_name);
return -1;
fwrite(&TotalBlock[0],TotalBlock_Len,1,fout);
fflush(fout);
fclose(fout);
printf("tdone.(OK)n",argv[1],fout_name);
升级程序:将新版文件通过socket通讯来在线升级(编码前---保护版权哦)
BOOL CSystemBurner::OnSocketReceive(int iErrorCode)
if (iErrorCode)
printf("SocketReceive errorn";Close();return FALSE;
char cBuffer[1024];
int iRecv=Receive(cBuffer,sizeof(cBuffer));
struAnswerH
memcpy((unsigned char
*)&head,cBuffer,sizeof(struAnswerHead));
if (iRecv!=(head.len+sizeof(struAnswerHead)))
{ printf("len is not matched.n";
return FALSE;
char TxBuffer[128];
struct struDumpBlk_XXX{
char full[SMALL_BLK_SIZE];
char code[SMALL_BLK_SIZE-2];
switch (head.id)
case PKTID_CHANGE_MODE:
m_status=CSystemBurner:UMP;
len=CreatePacketOrder(TxBuffer, PKTID_SYS_DUMP, NULL,0);
Send(TxBuffer,len);
printf("change mode OK.nstart dumping....% 3d/%
3d",m_small_blk_cnt+1,m_small_blk_num);
m_small_blk_cnt++;
m_CodeOffset+=SMALL_BLK_SIZE-2;
//keep dump or do next step-checksum
case PKTID_SYS_DUMP:
if (m_small_blk_cnt&=m_small_blk_num) { //finish dump
printf("ndump done(OK).n";
m_status=CSystemBurner::CHECKSUM;
len=CreatePacketOrder(TxBuffer, PKTID_SYS_CHECKSUM, NULL,0);
Send(TxBuffer,len);
printf("do check ...t";
dumpBlk.U.S.offset=m_small_blk_
memcpy(dumpBlk.U.S.code,m_pCode+m_CodeOffset,SMALL_BLK_SIZE-2);
m_status=CSystemBurner:UMP;
len=CreatePacketOrder(TxBuffer, PKTID_SYS_DUMP,
dumpBlk.U.full,SMALL_BLK_SIZE);
Send(TxBuffer,len);
printf("bbbbbbb% 3d/%
3d",m_small_blk_cnt+1,m_small_blk_num);
m_small_blk_cnt++;
m_CodeOffset+=SMALL_BLK_SIZE-2;
//checksum correct then do BURN
case PKTID_SYS_CHECKSUM:
memcpy((unsigned char
*)&RxData,cBuffer+sizeof(struAnswerHead),sizeof(u16_t));
printf("checksum OK. ----- value=%04xn",RxData);
m_status=CSystemBurner::BURN;
len=CreatePacketOrder(TxBuffer, PKTID_SYS_BURN, NULL,0);
Send(TxBuffer,len);
printf("do burn ...t";
//last receive before burning!
case PKTID_SYS_BURN:
m_status=CSystemBurner::BURN_CONFIRMED;
printf("received PKTID_SYS_BURN.n";
//cancel command be confirmed.
case PKTID_SYS_CANCEL:
m_status=CSystemBurner::CANCEL_CONFIRMED;
printf("unknown echo: %08xn",head.id);
return TRUE;
ERROR_HANDLER_RETURN("OnSocketReceive",TRUE)
(汉字录入好慢啊,今天实在写不动了,下次再聊.)
//----------------------------------------------------------------------
啊,不会吧?!这么多人浏览
好久没有敲这么多中文了,
不好意思,上次写的很乱,纯粹是随写,有些地方让大家摸不着头脑(我不是学文的料---我
上中学的时候最恨语文了,尤其是文言文!),比如连中文标题都有语法问题!
上面的最后两个范例为VC写的Windows写例程代码片段(不是for
MSP的),由于此部分刚实现功能,还没有集成到
Service部分中,程序中有好些临时定义(随想随写的陋习,如struDumpBlk_XXX的定义,希望大家不要见笑).
这个星期天天忙于Allegro,没有时间照顾tcp/ip stack,
不过在这段时间我特别看到系统升级的另外好处(初期只考
虑到实际应用中的需要),特别在批量生产的调试和配置功能上:
我的前端Sensor芯片在PCB板上元件完成后,需要精确设置参数(每个板子由于元件参数误差原因而须单独设置),原来
的传统想法是在测试床上完成测试,计算,再编程,再调整的方法,方法繁琐,数据不安全,有了这个在线升级功能后,到
时只要交给加工单位两个目标文件即可,一个为第一次编进去的带tcp/ip的专用测试代码,第二个为最终的应用代码文
件(特别格式),测试代码完成外围芯片参数设置固化等加工调试功能,完成后在线升级替换应用代码,整个过程只有一
次BSL编程,自动化程度高,大大节省人工(你们不知道这里人工费好高啊!!),
嘿嘿, 想不到我的这个idea在公司得到
重视(又自找事做了,不知道隔段时间好久可得到涨工资,新移民总是吃亏啊--语言,关系,开始的薪水,......
//--------------------------------------------------------------------------------------------------
DHCP Client
前段时间客户提出新要求,要实现DHCP客户端以支持动态IP(原因很简单,设备可能被要求运行在一个没有任何PC机,只
有多个该设备和一个硬件Router的LAN环境内--现在的硬件Router都含DHCP-Server,使得那些技术员不用对每个设备
配置IP),很啃了一阵资料,终于实现了(原来想偷懒的,想用RARPD来实现,但一听说整个LAN环境没有一台PC,仅通过一
个Router与WAN连接,用RARPD方式就没戏了).
其实现在看来DHCP客户端很简单,只是原来没有深入研究过而觉得可能复杂.
对MSP430上的实现有几个特点:
标准DHCP的MSG长度必须大于xx+64+128+308&500bytes,而其中的sname和file段就用掉了192BYTES,而这两个字段
基本上是为了兼容BOOTP的,大大浪费内存.我用以下来减少:
(注:其中chaddr也只分配了6个字节,发送区由于自己定
义不多的option,所以options取大概16字节就可以了,而接收区为了保证完整的要求,options大小为308,基本保证了
各种DHCP server的要求(除非还有溢出而使用了file的古怪的DHCP
server),实际上我测试的十来种软硬DHCP server
都没有用上这么多,不过还是保留着,万一呢....再说我下面提到共用另外的一个缓冲区,所以该大小也并不可怕)
typedef struct dhcpTxMessage {
u8_ // Packet opcode type: 1=request, 2=reply
u8_ // Hardware address type: 1=Ethernet
u8_ // Hardware address length: 6 for Ethernet
u8_ // Gateway hops
u32_ // Transaction ID
u16_ // Seconds since boot began
u16_ // RFC1532 broadcast, etc.
u32_ // Client IP address
u32_ // 'Your' IP address
u32_ // Server IP address
u32_ // Gateway IP address
u8_t chaddr[6];//u8_t chaddr[16]; // Client hardware address
//u8_t sname[64]; // Server host name
//u8_t file[128]; // Boot file name
u32_ // magic value
u8_t options[16]; // not more than 16???? (optionS is ENOUGH)
typedef struct dhcpRxMessage{
u8_ // Packet opcode type: 1=request, 2=reply
u8_ // Hardware address type: 1=Ethernet
u8_ // Hardware address length: 6 for Ethernet
u8_ // Gateway hops
u32_ // Transaction ID
u16_ // Seconds since boot began
u16_ // RFC1532 broadcast, etc.
u32_ // Client IP address
u32_ // 'Your' IP address
u32_ // Server IP address
u32_ // Gateway IP address
u8_t chaddr[6];//u8_t chaddr[16]; // Client hardware address
// u8_t sname[64]; // Server host name
// u8_t file[128]; // Boot file name
u32_ // magic value
u8_t options[308]; // Vendor-specific area 312 - cookie = 308
2. 共享TCP中的Fram1[]和RxTCPBuffer[], 因为DHCP
Client通常在上电调用(另一种情况是Lease快到期了), 所以我
协调了把TCP应用中的Fram1和RxTCPBuffer拿来共用, 如下:
extern u8_t TxFrame1[ETH_HEADER_SIZE + IP_HEADER_SIZE +
TCP_HEADER_SIZE +
MAX_TCP_TX_DATA_SIZE];
extern u8_t RxTCPBuffer[MSP_MAX_TCP_RX_DATA_SIZE]; // space for
incoming TCP-data
dhcpTxMessage *dhcpTxM//USE RxTCPBuffer[], NOTE: *RX* NOT *TX*
dhcpRxMessage *dhcpRxM//USE TxFrame1[], NOTE: *TX* NOT *RX* IN
//malloc memory, reuse-buffer
dhcpTxMsg=(dhcpTxMessage *)&RxTCPBuffer[0];
dhcpRxMsg=(dhcpRxMessage *)&TxFrame1[0];
注意我的DHCP Client的收发缓冲区和TCP的收发缓冲区刚好对调!
原因是TCP应用中发出的数据多,接收的数
据少,而dhcp client的刚好相反.
3. 几个函数:
void DHCP_Discover(void)
DHCP_Init_Header(DHCPDISCOVER);
op = &dhcpTxMsg-&options[3];
*op++ = DHCP_REQUESTED_IP; //当然希望DHCP
Server最好能分配给我上次使用的IP地址了!
*op++ = 4;
memcpy(op,&Net.MyIP[0],4);
*op = DHCP_END;
DHCP_Transmit();
void DHCP_Request(void)
DHCP_Init_Header(DHCPREQUEST);
op = &dhcpTxMsg-&options[3];
//option requested_ip
*op++ = DHCP_REQUESTED_IP;
*op++ = 4;
memcpy(op,(u8_t *)&dhcpRxMsg-&yiaddr,4);
//option server_id ......
// but The RFC .5 say:
// ...in RENEWING state ... client MUST NOT include a 'server
identifier' in the DHCPREQUEST
// is that serious?
*op++ = DHCP_SERVER_ID;
*op++ = 4;
memcpy(op,(u8_t *)&dhcpRxMsg-&siaddr,4);
*op = DHCP_END;
DHCP_Transmit();
void DHCP_IfConfig(void)
struNetInfo newN
DHCPRetryTimer=0;
DHCPLeaseTime=0x7 // sec= 68 years
//malloc memory, reuse-buffer
dhcpTxMsg=(dhcpTxMessage *)&RxTCPBuffer[0];
dhcpRxMsg=(dhcpRxMessage *)&TxFrame1[0];
DHCP_Discover();
if (DHCPOFFER==DHCP_Receive())
DHCPRetryTimer=0;
DHCP_Request();
if (DHCPACK==DHCP_Receive())
{ //this is what we want.
//re-set Lease Time
ptr=DHCP_GetOptionData(DHCP_LEASE_TIME);
if (ptr) {
memcpy(&DHCPLeaseTime,ptr,4);
ntohl((u8_t *)&DHCPLeaseTime);
if (memcmp(&dhcpRxMsg-&yiaddr,&Net.MyIP[0],4)) { //new
memcpy(&newNet.MyIP[0], &dhcpRxMsg-&yiaddr,4);
memcpy(&newNet.GatewayIP[0], DHCP_GetOptionData
(DHCP_ROUTER),4);
memcpy(&newNet.SubnetMask[0],DHCP_GetOptionData
(DHCP_SUBNET),4);
memcpy(&newNet.MasterIP[0], &Net.MasterIP[0],4);
if (DHCPRetryTimer&5) //timeout for ACK listen
DHCPRetryTimer=20; //ready for next DHCP_Discover
if (DHCPRetryTimer&5) //timeout for OFFER listen
DHCPRetryTimer=0;
DHCP_Discover();
//---------------------------------------------------------------
RichardL 再次光临ZOGLAB BBS时的留言
Hi, you guys!
Long Long time not see you here, I just back Montreal from my
2-weeks' vacation(I am tired). sorry I
cann't type any chinese this time.
I am still working on MSP430 sometimes. I am trying to move my
430/ip-stack part into 'uip' when I
have spare time(it's not easy since I have done a lot of stuff on
it). Hope I can write something
//-----------------------------------------------------------------------------------------
花絮 20051.31
真的好久好久没有来这里了,
谢谢大家的问候(其中的一个奉承我可受不起哈)
工作的时候一会忙硬件,一会忙软件的, 总是跟着感觉走(有啥法呢,
市场需要嘛). 闲话少说, 还是回到MSP这块吧:
我一直有强烈的愿望移植ip-stack到uIp的体系中.
所以一直在空闲时默默地修改系统. 前段时间用户提出了PPP支持
, 终于找到一个好的借口有时间做移植工作了.
最近基于uIP的情况改进了不少, 里边最大的增强可能就是那个Contiki了,
其中的ek部分我比较欣赏,(GUI部分我目
前用不着, 以后看来移到某些低档的ARM芯片可能是个选择方案之一).
Contiki中的特性我就不多说了(常见其网站即
可), 这里我也仅仅谈谈部分应用体会:
1. 基本支持TCP/IP的框架,
所以标准的和你我自定义的基于TCP/IP应用协议应该很简单就可实现支持,
目前我仅测
试过我自己的TCP应用协议部分和telnet等, 确实好用,
大大弥补了原系统很多的不足(通讯效率也提高不少, 最重要
的是结构清晰, 很便于移植, 添加多种协议同时支持).
2. UDP支持部分要自己扩充一些, 原来的部分对此的代码支持不很深入.
(下次我找到代码, 贴一些出来), 总的来说
这部分也不复杂的.
3. 范例中的DHCP部分感觉不太好(PThread), 我重新用了自己的代码来实现,
和uIP集成的话不消耗任何全局内存(4
字节的DHCP_Lease_Time例外------如果你要用这个量的话),
只是代码多些而已(约1KROM-----我用MSP430F149, 无
太大关系啦).
4. 终于实现了PPP拨号支持! 这是我花时间最多的地方,
因为必须重新PCB-Layout(保留CS8900A和4MFlashMemory,添
加Modem模块插座), 等待实物Modem模块,
然后由开始深入AHDL,LCP,PAP,IPCP的了解及测试, 一步一步,
Adam好像也还没有完成PPP部分(从他最近的一些相关信息中看出好像他目前也在花时间忙MSP430这块呢),
代码来看,有好几个地方的不足和Bug(至少针对MSP430系列,特别是PPP部分):
a. 要一些小改动来移植到IAR,(我开始费了好大的劲来用MSPGCC,
从有些方面看还是IAR方便些).
b. 没有Modem接口范例,虽然基本上AT命令就可以了,
不过还是需要一些跟硬件有关的范例才显得更完整.(我用的
是WinTech的SL2456,串口方式,提醒使用这个模块的是用这个模块的时候,
最好用CTS/RTS控制, 不要只CTS流控制方
式, 否则在接收缓冲中数据大大延迟, 很影响LCP,PAP消息的响应)
c. ADHLC中有一个重要Bug:
//if((c & 0x1) && (ahdlc_flags & AHDLC_PFC))
//NOTE: not c but ppp_rx_buffer[0]!!!
if((ppp_rx_buffer[0] & 0x1) && (ahdlc_flags &
AHDLC_PFC)) {
// Send up packet
ppp_upcall((u16_t)ppp_rx_buffer[0],
(u8_t *)&ppp_rx_buffer[1],
(u16_t)(ahdlc_rx_count - 1));
else {....
估计这个错误还没被发现的原因是Adam目前只测试了最简单的情况下(无ACFC压缩,无PFC压缩),
但实际的电话线
要求带宽很紧张,当然是能压缩就压缩啦,
在Linux下PPPD的默认设置里就可以看到.
d. UIP_LLH_LEN的定义是个常量,
我的实际情况是同时使用CS8900A(ethernet)和Modem(slip),
所以需要将这个
常量改成变量,实时中根据不同的接口用不用的值(14或0)
目前的问题PP可以连接通了, 不过感觉速度慢多了(当然也可理解:
31Kb如何能跟10Mb比呢), 我Ping的响应慢到
了约120ms! 分析下来最大瓶颈在AHDLC的数字处理上,
完全是每个字节每个字节的处理--尽管我改进了用块模式,
CRC算法也改成了最快的查表法,......-----要是MSP430能接上50MHz的工作频率多好啊.
//----------------------------------------------------------------------------------------------
未完续待:)
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 iar msp430 6.4注册机 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信