1.在主函數(shù)的正式調(diào)用里,RCC的配置一定要在各外設(shè)的函數(shù)調(diào)用之前。
2.外設(shè)調(diào)試出現(xiàn)問(wèn)題時(shí),一定先考慮是不是沒(méi)有打開(kāi)外設(shè)的時(shí)鐘。并且RCC配置和外設(shè)時(shí)鐘的打開(kāi)要在配置寄存器之前。
3.使用模塊化編程可以使程序簡(jiǎn)單易讀,可移植性高,下一次調(diào)用方便。但是可能會(huì)出現(xiàn)很多問(wèn)題,必須一一克服。 在主函數(shù)里,把需要用得到的各模塊配置函數(shù)調(diào)用寫(xiě)入,這一點(diǎn)很重要。
4.模塊化編程時(shí),一定要確保模塊的.c文件添加進(jìn)了工程目錄,否則會(huì)出現(xiàn):Undefined Symbol的錯(cuò)誤提示,這一點(diǎn)要牢記。
5.中斷服務(wù)函數(shù)必須要寫(xiě)進(jìn)stm32f10x.it.c里面。否則會(huì)出問(wèn)題。
6.有時(shí)添加的模塊太多可能會(huì)調(diào)試不出來(lái),這時(shí)考慮把GPIO的端口復(fù)用AFIO打開(kāi)。
7.外部中斷的應(yīng)用:
(1).EXTI的GPIO外部線路中斷設(shè)置;
(2).EXTI初始化配置;
(3).中斷服務(wù)函數(shù)里的寫(xiě)法:(如EXTI_9_5之類)盡量單元間 各自用各自的if和else if。
互相的單元間不要用else if連接。
( 4 ).中斷服務(wù)函數(shù)里第一步就要清除中斷標(biāo)志位。
8.初始化外設(shè)如果在循環(huán)里面,比如PWM配置:
while(1)
{ TIM_Config(); }
這個(gè)時(shí)候如果不加延遲語(yǔ)句,很可能會(huì)出錯(cuò),加入延遲可以一定程度改善。
9.break語(yǔ)句是跳出里的最近的循環(huán)體。但是要注意,if不屬于循環(huán)體。所以一個(gè)while(1)里面只有if,一個(gè)break就讓全盤(pán)跳出while(1)!
10. while(1)
{
if(!Front_LDR_Signal)
{
if(a==1)
{}
else
{
a=1;
b=0;
drive(700,0,700,0);
Delayms(80);
}
}
if(Front_LDR_Signal)
{
if(b==1)
{}
if(b==0)
{
a=0;
b=1;
drive(700,0,0,0);
Delayms(80);
}
}
用if雙層判斷語(yǔ)句可以很好地避免每一次循環(huán)都要重新配置PWM,節(jié)約CPU。這個(gè)用法很好。
11.外部中斷函數(shù)不能進(jìn)入的原因分析:
1)GPIO或者AFIO的時(shí)鐘沒(méi)有開(kāi)啟;
2)GPIO和配置的中斷線路不匹配;
3)中斷觸發(fā)方式和實(shí)際不相符合;
4)中斷處理函數(shù)用庫(kù)函數(shù)時(shí),寫(xiě)錯(cuò),經(jīng)常可能出現(xiàn)數(shù)字和字母之間沒(méi)有下劃線;
5)外部中斷是沿觸發(fā),有可能不能檢測(cè)到沿,比如 中斷線是低電平(浮空輸入),觸發(fā)是下降沿觸發(fā),可能會(huì)出現(xiàn)一直是低電平,高電平的時(shí)候是一樣的情況,電平持續(xù)為高電平;
6)沒(méi)有用軟件中斷來(lái)觸發(fā)外部中斷,調(diào)用函數(shù)EXTI_GenerateSWInterrupt;,因?yàn)檐浖袛嘞扔谶呇刂袛嗵幚怼?/div>
12.中斷NVIC的配置(尤其是其中的NVIC_InitStructure.NVIC_IRQChannel = EXTIx_IRQn;),絕對(duì)不可以占用輸出等功能的GPIO口通道。比如配置了NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; 那么PX2輸出PWM就會(huì)出現(xiàn)不可預(yù)知的問(wèn)題。