在使用MSP430F2272调试无线串口模块时,在发送过程中总会出现死机或者重启的问题,原本以为是无线模块发射功率或者电源的问题,在调节发射功率和更换电源后发现问题没有解决。
无线模块开始调试时是用的MSP430F5438和HC32L196同样的代码没有出现过这样的问题,代码和硬件查了几遍都没查出问题,搞了一天晚上再看时才开始考虑单片机的区别。
单片机中临时变量都是存储在RAM中,MSP430F2272的RAM只有1k,MSP430F5438的RAM为16k,HC32L196的RAM为32k。因为MSP430F2272的RAM只有1k,如果按着E22最大数据字节定义在加上两个字节的地址信息和一个字节的信道信息会导致超出RAM从而引起问题。
E22_STATUS E22_TransmitMessage(uchar *messageBuffer, uint length)
{
//uchar messageHeader[3 + 1000];
uchar messageHeader[3 + 10];
uchar i;
if (E22_GetMode() == CONFIG_MODE)
return E22_INVALID_MODE;
/* if (length > 1000)
return E22_MESSAGE_TOO_LONG; */
// 定点传输,需要将前三个字节填充 高地址、低地址、信道
if (currentConfig[9] & 0x40)
{
/* if (length > 997)
return E22_MESSAGE_TOO_LONG; */
messageHeader[0] = (targetAddress & 0xFF00) >> 8;
messageHeader[1] = targetAddress & 0xFF;
messageHeader[2] = targetChannel;
memcpy(&messageHeader[3], messageBuffer, length);
for (i = 0; i < length + 3; i++)
{
UCA0TXBUF = messageHeader[i];
while (!(IFG2 & UCA0TXIFG))
;
}
}
else // 透明传输
{
for (i = 0; i < length; i++)
{
UCA0TXBUF = messageBuffer[i];
while (!(IFG2 & UCA0TXIFG))
;
}
}
return E22_OK;
}
总结:进行单片机编程时至少对单片机的各种参数有所了解,不然在更换芯片进行编程时很容易引起不必要的麻烦。
|