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