msp430 问题及解决记录
-----------------------------
2015.4.28
问题:开发板串口显示的内容为乱码
解决:使用的是原先产品主板的15200的波特率设置,但看来或者是开发板不支持115200或者是设置不正确。
错误的波特率设置:
UCA3BR0 = 9; // 1MHz 115200 (see User's Guide)
UCA3BR1 = 0;
正确的波特率设置:
UCA3BR0 = 0x03 ; // 32kHz/9600=3.41
UCA3BR1 = 0x00
-----------------------------
2015.4.29
问题:程序跑飞
解决:越界访问局部变量导致的。
详情:
函数中声明了一个局部变量: char cpTempSensorValue[20];
然后使用sprintf语句给格式化cpTempSensorValue,但是操作的字符串的长度大于20,而程序中又没有进行越界检查,因此导致跑飞。
-----------------------------
2015.5.8
问题:8025 IIC 调试不通
描述:使用硬件IIC而不是IO模拟来实现,但并没有采用IIC中断。卡在以下程序(直接从 return 1 返回了):
// 等待UCTXIFG=1与UCTXSTT=0 同时变化等待一个标志位即可
while(!(UCB2IFG& UCTXIFG))
{
if( UCB2IFG& UCNACKIFG ) // 若无应答 UCNACKIFG=1
{
return 1;
}
}
解决:最后发现是从机地址的问题,从8025芯片手册上看到的地址为 0x64,但是MSP430在实际使用需要往地址寄存器中放入7位地址(即不包含读写位),因此需要使用右移1位的地址,即:0x64>>1
-----------------------------
2015.5.8
问题:8025 IIC 设置控制寄存器问题
描述:IIC 虽然调试通了,但是程序初始化时需要把8025的控制寄存器设置为24小时模式,因此需要写往0x0E寄存器中写入0x20;但是,每次写入完后发现rtc读出的秒都被重置为某个值。
解决:参考了其他程序,给IIC的UCB2TXBUF寄存器写入的控制寄存器地址应该左移4位。即:0x0E<<4
备注:虽然问题解决了,但依然没有搞清楚。
-----------------------------
2015.5.18
问题:fabs错误
描述:fabs的结果不正确,经检查发现编译时有fabs的警告,
解决:增加“#include <math.h>”
备注:估计还有其他地方也实现了fabs。
-----------------------------
2015.5.25
问题:debug时跳转不到main函数,发现一直在 data16_memzero函数中死循环。
解决:参考了网友的解决办法,详情如下:
一直在_data16_memzero里死循环可能是因为程序最开始初始化变量的时候有大数组需要初始化。导致看门狗不断复位。这个初始化的过程是在进入main之前,有2种方式你可以尝试:
1.对你的数组用 __no init_定义,上电编译器不产生特殊的附加函数去初始化RAM
2. B修改IAR中Cstartup.S43文件中__program_start子程序,增加一个关闭WDT的操作或者设置WDT时间长度超过32MS
C在Project--Options--Linker--Config中选择 Override default programe,并将Entry lib设置成__program_start
事实也确实如此,Cstartup.S43是MSP430的启动文件,里面默认是打开看门狗的,添加个宏定义把看门狗关闭就解决了问题。
具体操作如下:
在安装文件:C:\……\src\lib\430 中找到启动文件:cstartup.s43
拷一个cstartup.s43,然后将其只读属性去掉。用记事本等打开cstartup.s43文件,看到文件内有如下语句:
#ifdef DISABLE_WATCHDOG
MOV #WDTPW + WDTHOLD, &WDTCTL
#endif
说明文件内已经有关闭看门狗的条件编译语句,只要我们定义条件,这样启动代码中的该语句就生效了,我们在文件头添加一句:
#define DISABLE_WATCHDOG
保存,然后再工程中将cstartup.s43文件添加到我们的工程当中。
在Project->Options->Linker->Config页中选择Override default programe ,并将Entry symb 设置成__program_start。
把debugger->setup->Run to main销掉,这样我们就能够从启动代码开始一句一句的看了。
cstartup.s43在iar310a的路径如下$TOOLKIT_DIR$\src\LIB\
-----------------------------
2015.5.27
问题:变量类型转换的不正确使用
1、 ff = (float)g_iPicDataLength/(float)(CAMERA_PACKAGE_SIZE-6);
2、 ff = g_iPicDataLength/(CAMERA_PACKAGE_SIZE-6);
类型说明:ff为float; g_iPicDataLength CAMERA_PACKAGE_SIZE为int
例如对于 17116÷506 正确的结果应该是33.8
如果采用1可以得到正确的结果,如果采用2则得到33.0
而我正好使用到了ceil函数:
int i = ceil(ff);
这样用时,1和2两种不同的方法计算的结果不同,1的结果为34,而2的结果为33
-----------------------------
2015.6.25
问题:收串口相机的图像数据时会稳定地丢数据
描述:串口相机的默认数据包长度为512,使用这个长度时没有任何问题。但是为了一次能传送更多的数据,我希望能增加数据包的长度,我修改为1024,但是发现无论如何会固定地丢失3个字节的数据(丢第510,511,512三个字节,注意计数从1开始)。
解决:各种尝试后找到问题。时钟中断触发的很频繁,并且430默认的不允许中断嵌套,这样会导致系统处理时钟中断的时候丢失掉串口收数据的中断。解决方法是在时钟中断中开中断。
-----------------------------
2015.6.26
问题:同样的程序在一个串口相机可以采集到数据,而在另外一个串口相机采集不到
解决:经分析后发现,这两个串口相机还是有略微的不同,软件版本应该有所差别。用串口助手对串口相机与其自带测试软件的通讯过程进行了监测之后,发现了问题。正常的串口相机在重新加电后,只要发送一两次同步命令就可以同步上,但是不正常的串口相机在重新加电后却要发送10多次同步指令才可以同步上。针对这个研究结果,做了针对性的处理:发送一次同步命令之后,过一定时间间隔[称为间隔1]如果收到了相机的回应就不再发同步指令,而是执行后续操作,而如果过一定时间间隔没有收到了相机的回应就重新发送一次同步指令,这样重复多次。
但是发现还有问题,经研究发现,问题出在:程序中有这样的处理(在串口发送数据的过程中,如果间隔[称为间隔2]一定时间没有发送数据了,就认为之前的数据是完整的一包数据,可以对其进行处理了),但是重复发送同步命令的间隔1小于间隔2,因此在重复发送同步命令时,同步回应还在路上呢,所以系统总是判断没有收到正确的同步回应。把间隔2调整使其小于间隔1后该问题解决。
处理之后,发现还有问题:即拍照命令总是失败。调试后发现,是因为调整了间隔2之后,拍照的回应只收到了6个字节后就处理了,而系统的处理是发现这6个字节不是想要的12个字节,因此就抛弃了这6个字节,所以虽然马上又过来了6个字节,但是系统也仍然认为是错误的拍照响应。处理的方法为:当响应数据不够12个字节时先缓存该收到的内容,等收到的内容大于等于12个字节后再处理。
之后再测试,在两个串口相机上,所有问题解决。
-----------------------------
2015.6.30
问题:从上位串口执行获取系统参数命令,但得到的结果中SensorEnable的值为(Null Pointer)
解决:设备使用了sprintf来格式化输出字符串,SensorEnable是字符串类型,因此使用了%s来格式化。以为是字符串本身的问题,但各种尝试后没找到问题原因。怀疑是sprintf中其他的格式化内容影响了SensorEnable,尝试后的确实是。Interval=%d格式化部分对应的变量是gs_stSetup.m_iReportInterval,而该变量原本是long long unsigned int型的,编译时系统有警告,但是我忽略掉了;查了资料,说是格式化时应该使用Interval=%llu,但iar系统似乎不能识别llu,这能识别lu。
最终,把gs_stSetup.m_iReportInterval的类型修改为long unsigned int,并把格式化内容修改为Interval=%lu后问题解决。
msp430 问题及解决记录的更多相关文章
- ie6,ie7,ie8 css bug兼容解决记录
ie6,ie7,ie8 css bug兼容解决记录 转载自:ie6,ie7,ie8 css bug兼容解决记录 - 前端开发 断断续续的在开发过程中收集了好多的bug以及其解决的办法,都在这个文章里面 ...
- 解决记录:win10 无法安装VS2017,visual studio installer下载进度始终为0
问题描述:win10 下无法安装VS2017,visual studio installer下载进度始终为0,点击取消按钮后,也没有反应,visual studio installer也关闭不掉: 具 ...
- 错误解决记录------------rhel安装Mysql软件包依赖 mariadb组件
错误解决记录------------软件包依赖 mariadb组件 错误信息: 错误:软件包:akonadi-mysql-1.9.2-4.el7.x86_64 (@anaconda) 需要:maria ...
- Apache coredump 问题发现与解决记录
目录 Apache coredump 问题发现与解决记录 背景 发现问题 解决问题 方法 1 方法 2 总结 Linux 程序编译链接动态库版本问题 ldd 命令 动态库的编译和 soname 线上 ...
- Android开发-Android Studio问题以及解决记录
[Android开发] Android Studio问题以及解决记录 http://blog.csdn.net/niubitianping/article/details/51400721 1.真 ...
- [Dynamic Language] Python3.7 源码安装 ModuleNotFoundError: No module named '_ctypes' 解决记录
Python3.7 源码安装 ModuleNotFoundError: No module named '_ctypes' 解决记录 源码安装时报错 File "/home/abeenser ...
- CentOS 8.2远程连接vncserver升级后1.10.1无法启动解决记录
CentOS 8.2远程连接vncserver升级后1.10.1无法启动解决记录 问题起源:手贱yum upgrade,重启服务器后无法使用vnc viewer远程连接 查看状态 # system ...
- SQLSERVER吞噬内存解决记录
现在手上有一个不大不小的系统,运行了一段时间,因为是24*7不断运行,所以内存逐渐增高,慢慢的会飙到95%以上,然后不得不重启电脑,因为用的是云,怕虚拟机重启down掉起不来,重启操作还只能在凌晨4. ...
- git分支与版本管理、版本回退、冲突解决记录
一.基础使用 1.初始化本地仓库 git init 2.关联远程仓库 git remote add origin git@github.com:用户名/仓库名.git 3.添加远程仓库文件到本地 gi ...
随机推荐
- 二分图 最大权匹配 km算法
这个算法的本质还是不断的找增广路: KM算法的正确性基于以下定理:若由二分图中所有满足A[i]+B[j]=w[i,j]的边(i,j)构成的子图(称做相等子图)有完备匹配,那么这个完备匹配就是二分图的最 ...
- java之进制转换
[转载]晨风�0�5�0�2�0�1�6�6 2014年03月08日 于 爱Java 发表 众所周知.程序世界计算机中采用的是二进制,一个数字可以用任意进制表示.所以看一个数据值的同时.还要观察它的进 ...
- C# 多线程详解 Part.03 (定时器)
Timer 类: 设置一个定时器,定时执行用户指定的函数.定时器启动后,系统将自动建立一个新的线程,执行用户指定的函数. using System; using System.Threadin ...
- treap 1286郁闷的出纳员.cpp
#include<cstdio>#include<cstdlib>#include<ctime>struct shu{ int l,r,sum,zhi,dui;}a ...
- IT公司100题-3-求数组的最大子序列的和
问题描述: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 例如输入的数组为1, -2 ...
- 戴文的Linux内核专题:08内核配置(5)
转自Linux中国 Linux内核拥有许多可以配置的特性,接下来我们还有许多要配置. 下一个可以配置的特性是x86的随机数生成器(x86 architectural random number gen ...
- SOD 精选细节--常用工具
要明白一个思想: SOD 只是帮你拼接sql语句, 用简单的方式来帮你实现. 不要理解错了.这很重要的! 查询: TB table=new TB(); table.Name="111& ...
- Android EditText email、数字验证
在做Android注册登录模块的时候,经常需要在客户端就验证用户输入的信息的正确性,如填写邮箱需要验证是否是邮箱,填写手机.年龄等信息需要验证是否是数字.先介绍一下验证邮箱的代码: /** * met ...
- C++,1....n中随机等概率的输出m个不重复的数(假设n远大于m)。
#include <stdlib.h> #include <time.h> knuth(int n, int m) { srand((unsigned )); ; i < ...
- SrcollView分页加载数据(MainActivity)
package com.baidu.mylistscroll; import java.util.ArrayList;import java.util.List; import com.baidu.a ...