打印

关于stm8s105的一堆奇怪问题

[复制链接]
8031|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
吴明诗|  楼主 | 2011-4-16 09:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
刚从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;
沙发
donkey89| | 2011-4-16 12:12 | 只看该作者
你用什么开发环境?什么编译器?
stm8和avr有很大的不同.而且复杂性高得多.

使用特权

评论回复
板凳
吴明诗|  楼主 | 2011-4-16 12:55 | 只看该作者
iar for stm8

使用特权

评论回复
地板
sdpz| | 2011-4-16 17:11 | 只看该作者
能遇上这种乱七八糟的情况,一般是程序隐患导致。
1.函数重入问题。中断程序和主程序同时调用相同的函数,以致堆栈混乱。
2.堆栈溢出。数组或指针操作越界。

使用特权

评论回复
5
吴明诗|  楼主 | 2011-4-17 09:40 | 只看该作者
堆栈我设置的为512字节,而且曾经在总共只有256字节的51上跑过,没问题。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

28

帖子

0

粉丝