1. 程式人生 > >第九屆藍橋杯-嵌入式比賽體會與備賽經驗

第九屆藍橋杯-嵌入式比賽體會與備賽經驗

static 的人 sta disable 位置 希望 else 恢復 是什麽

原文地址:http://www.cnblogs.com/NickQ/p/8721317.html

說起藍橋杯,相信很多電子類的學生,應該很熟悉了吧。。。上周日,我也去湖北工業大學參與了一下。說起這次經歷,我還是覺得有點惋惜,但還是覺得應該寫出來。

先說比賽體會吧。。

關於考點(湖北工業大學考點), 個人覺得,湖工承辦的這次比賽還是比較出色的,但也有以下幾點瑕疵。

1、未設帶隊老師休息點。賽前,我們在賽場外候場時,偶然碰到某個學校的兩個帶隊老師與工作老師詢問休息點,才得之此事。

2、比賽環境未準備充分。以嵌入式比賽為例,比賽計算機未為考生準備PDF閱讀器,導致部分考生浪費很長時間尋找安裝包,安裝閱讀器環境。而且安裝閱讀器環境版本較低。其次,部分考生計算機嵌入式開發板的驅動未安裝或未安裝成功(包括我在內),賽前工作人員未盡到安裝和調試的義務。這導致比賽開始後,尋找老師解決問題時,耗費了大量時間。--- 以我為例,我嘗試過自己安裝驅動,失敗後,共計來了3名老師嘗試安裝驅動,都只是在重復簡單的安裝步驟,未果後。老師建議換機,但苦於沒有空閑機器了。老師嘗試重啟後,問題才得以解決(註意:比賽過程,考生不允許重啟計算機,重啟可能會丟失之前數據)。這個過程花費了我將近四十分鐘比賽時長(共5小時)。

3、比賽監考設置存在問題。以本賽場為例,有兩名學生做監考,且比賽註意事項都由學生朗讀,聲音小且模糊,導致我們後排附近的考生聽不清,帶來很多不必要的麻煩,比如提交答案的網址,解壓密碼等聽不清,需要再次單獨詢問。

以上三點,就是我發現的一些問題,個人認為這是考點未盡到義務的地方。真誠希望湖工以後可以註意下這幾點,同時也希望湖工越來越好。。

關於比賽過程

1、 一般是提前20分鐘進場,考生檢查開發板,示波器是否有明顯損壞,檢查電腦環境,如解壓軟件,PDF閱讀器,串口驅動和下載器驅動,keil等。 檢查提供的資料,是否可用。(快速檢查,不然20分鐘一般檢查不完,當然一般沒問題,但有問題的話要及時反映,這一般需要很長時間才能解決。如上所訴)。

2、考場監考員宣讀比賽細則,註意事項。考生按考點給的網址,登錄考試系統。(如果聽不清,一定要要求其講清楚,不然之後沒聽清會很麻煩。)

3、閱讀考試系統說明,如提交方式等,下載試題。(試題是加密的壓縮包)

4、考試開始後,考點給出試題解壓密碼。(試題是PDF版本的,分客觀題和程序題兩個文件分開的)

5、作答,並提交答案。(建議先做簡答,做完後在考試系統上提交答案,然後在做程序題。答案可提交多次,以最後一次為準。)

6、程序題需要在開發板上有程序,還要按考試系統要求提交源碼到考試系統。
註:考試時間以考試系統倒計時為準。。

關於自己

我得承認,當時確實自己心態調整的還是有問題的。起初,因為考試系統網址和解壓密碼聽不清,看不清,有點心煩。等平靜下來卻發現提供的LCD例程無法下載,驅動顯示黃色感嘆號。多次嘗試無果,尋找老師,老師當時不在現場,只能找當時的學生監考,他們表示這需要去找老師,這時心情已經低入谷底。當然期間老師也是換了又換,無法解決,等問題真正解決了,看了時間又覺得時間又不夠了。後來也僅實現了部分功能。

當然,解決最後問題的那個老師,也提過要給我補部分比賽時長。被我自己拒絕了,可能是當時心態已蹦,已經想要放棄了吧。事後想想,還確實挺後悔的。

總之,放棄的是自己,後悔的也是自己。心態調整的不好,且不能怨天尤人,只能慢慢從經歷中反思,提高自己的能力。。

不管怎麽說,我還是參與了,我也和其他同學努力了那麽久。關於備賽經驗,我想我還是可以提供點參考的。

對於嵌入式的開發板CT117E,還是值得仔細對待的。

關於LED驅動

我想,可能大家都會覺得LED沒什麽可說的了,只是簡單地IO操作。但是我想說,No,這裏有個陷阱。而且我覺得如果想參加藍橋杯嵌入式並用過這個開發板的人,應該都會碰到。

這個問題就是,LED與LCD,PC8-15端口公用的問題。不考慮這個問題的後果就是,LCD和LED同時使用時,如果操作了LCD後,再去控制一個LED,可能會出現沒被控制的LED,被莫名其妙的點亮或熄滅。

原因為何?能解決麽?怎麽解決?

原因:LCD和LED同時使用時,如果操作了LCD後,會導致pc8-15上的電平改變,如果此時控制某個LED燈,更新鎖存器,會造成被LCD改變的電平也同步到LED燈造成誤觸發。

