第九屆藍橋杯嵌入式類比賽賽後總結
阿新 • • 發佈:2019-01-22
今天是週末,我們剛剛結束了藍橋杯的省賽。現在是身心疲憊啊。早上 6點25 鬧鐘剛響就爬起來了,這是這學期以來第一次這麼早起,算上整個寒假還有上個學期,可以說是大半年來起的最早的一次了。加上我昨天晚上沒睡好,原因很複雜,中途起來一次換了內衣,很尷尬。多的不說,草草收拾完就出門了,按規定時間剛剛好趕上校車。這是我第一次參加這種比賽吧,省級的,要到別的學校去的。但是說實話一點感覺也沒有,在車上就是想再睡一次,沒辦法旁邊的同學都拿出自己的筆記來背,我也最後再看了自己總結的網易雲筆記。心想只要不出什麼意外不會有問題的。大概是8點剛過我們就到揚州大學了,果然是別人的大學,看起來就是比我們學校好看。老師給我們分了這半天的乾糧之後我們就進去了,不過這個分的夾心麵包也太難吃了。我們等待了大概十五分鐘才進場的。我的乖乖,嵌入式總共十個人,我們學校就佔了一大半。就是由於人少,我們被安排到另一個機房了。碰到滑鼠想到的第一件事就是翻資料,找 keil。結果出乎意料,委員會並沒有像去年那樣給例子程式,給的是官方庫和一個LCD的參考程式,還有一個去年題目的答案,不過咋一看資料也不缺什麼了。當我還在慶幸還好前兩天把去年的題模擬做了一遍的時候,出事情了!官方給的keil的版本古遠,4.11版!這是什麼年代的東西,首先沒有自動排版,當你換行它不會給你空兩個空格,當你想使用TAB的時候它又是四個空格,當你語句結束敲反括號的時候,它不會自動刪除前面的空白,哇,實在令人捉急,我這個強迫症啊,我可以說整個比賽5小時,我至少花了半個小時在排版上。比賽開始,我很熟練的下載題目並且解壓縮,很快拿到題目。旁邊的人還在糾結理論題在哪做的時候我已經上傳完三道題了。這個理論題對我來說還是挺難的,這種東西平時又用不到,誰會去記啊,我寫stm32這麼久了,就沒認真數過ADC有幾個外通道有幾個內通道,還好可以直接翻看手冊。還有就是數電和模電的知識,考前也正好都沒看。大概用了 20 分鐘才把理論題做完,可能大概也是涼了。進入程式設計題,我想著進來第一件事新建一個自己的工程,把名字、檔案路徑都指定成自己想要的,因為我自己模擬的時候也是這樣做的。於是問題就來了,4.11的建立工程和4.74,5.24的根本不同,或者說有區別,4.11版的選好 RBT6 之後給的彙編程式和以前的不一樣,我也根本沒見過,這就尷尬了,很著急,解決不了。結果沒辦法了,我只好用現有工程來改造了,我首先想到的是用官方給的 Test 工程,這說白了就是去年國賽的題目,在我印象中好像所有模組都用上了吧,除了那個萬惡的蜂鳴器。說到蜂鳴器不得不吐槽,他們微控制器組的蜂鳴器也太吵了,整個比賽下來就沒停過,這邊響完那邊接著響。用著 Test 寫好了 LCD 的主介面,和按鍵掃描,編譯通過,下載也都出來了。挺順利,然後當我寫完 TIM2 的中斷程式的時候,問題來了,去年的題,這個 Test 壓根沒用上中斷!本來想著自己加上去吧,才發現這個 Test 用的不知道哪來的 LIB ,原來的韌體庫 *.c 的檔案全打不開,按 F12 也跳不過去程式定義。心想完了,這可怎麼辦,沒辦法啊。只能再換工程,自己建是不可能了,建了也編譯不通過。當時也沒猶豫,直接就複製了給的 LCD 例子工程,經過一番折騰,讓它大概變成自己想要的模樣,也用上了自己最喜歡的 BSP 來管理模組。時間真的過的很快,我才剛開始寫邏輯部分,先說一下我寫模組的順序,LCD, EEPROM, KEY, TIM, RTC, PWM, LED。我剛開始邏輯部分,後面幾個老師就開始用午餐了,那香味......沒辦法,忍了吧。可能因為比較著急,時間過去一半了,加之肚子不舒服,膀胱也難受,我寫邏輯部分並不是那麼順暢,寫一點忘一點,又回去補。前前後後測試了好多次,主要的還是這次的省賽加入了短按和長按的區別,這個區別的加入,就意味著邏輯部分由原來4個點,變成了現在7個點,其中按鍵1不需要長按。還有一個問題就是它需要儲存時間,印象中時間應該是32位的,比賽的時候不記得了,全弄成16位的了,而且儲存的時候,給的例子是一次儲存8位資料的,這意味著16位和8位之間又要進行轉換了,對於當時的我,無疑是巨大的挑戰。就算是平時我也要思路非常清晰才能完全理順。就這樣,這個地方成為了我最大的遺憾,它讓我的儲存EEPROM這一塊沒有做好,按鍵加加滿回零這個地方也沒有寫出來。前面的都大概測試的差不多之後,放棄了一些,決定把最後的 PWM 和 LED 寫出來,當時剩下大概1個半5小時。PWM 實在是寫了太多次了,要去哪複製都太清楚了,複製貼上修改執行。很快完成,但是波形沒有出來,哇,好難受。由從頭檢查了一遍,並且又把頻率佔空比計算了一次,再執行,示波器上還是沒出來波形,於是我在想是不是我不會用這個示波器了,我平時做 PWM 都是從這個引腳輸出,到另一個引腳測量的啊。弄了半個小時,我決定把該寫的程式寫上,測試就不測試了。趕緊寫 LED 模組,LED 模組這個地方可是我特別注意過的,之前在這裡碰過壁。由於 LED 和 LCD 的資料線用了相同的引腳,在 LCD 執行的時候會影響到 LED。這個當然,官方給出瞭解決辦法,就是用了一個鎖存器,具體型號可以看原理圖。我練習的時候發現,我寫的 LED 之所以會被影響,是因為我每次點亮或者熄滅 LED 燈都是一個個來的,比如當我點亮 LED1 的時候,人家 LCD 也在傳資料,改變了其他引腳的電平,這就出現了為什麼 LED 總不受控制的感覺。我給出的解決方法是,每次控制都控制所有的 LED 亮滅,用 uint8_t 來初始一個數,轉換成二進位制並通過移位與上1,來判斷燈的亮滅。結果符合設想。LED 很聽話,這個模組可能是我做的最有信心的一個了。至此藍橋杯已經結束,自己吐槽了這麼多,結果也別太在意了吧。哦對了,我還要吐槽的是 XP 系統,當我把視窗最小化的時候,滑鼠是動不了的,這又得浪費多少時間啊,用了 XP 才發現原來win10 是這麼好用的系統。自己吐槽了這麼多,其實最大的問題還是自身的問題,嵌入式並不是我想的那樣只要呼叫庫函式,改改已有的程式。一個合格的嵌入式工程師,我認為是能夠熟練的寫底層,也能靈活的使用庫函式,根據自己的邏輯來編寫程式,切勿淺嘗輒止。這五個小時做沒做出來並不能代表什麼,這是比賽又不是實際應用,學習嵌入式就是能夠自己設計硬體自己編寫軟體來實現想要的功能,而不僅僅侷限於比賽。對於能夠呼叫官方的程式來實現,我覺得這也是一種技能,也不是這樣並不好,別人寫好讓你用的東西為什麼不用呢?刨根問底,未雨綢繆。喜歡和工程師交流,也想要成為合格的工程師。最後給出的比賽建議就是① 自己平時模擬的時候要用 4.11版本的。② 數電模電的知識一定要掌握好。③ 一定要多寫些邏輯,意思就是多模擬整套題,能寫好一個程式用好一個模組並不代表能寫好整個程式。④ 知識掌握不好,比賽將是一種煎熬。⑤ 有機會多用用示波器。