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 寫在這裏就可以

} 

  

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