标签存档: MSP430

MSP430相关开发工具资源合集

一、EW430 IDE下载地址

最新版的IDE当然是谷歌搜索EW430去IAR的官网。但往往我们不需要最新的。IAR官网不提供历史版本下载,信号TI提供。
TI的下载页面地址点这里 ,可以下载到最近的几个版本。

继续阅读 »

EW430断点的问题小结

每次烧程序都出现:The stack plug-in failed to set a breakpoint on “main”. The Stack window will not be able to display stack contents. (You can change this setting in the Tool>Options dialog box.)的警告。程序能烧进去,只是不能调试。

解决办法:

Project->Options->linker->output->format;
选择 Debug information for c-SPY选项

当设置的断点过多时,IAR会提示然后自动去掉多出来的断点,这时多余断点变成白色,现在最多可设置3个断点。 继续阅读 »

MSP430 USB仿真器给目标板提供指定电压

MSP430的在线仿真工具LSD-FET430UIF能够给目标板提供工作电压,且给电压可以通过IAR软件调节,调节电压的方法如下:

打开工程的option对话框,选择Debugger下面的FET Debugger,在Target VCC部分勾选Override default并在文本框中填写对应的电压值。

该功能的作用:

目前我是发现在使用ADC测系统电压时会用到。如果不适用该功能,则在线debug时电压是默认的3.3V。

MSP430单片机编程小结 转

1.#i nclude<>指要在编辑器设定目录下,#i nclude””指的是在当前工程目录下。
2.要调用另一个文件中的函数,要把这个函数文件放到当前工程目录下,并且在工程中添加此文件。
3.命名中不能有-,比如:byq-ee会认为是错误的,要用下划线。
4.用IAR软件仿真时,可以加入变量,如果是查看I/O信息只需加入PXIN,PXOUT即可。
5.IAR在处理字符时,要注意,是字符处理结尾标志,他和其他编辑软件是不同的。比如我们长用字符处理回
自动在结尾处加,但IAR有些是不加的,这就要十分注意。
6.如果只用到LFX1的低速时钟,9600bit/s传输的话,接收会出现问题,原因是误差太大,可以设置到4800以下。
7.在写FLASH时要注意其工作频率在257K~476k之间,如果不是,则会出现错误。而且FLAGH只能写入0,这样就出现了
必须先擦除在写入的模式。
8.当IO口作为输入时,要根据平时的状态加电阻,平时为高时,加个上拉电阻,平时为低时加个下拉电阻以增加稳定性。
9.在FLASH写时一定要关外部中断。
10.MSP430一般是不要RC复位的,一般只要接个100K左右电阻就可以了,如果要加电容,它的大小要根据以下两个标准
选择:
下载程序不会出现下载不了
程序上电会能稳定复位
11.用&表达式作为判断时,不要忘记加括号。
12.不要使用中断嵌套。

同时,为了使用C语言来编写MSP430的高质量代码需要注意。

微处理器一般用于特定环境和特定用途,出于成本、功耗和体积的考虑,一般都要求尽量节省使用资源,并且,由于微处理器硬件一般都不支持有符号数、浮点数的运算,且运算位有限,因此,分配变量时必须仔细。另外要说明的是,速度和存储器的消耗经常是2个不可兼顾的目标,在多数情况下,编程者必须根据实际情况作出权衡和取舍。
需要注意的事项如下:
1) 通常在满足运算需求的前提下,尽量选择为变量定义字节少的数据类型。
比如最常用的int和char,int是16位的,char是8位的,如果没有必要,不要使用int,而且使用char也最好使用unsigned char。运行时,可以在变量窗口看到,使用类型为unsigned char的变量是16进制的格式,而使用int的是十进制格式,如果char没有定义为unsigned,会出现负号,如果没有必要的话,在430中是不需要负数的。
2) 尽量不用过长的数据类型,如long、long long和double
3) MSP430的C编译器不支持位寻址,所以运算中尽量减少位操作,对于只有“是”和“否”的变量,如果RAM容量允许,则可分配为unsigned char类型,可提高运算速度。如果分配为某字节的某个位,可以减少存储器的消耗,但是会降低运算速度
4) 避免使用浮点数,尽量使用定点数进行小数运算。如果必须使用浮点数,则尽量用32位的float,而不是64位的double
5) 尽量将变量分配为无符号数据类型
6) 对于指针变量,如果声明后其值不再改变,则声明为const类型,这样编译器编译时能更好的优化生成的代码
7) 尽可能的使用局部变量而非全局变量或者静态变量(static)。这样有利于编译器编译时更好的优化生成的代码
8) 避免对局部变量使用 &取地址符。因为这样会使编译器无法把此变量放在CPU的寄存器中,而是放在RAM中,从而失去了优化的机会
9) 仅在模块内使用的变量声明为static,有利于优化代码
10) 如果堆栈空间有限,尽量减少函数调用的层次和递归调用
11) 如果传送参数过多,可将参数组成一个数组或者结构体,然后用指针传递
12) 某些变量在中断程序和普通级别程序中都会被用到,所以必须加以保护。
将变量声明为volatile类型,编译器优化时就不会移动它,对它的访问不会被延迟。
为保证对volatile的变量不被打断,为此,可以在访问它的部分(即访问它的函数)前面加上__moniter的声明

be本文转自:http://bbs.ednchina.com/view_comments.jspa?entry_id=3008620

 

在 IAR 中定义大数组变量,导致程序不能运行的解决办法

解决方法
在 IAR 中定义大数组变量,导致程序不能运行的解决办法总结
MSP430 大数组定义,不能正常运行的问题

