刚从avr跳过来,使用的芯片是105k4t6,把原来在avr上的程序都移植到stm8上,然后就出来一堆乱七八糟的问题。最后虽说都得到解决但是,我却不敢再用stm8.或许我对stm8的编译器不了解吧,下面我将问题列出,请高手分析,希望能得到解决,否则我只有重新用回avr。
编译软甲iar for stm8
1,串口问题
void UART2_vInit(void)
{
UART2_BRR2=0x02; // 设置波特率9600
UART2_BRR1=0x68; // 4M/9600 = 0x1a0
UART2_CR2=0x2C; // 允许接收中断,允许接收,允许发送
}
刚开始,这样初始化后,我用的是modbus协议,通讯两三次之后,就再也通讯不上了。后来跟踪发现,串口检测到过载错误,OR置位,如果不将该位清楚,则串口一直处于中断当中。
if(UART2_SR&0x08)
{
Uart0RingBuf.RxIndex=0;
//init_time(Com_wait,MODBUS_TIMEOUT);
return;
}
就这点而言,stm8的串口使用给人非常不方便的感觉,不同的错误进入同一个中断。感觉st在设计时,过多的让硬件干预于了通讯过程,如果做得比较全面也就罢了,但是做一半,给人使用就很不方便。
2,程序编译
到现在为止,我还没有碰到这么头痛的问题,经常在程序中做一小点改动,就会造成整个程序不能正常运行。到现在为止,我依然无法让这颗stm8完成规定的所有功能,因为我不知道编译器会出现什么样结果。
(1)第一问题,for循环次数不对。程序如下
for(i=StartAddr;i<(QR + StartAddr);i++)
{
switch(i)
{
//startaddr 9000
case CCHK_MBADDR:
SendBuf[index++]=Py_Cur>>8;
SendBuf[index++]=Py_Cur;
break;
case CELL_OCV_MBADDR:
SendBuf[index++] = OVV>> 8;
SendBuf[index++] = OVV;
break;
.....................................
case PACK_LEFTCAP_MBADDR: /
SendBuf[index++] = ((uint32)Sah /36000)>> 8;
SendBuf[index++] = ((uint32)Sah /36000);
break;
default:
SendBuf[index++] = 0x00;
SendBuf[index++] = 0x00;
break;
}
}
这段程序的运行结果就是,只近来一次循环然后就跳出,虽然我在调试界面里明明看着就是i<(QR + StartAddr)。最后没有办法,我只有去掉for,将其全部列出。而奇怪的是,下面的同样的for却可以运行正常。不要说里面有语法错误,我这程序是在avr上跑的,我只是将其换到stm8上。
(2),全局参数在程序段得有些位置计算正确,有些位置那怕是进行移位,赋值操作,都会出问题。
cell_num=(0x30+2*cell_num);
I2C_ReadNByte (0x60, 1,cell_num,Val_temp, 2);
这段程序存在两个问题,Val_temp是全局变量,接下来的操作是
Vm=(Val_temp[0]>>4)+(uint16)(Val_temp[1]<<4);
Vd=(Vm*5)>>1;
一旦执行完第一行,程序后,VM为0,val_temp也变为零了。
另一个问题,cell_num传递给I2C_READNBYTE 的值变为0。
最后,我采用下面的代码
I2C_ReadNByte (0x60, 1,(0x30+2*i),val, 2);
val[0]=val[0]>>4;
val,i都为局参。
出此之外还出了非常多的,类似上面的问题,更为离谱的是,有个long的局参,定义为long时,读取i2c器件,设备总是不应答,没办法,我试着将其改为int型,ok功能正常了。而同样是读这个设备,别的函数里面有float类型的,也不会有影响。
一堆堆这样的问题,弄得我实在无法忍受,却又想不明白,看看这里是否有高人能帮我解答。
如果是代码写的有问题,但是在avr上面用的好好的。
我之前怀疑是ram不够,105k4是1k的ram,之前的是2k的。但是根据编译结果,我用了130多个ram而已。
总是,非常郁闷。因看最后还有一星期就要完成了,但是这些我控制不了的错误,让我可能抛弃st,重用avr。
请高手支招,万分感谢!
rx_data=UART2_DR; |