STM8SXX 开发时候个人总结的一点经验

 最近再使用STM8S207RB进行开发,以下是自己使用cosmic时遇到的一些常见问题:

1.printf/sprintf入口参数必须是u16类型,否则打印结果不正确,很奇怪
2.u32位类型的判断if ((val%0x1000) == 0)此判断前必须强制转换,即
    if ((u16)(val%0x1000) == 0),否则if每次都成立。
3.程序空间大于32k时,把常量const强制分配到指定空间32k以内,个人把前16k都分配
   给const,code从32k之后开始,使用
   #pragma section const {iconst}
    ....//const变量
   #pragma section const {}
    在STVD软件中增加iconst段,同时分配地址空间,在setting->Linker->category中
   选择input,进入之后一看便知。
4.interrupt.h和it.h中_stext重复定义,但编译时却报空间超了,屏蔽it.h中的定义,
5.一个工程有多个C文件时,一个C文件不能太大,我的一个menu.c文件,处理菜单操作
   的,很大,估计万行左右,编译时,cosmic每次都提示“遇到错误,自动关闭”,后来
   将menu.c中的函数移到其它c文件中,即正常,个人怀疑是单个文件不能太大。
6.使用24MHz时,必须选择1wait,说是简单,但必须先连上目标板,在设置,即debug
   后,在mcu配置中设置
7.EEPROM操作时,会关闭中断,导致我的UART数据都丢了,做好容错处理,还有块擦
   除需要在RAM中进行,使用Facpy函数,具体怎样忘记了

   大概差不多了,有的也忘记了,希望给正准备使用的朋友少走点弯路,做开发,时间
  贵啊,希望大家不要在已经有人遇到的问题上花费太多时间。
   我现在使用的是STM8S207RB,使用库函数,还是挺好用的,没有发现什么大的问题,就是很多和keil不同的地方,对类型要谨慎,尤其是u8 u16 u32类型变量之间的运算
搞的不好,问题奇奇怪怪,就像第2条,

   希望用过的朋友继续补充!!!!!

 

以上为转载,下面为自己的

 

1、

typedef union

{

 struct

{

unsigned char abc:1;

unsigned char abc1:1;

unsigned char abc2:1;

unsigned char abc3:1;

unsigned char abc4:1;

unsigned char abc5:1;

unsigned char abc6:1;

unsigned char abc7:1;

}IE

 unsigned char abc;

 

}ABC

ABC abcd;这一句只要加上__root 就OK了

最好写成  __root  ABC abcd

 

 

2、

GPIO_Init(GPIO_CHECK_HANDER,CHECK_HANDER ,GPIO_MODE_IN_FL_NO_IT);

delay(5000);//切换后要等等久一点

if(GPIO_ReadInputPin(GPIO_CHECK_HANDER,CHECK_HANDER) )

3、

对齐方式 

 

 如1 ,abc为低位 abc7 为高位

 

 ADC采集结果默认左对乐齐

 

4/adc

    采集周期 14个时钟周期为采集一次

    

    有时会出错,正常采集值为78  采到了13  15   

    要去掉一些错误值

 

 

5/若将PWM输出提至到极限 ARRL小于5后就会导致失真

 

 

 

6、某些I/0口 有特殊要求,或特特性

如STM8S208RB 中PE 1 2 作为输出不了高电平(内部没有P——buffer 和protection 连接失效)

要输出高电平,要外接上拉电阻

7、(网上找的)今天搞了一天的STM8,也是初次使用IAR,所以很多问题的处理都没有什么头绪。

我将ADC的转换结果赋给一个unsigned int 变量,

AD_Value=((((unsigned int)ADC_DRH)<<2)+ADC_DRL);

这样写会有警告:Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement 

但是我分为两句写,就编译通过了,语句的功能是一样的

AD_Value=(((unsigned int)ADC_DRH)<<2);

AD_Value+=ADC_DRL; 

7.1

  i=(GPIO_ReadInputData(GPIO_DOOR_CALL))&(0X30 );

if( i!= 0x30  )   

 可以执行到这里

if( (GPIO_ReadInputData(GPIO_DOOR_CALL))&(0X30 )!= 0x30  )   

  到不了这里

 

8/

对某个PORT口可进行  一次多个子端口进行操作

副作用:移植时若端口有变化则须重写,

 

  u8 GPIO_Pin;

  u8 GPIO_Mode;

  /* (Leds) as output push-pull */

  GPIO_Pin = LED1_PIN|LED2_PIN|LED3_PIN| LED4_PIN;

  GPIO_Mode = GPIO_MODE_OUT_PP_HIGH_FAST;

  GPIO_Init(LEDS_PORT, GPIO_Pin, GPIO_Mode);

  

GPIO_WriteLow(LEDS_PORT, LED1_PIN|LED2_PIN|LED3_PIN|LED4_PIN);

 

 

9 #if 注意

   {#if  写在这里编译失败

   #if 写在这里就可以

} 

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章