当前位置: 首页 > news >正文

【单机片调试】开发调试MSP430 遇到的问题总结

转载及积累:

1、分配数组的时候,一定要够长,否则填入是数组越界的时候,造成很多的问题(包括潜在的问题)。

a:全局变量改变:越界数据将全局变量覆盖

b:数组越界,无止境增长,造成堆栈溢出,程序跑飞。

2、定义一个全局变量(数组),当变量(数组)很长的时候出现,能下载到单片机,但不能运行的情况。例:

char  UART0_RX_BUF[400]={0}; 可以正下载程序,但是程序无法正常运行。

改为(缩小长度) char  UART0_RX_BUF[200]={0}; 则正常。

原因:定义的数组很长,且要求其初始化,RAM的初始化时间大于WDT默认的32MS时间,因此MSP复位。

解决方法: 用 __no init_定义变量,上电编译器不产生特殊的附加函数去初始化变量。

网上同样问题:

“当在RAM中对其中一变量开辟的尺寸是512字节时,程序总占用3.5K RAM空间,可以正常烧到芯片中,也可以正常运行;当对同一变量开辟的尺寸是1024字节,而其它均未改变时,程序总占用4.0K左右RAM空间,可以正常烧到芯片中,却无法运行!!!!”

http://bbs.lierda.com/showthread.php?t=11608

利达尔:MSP430常见问题汇总

http://wenku.baidu.com/view/19f818d376eeaeaad1f33003.html

--------------------------------------未编辑-----------------------------------------

1、MSP430的内存分配到底有多重要?发布时间:2011-11-14 12:06:32  

     前两天做的一个项目,本来插上仿真器运行程序没一点儿问题,结果拔了仿真器后,断电后再上电程序总是运行到报警的状态,首先,我怀疑是复位电路的问题,结果查了一下资料发现复位电路没有问题,再说了,如果是复位电路的问题,那每次上电后都运行到超时报警的状态好像也不太像是复位的问题吧!然后,用示波器观察程序运行过程中系统电源的波形图,结果发现有一瞬间电源电压被急剧拉低2.2V左右。由于电路里面有两个LDO电路,所以怀疑是LDO的使能信号开启的时候负载过大引起电压急剧下降导致单片机程序紊乱引起的,看起来好像所有的故障现象都指向这个问题了!那就多查查这方面资料吧!由于以前没用过430的单片机,所以很多东西不熟悉。在网上找到一个网友的一个帖子中说到SVS,然后仔细一看,觉得可以通过软件来修复电压剧变的问题,结果加上SVS的设置后程序依然出现报警情况。好在一个做软件的同事指出程序中一个不完善的地方,在此为了说明问题就粘贴一部分代码来说明吧!

    unsigned char *frame = (unsigned char *)malloc(((dsize/2)?dsize:(dsize+1))+7);    

    int len = 0;
    len = Frame_form(frame,cmd,data,dsize);
    Send_frame(frame,len);
    free(frame);

本来定义的frame指针并没有分配任何内存,我还以为编译器可以自动进行内存分配的,并且在插入仿真器的情况下程序也确实没有什么问题,但是如果采用malloc分配内存后,在拔下仿真器的情况下程序也正常了。虽然到现在为止我都没想明白这是为什么,不过还是写下我的第一篇博客来记录一下!

转贴]总结下开发调试MSP430系列的一些另类问题
从99年第10届全国单片机展示会上(当时在杭州大学举办的)认识MSP430,呵呵,那个时候FLASH的只有F1101,F1121等初级芯片,觉得这个玩意还有点特殊,尤其可以JTAG调试,免了个编程器
从2002年开始折腾这个系列,低功耗,流行的SOC结构,适合做智能仪表的MSP430开始吸引我了.呵呵,下面我将说说开发至今遇到的一些另类问题,跟大家切磋下.
不管是N年前的1.21/1.26版本,还是现在的3.10/3.40版本,IAR一直是我用的最多的一个编译/调试器,玩MSP430不可能不接触到这个 那我就以IAR调试为例来说说了咯
原始级 问题,一般是刚开始入门的哥们姐们要遇到的问题
1, 接上仿真器,发现不能下载,这个问题想必大家都有遇到过,IAR提示找不到目标!??
    可能的原因:  A 并口驱动能力不足,在电脑的BIOS界面下设置成ECP或者       ECP+EPP模式
                      B JTAG线太长,一般超过20CM不推荐,而且这个线最好不要交叉缠绕,会影响实时在线调试
                      C 你的负载太大,一般功耗相对比较大,电流超过20MA以上的板子,建议用外接电源,要不光靠并口那点驱动能力,那MCU的电压就要被拉低到不能写FLASH了,呵呵
2, 程序下载到一半,突然告警并报错,说某某地址写不进去!??倒~~我开始也以为是FLASH被写坏了,呵呵,其实MSP430的FLSH没这么脆弱
   可能的原因:  A 芯片的复位电路引起的,在写FLASH的时候,会造成系统电压的一些波动,可能导致芯片复位,而为什么都是写到这个地址才错,那是IAR的问题,改用BSL再烧一边,就可以克服了
                     B 芯片有可能死机了,给断电,拔掉JTAG没,稍后再试,一般没有问题
                     C 如果都不是上述的方法能解决的,告诉你一个更酷的办法,给芯片上电,电压=3.6V,重新写一次,一定OK.为什么,写不进FLASH主要是F1XX系列的写FLASH电压不能低于2.7V,一般2.5V以下才不能真正工作,因此用3.6V电压,什么样的片子都能写回来(BTW,到现在为止,我还没写坏过一片MSP430的FLASH)