定义太大的 RAM,那就有可能会遇到 RAM 中定义的变量/数组在超过一定范围的时候,MSP
程序不能正常运行的现象吧.一般初步判断,可以用 I/O 输出电平来确定程序进程.这样可以非常方
便的知道该问题是由于 WDT 造成的,(RAM 的初始化时间大于 WDT 默认的 32MS 时间,因此 MSP
复位)

下面来看下解决的办法:

A、 对数组用 __no_init 定义,上电编译器不产生特殊的附加函数去初始化 RAM
例:__no_init u8 GprsTXBuf[1000]; 注意关键字以两个下划线开头,尾部没有下划线,
中间一个下划线。

B 、修改 IAR 中 Cstartup.S43 文件中__program_start 子程序,增加一个关闭 WDT 的操作或者
设置 WDT 时间长度超过 32MS。(建议不到万不得已,不要改这个文件!)
文件地址:IAR Systems\Embedded Workbench 6.0 Evaluation\430\src\lib\430

C 、在 Project–Options–Linker–Config中选择 Override default programe,并将 Entry lib 设置
成 __program_start

上述是已知解决 RAM 初始化时间超 WDT 默认而复位的解决方法

一般编译器中 C 项自动开启,只要加上 A 项就可以解决问题,B 项在不清楚的情况下,不建
议做修改。

本文摘自网络。

 

FET-Pro430烧录设置

6.1 Memory Erase/Write/Verify Group
1.Update only:
该设置下,Auto Program 方式不会擦除存储器内容。下载器将根据Code file的内容擦除指定的存储器。譬如code file内容如下:
@1008
25 CA 80 40 39 E3 F8 02
@2200
48 35 59 72 AC B8
q
将擦除地址1008开始的8字节,擦除2200开始的6字节。
注意,地址起始地址和数据长度都应该是偶数的。
2.All Memory
擦除所有存储器
3.Main memory only
只擦除main memory,不更新information memory(segmentsA和B),code file中的information memory内容将被忽略。
4.Used by code file
该设置可以擦除code file指定的main memory和information memory的内容。
还没有看太明白!!
5.User Defined
擦写用户指定的memory。
6.Retain Data in Flash Group
保留部分存储器的内容。

MSP430F2232使用ADC进行系统电池电压监测

MSP22x2内部10位ADC用来进行系统电压检测。使用内部1.5V参考源,P2.0作为电池电压检测口。外部使用3M:1M分压电路。电压门限选定为2.45V和2.75V,对应的ADC的值为418和468。ADC满量程为1023,对应1.5电压。
ADC10采集函数: 继续阅读 »

MSP430使用TimerB定时进行传感器数据采集时遇到的定时错误

 问题现象:
在数据采集时一段时间会出现停止采集的情况,经过在线debug发现此时TBCCR0的值和TBR的值相差约为1.3s,即1.3s后才会再次产生TB0中断,才会再次采集数据。

使用背景:

用TB0做传感器定时采集,因为向传感器发送采集命令后要等待大约6ms才能获取到传感器数据,所以TB0的中断逻辑如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
 __interrupt void Timer_B0_ISR(void)
 {
 TBCCTL0 &amp;= ~CCIE;  //关闭中断
 switch (SampleCtrl.State)
 {
 case SAMPLE_STATE_SEND:   //发送采集命令
 LED2ON;
 TBCCR0 = TBR + 262;   //8ms
 发送采集命令;
 SampleCtrl.State = SAMPLE_STATE_READ;
 break;
 case SAMPLE_STATE_READ:   //读取采集结果
 if (g_bDRDYFlg)   //DRDY脚中断使该标志置位,表明一次数据采集完成
 {
 g_bDRDYFlg = FALSE;
 SampleCtrl.State = SAMPLE_STATE_SEND;
 if  //采集的数据有效
 {
 EventReqQue |= DETECT_VEHICLE;
 //完成一次采集,设置剩余定时时间
 if (SAMPLE_FREQ_HI == SampleCtrl.Freq)  //设置为10ms-8ms
 {
 TBCCR0 = TBR + 65;   //2ms
 }
 else                                    //设置为100ms-32ms
 {
 TBCCR0 = TBR + 3014;   //92ms
 }
 LPM3_EXIT;
 }
 else  //采集的数据无效
 {
 TBCCR0 = TBR + 20;
 }
 }
 else  //数据采集尚未完成
 {
 TBCCR0 = TBR + 20;   //约60us后再次进入中断,再去读取数据。
 }
 break;
 default:
 SampleCtrl.State = SAMPLE_STATE_SEND;
 break;
 }
1
 
1
}

 

 问题原因:
由于在传感器数据采集时还需要跟24L01通信,为了保证SPI通信可靠,读写24L01时禁止了地磁采集,而禁止地磁采集时只是禁止了TB0中断,并没有停止TB,所以TB是一直在运行的,在TB0中断被禁止时TB0产生中断,则不会被响应,而开启TB0中断时人为清除了TB0中断标志,所以导致该次TB0中断不会被响应。从而TBCCR0不会被重新配置,使得TB0要在下一次等于TBCCR0时才能产生中断,而这个时间最大为2s。

解决方法:
在再次开启TB0中断时不应该人为清除TB0中断标志。因为这个中断是应该要响应的,只是在与24L01进行SPI通信时暂时被禁止。
一开始想要在禁止TB0中断时停止TB,这个思路是错误的,而且并没有针对问题的关键。一方面,TB是不应该被停止的,另一方面,导致2s左右没有采集地磁的真正原因是人为清除了TB0中断标志使得TBCCR0错过了一次配置。

第 1 页,共 4 页1234