可以解決,解決的原理是,每次更新LED時,將PC8-PC15的引腳狀態都更新到合適電平後,再更新鎖存器。

提供我自己的代碼,方法不止這一種,僅供參考。

 1 //LED燈控制函數  
 2 //註意:第一次調用此函數時,務必需要控制所有燈,即LED_Control(GPIO_Pin_All,0);或 LED_Control(GPIO_Pin_All,1);
 3 //原因是:保證LED狀態標記變量和當前LED狀態同步
 4 //LED:被控制LED所連接的STM32引腳,如GPIO_Pin_8,GPIO_Pin_All
 5 //LED_Status:新的狀態,0:滅 1:亮
 6 void LED_Control(uint16_t LED, uint8_t LED_Status)
 7 {
 8     static u16 temp = 0;  //16bit,靜態的LED狀態標記變量,保存LED的狀態
 9 
10     if(LED_Status == 0)
11     {
12         temp = temp | LED;   //更新LED狀態標記變量,將某一位值(受控LED對應的)置高電平
13     }
14     else
15     {
16         temp = temp & (~LED); //更新LED狀態標記變量,將某一位值(受控LED對應的)置低電平
17     }
18 
19     GPIO_Write(GPIOC, temp);  //將LED狀態標記變量寫出,改變LED狀態
20     
21     GPIO_SetBits(GPIOD, GPIO_Pin_2);   
22     GPIO_ResetBits(GPIOD, GPIO_Pin_2); //狀態鎖存
23 }

關於蜂鳴器

為保證考試環境安靜,感覺蜂鳴器一般考試時不會涉及,。但作為一個考點--引腳重映射,也可能會考。

以下三句話就是引腳重映射(註意AFIO時鐘使能)

1     GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST,ENABLE); //PB4 重映射
2     GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);    
3     GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);

PB4與PA13,PA14,PA15,PB3一樣屬於SWJ接口IO,有多種分配方式

如下圖,任意一種可用的重映射方式都可以。即上述三句,任用其中一句。(註意:SWJ重映射,可能導致下載時需要按一次復位鍵,才可以)

技術分享圖片

關於按鍵

按鍵例程,寫的較為簡單,未消都,也不能保證按鍵次數。

因此,按鍵例程不具有參考意義。建議理解使用正點原子提供的按鍵例程方案(只討論方案,這絕不是廣告,資料可免費,免註冊在開源電子網下載,http://www.openedv.com/thread-12895-1-1.html)。

原理是:檢測到按鍵按下時,返回一次鍵值,並置位標誌,不在返回有效鍵值。直到檢測到按鍵被釋放後,才會復位標誌位,繼續下一次按鍵掃描並返回鍵值。這樣就保證了一次按鍵按下,只有一次有效鍵值被返回。

關於uart

串口就是一個簡單地外設,配置較為簡單。再此只強調已回車結束的接受中斷。

 1 #define RX_MAX   20
 2 extern  uint8_t USART_RXBUF[RX_MAX + 1]; //接受數組
 3 uint8_t RXOVER = 0;   //接受完成標誌
 4 
 5 void USART2_IRQHandler(void)
 6 {
 7     u8        Rx_temp    = 0;//臨時接受
 8     static u8 Rx_ipos = 0; //數組數據位置標誌
 9     static u8 Rx_flag = 0; //接收到回車(0x0d)等待換行符(0x0a)的標誌
10 
11     if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //判斷中斷線
12     {
13         Rx_temp = USART_ReceiveData(USART2);   //接受數據
14         USART_ClearITPendingBit(USART2, USART_IT_RXNE); //清中斷標誌
15 
16         if(!Rx_flag)             //未接收到回車符
17         {
18             //判斷接受的數據是什麽
19             if(Rx_temp != 0x0d && Rx_temp != 0x0a)
20             {
21                 //普通數據,接受
22                 USART_RXBUF[Rx_ipos++] = Rx_temp;
23             }
24             else if(Rx_temp == 0x0d)
25             {
26                 //回車符,開始等待換行符以確認結束信號的到來
27                 Rx_flag = 1;
28             }
29             else
30             {
31                 //換行符,此情況下無回車符,數據不合法,丟棄該幀
32                 Rx_ipos = 0; //將位置復位,即丟棄該幀數據
33             }
34         }
35         else if(Rx_temp == 0x0a)
36         {
37             //接收到0x0d的情況下,接受到0x0a,數據正確合法,接受完成
38             USART_RXBUF[Rx_ipos] = \0; //加入數組結束符
39             RXOVER  = 1;//置位接受完成標誌位
40             //等待下一幀數據來臨
41             Rx_flag = 0;//恢復等待回車符
42             Rx_ipos = 0;//存儲位置復位
43         }
44         else
45         {
46             //接收到0x0d的情況下,卻沒有接收到0x0a,數據幀不完整,丟棄該幀
47             Rx_flag = 0;//恢復等待回車符
48             Rx_ipos = 0;//存儲位置復位
49         }
50     }
51 }

關於x24c02,timer(PWM,捕獲),RTC,ADC,DAC,EXIT等考到的知識點,都較為常用,且這部分例程還可以。再次不在展開了。

有不理解或想了解其他的,請留言。。。此貼完

第九屆藍橋杯-嵌入式比賽體會與備賽經驗