3, 关于3.40以上版本的仿真器设置问题.
说实在的,真正开发起来,我都不太愿意随便换IAR的版本,有些语法不兼容,有些设置不一样,不花点时间开 WHAT'S NEW,就要到BBS上去发贴了,呵呵
最近装了3.40的 限制版,一路NEXT,好象没什么特别的地方,装好后发现芯片的选择余地多了很多,包括了F2XX,N多种类,哈哈再上硬件FET接着跑个DEMO看看,居然不成,报错!!
原来:  在仿真栏目里选好 FET 硬件仿真以后,还有一项是访真器的选择,我倒~
没仔细看的哥们姐们一定纳闷,为啥还要搞个 LPT || J-LINK || TI-USB ,更滑稽的是IAR居然认为现在大伙都有米买USB的FET,默认选项是 TI-USB,那就是这个问题咯,改成 LPT(并口FET) 就完事了。
   另类级问题
1, F1611大数组定义,不能正常运行的问题
   相信有不少朋友已经用上了F1611,这个RAM大大的MSP,呵呵.那就有可能会遇到 RAM中定义的变量/数组在超过一个极限的时候,MSP程序不能正常运行的现象吧.一般初步判断,可以用I/O输出电平 来 确定程序进程.这样可以非常方便的知道该问题是由于WDT造成的,哈哈 (RAM的初始化时间大于WDT默认的32MS时间,因此MSP复位)
下面来看下解决的办法:
A  对你的数组用 __no init_定义,上电编译器不产生特殊的附加函数去初始化RAM
B  修改IAR中Cstartup.S43文件中__program_start子程序,增加一个关闭WDT的操作或者设置WDT时间长度超过32MS
C  在Project--Options--Linker--Config中选择 Override default programe,并将
Entry lib 设置成 __program_start
上述是已知解决1611RAM初始化时间超WDT默认而复位的解决方法,如果用汇编,则没有这个问题
2,SVS导致MSP "坏死" 问题
去年开发一款仪表,用上了F425,只怪这个玩意口线太少,只能把能用上的功能模块都赶上了.SVS在F42X里可是个不错的模块,外部设计可以节约一个VD,成本和空间,呵呵
意外的是,我将这个SVS的电压设置在3.3V,结果一次JTAG写入后,那板子便没有再起来工作,刚开始以为真的写废了这个MSP,后来想判断下MCU是否还能工作,接上电源和电流表,发现电流有周期性跳跃----倒~~该MCU正在被SVS复位中
重新加电压,超过3.3V,修改设置,重写FLASH,一切搞定
希望能给用SVS和SVS+的朋友起个提醒的作用,呵呵,有时这个问题还不太容易被发现
3,I/O电压供电居然也行?
在设计低功耗设备时,有时我们经常用MCU的引脚给一些IC供电,这个方案我最早用在PIC的单片机上,前人的经验,照着抄没错 MSP430当然也没问题
有兴趣的朋友不仿可以试试,DVCC/AVCC不接,直接从某个I/O加电压,MCU照样能跑哦.这个问题大家要注意的,可能是好事,也可能很麻烦
但是在做硬件设计的时候一定要想清楚了,I/O可以供电给其他IC,当然也能从其他IC中取电,在一些设计中,MCU的静态功耗降不下来,尤其是设计变送器,4`20MA双线制设备上,要谨慎处理.
*********************************************************************
转至:http://zoglab.vicp.net/bbs/index.php
      作者:FFT      

相关文章:

  • 【单片机程序和RAM】程序在RAM中调试的运行方式程序固化后运行方式
  • 【关于单片机的N多问题】关于单片机的N多问题
  • 【volatile关键字】 详解C中volatile关键字(IAR 优化等级问题)
  • 【下载进去无法运行】MSP430 程序能下载进去却无法运行
  • 【文章收藏】文章收藏
  • 【DATA16DATA20】MSP430中的DATA16和DATA20【Data model Large】
  • 【编程经验总结】编程经验总结
  • 【精确延时函数】IAR(MSP430)中的精确延时函数
  • 【Clng与Cint】clng与cint的区别及防溢出函数
  • 【寻址方式】直接寻址、位寻址、立即数寻址、寄存器寻址等
  • 【高效单片机语言结构】怎样最好地使用MSP430 编译器的建议
  • 【RS-485收发切换】使用RS-485要注意的一个问题
  • 【汇编指令】MSP430汇编指令
  • 【关于堆栈和指针】关于堆栈和指针 不错的文章
  • 【参数传递方式】参数用指针好还是用数值好(区别)结构体/指针做参数
  • [deviceone开发]-do_Webview的基本示例
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 【Amaple教程】5. 插件
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • es6
  • ESLint简单操作
  • es的写入过程
  • laravel with 查询列表限制条数
  • Making An Indicator With Pure CSS
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • python学习笔记-类对象的信息
  • SOFAMosn配置模型
  • WebSocket使用
  • 创建一种深思熟虑的文化
  • 从输入URL到页面加载发生了什么
  • 将 Measurements 和 Units 应用到物理学
  • 那些被忽略的 JavaScript 数组方法细节
  • 前端自动化解决方案
  • 区块链技术特点之去中心化特性
  • 入门级的git使用指北
  • 一个SAP顾问在美国的这些年
  • - 转 Ext2.0 form使用实例
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • Java总结 - String - 这篇请使劲喷我
  • #{} 和 ${}区别
  • #if #elif #endif
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (done) 两个矩阵 “相似” 是什么意思?
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (十六)一篇文章学会Java的常用API
  • (转)Linq学习笔记
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (轉)JSON.stringify 语法实例讲解
  • .gitignore文件---让git自动忽略指定文件
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .NET CORE 第一节 创建基本的 asp.net core
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008