Skip to content

VR2XHQ/myclock_stm32cube

Repository files navigation

關於 HAM CUBE 與我的故事

My_HamCube_1 My_HamCube_2

GitHub license GitHub last commit GitHub release

為何建立這個倉庫

申請GitHub帳號已是2021年的事,除了方便書籤別人的倉庫外,沒利用它做點什麼。至2023年第一次嘗試建立倉庫,無目的地試玩一下。到了2025年中,想到何不利用它來記錄個人的回憶,這倉庫是其延續,也是必須完成的重要記錄。那些年,在疫情底下,做了些什麼呢?

自從踏入近乎半退休的狀態,生活漸復日常,閒餘時間多了許多。2019年初重投業餘無線電的世界,硬件的各色各樣,既新鮮又有趣。遇上 COVID-19 横跨那好幾個年頭,世界給改變了,自己的人生也在變,彷佛正好配對上。疫情下的限敍,社交活動趨零,呆在家中閒來無事的日子更方長,總得找點事情去幹,成就了老來再次學習編程的歷程。

2019年8月,BA6IV 在論壇上發佈了 HAM電子模块主控板 團購項目,提供套件及成品。項目的理念很棒,作為業餘無線電愛好者,焊接套件既可提升動手能力,完成後是現成的 CW 練習器,用來學習 STM32 編程亦可,實在是一舉多得。當時剛剛起步追尋「遺失」已久對電子類硬件的興趣,學好 CW 亦是個人長期的夢想,正好趁便弄來練習,於是加入QQ群。很久未搞過焊接了,完成套件有點侈望,故選擇了成品。幾經轉折,獲得了一台v1.07版本,及後再購另一台V1.09版本。照片中的自動鍵,是群友於同期推出的團購製品。

在QQ群裏,BA6IV 除了分享練習CW的心得,亦指導 STM32 編程入門。當時對寫程式一頭霧水,沒有太大的興趣,主要還是搞硬件。雖然初心是用它來練習 CW,事與願違,未能堅持。好玩的東西太多了,沉迷於搞天線,FT8通聯等等,練習器被投閒置散。轉變於2020年中發生,在FT897面板LCD的誘因底下,入手研究 Arduino。當堆積足夠的思緒,某天突然心動,為何不可以也來研習 STM32 編程。由零再起步,需要好幾倍努力,最終秏上大半年時間,於2021年末完成了自己的時鐘 myclock 固件,運行在它身上。

事隔多年才來做文字記錄,記憶早就模糊了。現在袛能夠依靠保存的照片與及構建工程項目下的檔案,參照其生成日期,嘗試逆向還原。唯一可以肯定的,疫情推進了這個故事。

硬件的陳述

練習器採用 STM32F103CBT6 做核芯,原型從另一活動延展過來的。我擁有早期兩個版本,都是成品,當前的使用手冊做了詳細介紹。如我的小白很多,所以貼心地補充操作提醒。往後 BA6IV 持續改良硬件,增加金屬外殼,並定性為商業版,名為 'HAM CUBE',更新使用手冊,固件支援早期的套件/成品,並以固件V3.xx作為分水嶺,硬件版本至v.130為止,現時已停産。2021的下半年,全新版本推出,硬件升級用更快的芯片及更大的顯屏,介面全面換新,名為 口袋精靈 CW POKEMON,現時仍在銷售。由於個人興趣的轉向,這一版本就沒再跟進了。

以下是可供 DIY 的硬件資料,至於軟件,袛適配特定的固件。按版本說明,商業版固件 V3.12.08 是最後的更新。

一直好奇商業版固件如何禁止 DIY 練習器使用,現時想法是,大概與硬件識別相關吧。近年 AI 盛行,DeepSeek 給了許多可行方案,正好記錄在此。採用外部儲存識別ID資料的方案,相信比較接近事實。HAM CUBE 配備有 SPI flash W25Q80,可作這樣用途,但未經驗證。因為它是用來存儲練習器的資料的,不想錯誤蓋過,所以時鐘程序沒用上,數據都存儲到 SD3078 的70字節通用 SRAM 寄存器。

那時在QQ群裏比較活躍,有許多硬件上的小白問題請教,獲益良多。每次發佈固件更新,我都下載來試用,保存至今。升級固件的方法有兩種,專用編程器直接燒寫,或者經bootloader虚擬U盤上傳。已購買st-linkV2備用,要配合軟件燒寫工具,但不太懂得使用,所以初期袛用USB接電腦來更新固件。

使用體驗陸續顯露了硬件設計上的瑕疪,需自己動手修改。其中穩壓IC採用經典的AMS1117,因為壓降要求大,出現不穩情況,在隨後的1.09版生産時已即時改用XC6206。1.09版存在隨機的重啓故障,建議作這樣的修改。手上的並無問題,所以沒去改它。但這樣把掦聲器的供電改接電池,撓過了穩壓IC供電,明顯改善1.07版發聲時LCD出現的閃動情況。隨1.09版發貨時,BH6ODC 順便給我 XC6206,因為太細粒,大意地掉了。之後另行購買,依照指引將1.07版穩壓IC也給換了。

2020年主要在玩硬件,另購買了兩個配件擴展板收音器,組裝成這個模樣,並做簡單測試。它們配合成為CW解碼器,同年11月有CQWW比賽,拿來實測表現,袛要訊號不是太差,效果滿意。當時曾有過念頭,也來搞一個擴展板吧,做點什麼的呢?

以專用編程器上載固件還是必需學會,否則是無法升級新的引導固件。於是下載安裝st-link軟件,參照教學指引,連接6P插頭接線至HP主機,反覆練習燒寫作業,再將接線位牢固成陽春版的工具,一直陪伴往後的軟件開發。

BI6AV 寫了這個代碼,示範了練習器的其他用途,袛要配上DS18B20就變成記錄温度的工具。於是立刻購買這個測温元件,把它連接至CW鍵插口,固件上載後成功偵測温度。及後更嘗試直接焊到插口,變成為內建測温元件的練習器。不幸地在後期調試DS18B20代碼時,不小心錯誤操作,造成一個GPIO管腳損壞,沒法控製輸出電平,而且關機存在漏電情況,加快電池掉電。

換上定製的固件便能夠實現不同的用途,實在太好玩了。但要製作這類固件,需要寫代碼,自己又能否做得到呢?

代碼的進程

認真去學寫代碼應是由此而起,從來青蜒點水般,三分鐘熱度。誠如母親說,「你什麼都【好】,周身刀無張利」。早在 APPLE II 年代,曾寫一個按鍵發出CW聲音的組合語言,沒留下任何記錄。原意用來學習CW,因為十分簡陃,當然不好用。代碼存到錄音磁帶,每次都得重新載入,手續繁瑣漫長,最後不了了之。唸初中時已十分喜愛無綫電製作,曾考慮進專科學校唸書,結果一切止於愛好。踏入謀生計的職業生涯,與電腦科學毫無交集,使用電腦限於日常工作需要而己。靠丁點理科根底,也曾斷斷續續自學一些程式語言,都沒法持之以恆,早已忘記了。這方面的書曾買一大堆,某回斷捨離時,全部給棄掉了。其中較有印象的,是倉頡輸入法之父朱邦復先生的「組合語言的藝術」。書已成絕版,慶幸能夠重温線上版本。我對組合語言,既喜愛亦怕難,直到最近才再拿來把玩

上世紀七八十年代,電腦從學苑商用漸漸走入尋常百姓家。所謂個人電腦,擁有的第一台是自行焊接組裝的「偽」APPLE II。當年流行價廉的仿製成品,也提供省點錢的套件。多年來一直都有電腦相隨,第二台是 IBM PC clone,讓我掉進組裝PC的洪流裏。砌過的機不計其數,都是工餘嗜好而已,硬件裝裝拆拆,什麼都想試一下,結果袛剩曾經玩過的回憶。後來厭倦了,過渡到 iMac,用上好多個年頭,可惜2016年中壞掉了,順道離開蘋果生態。其間也曾擁有過幾台PC手提電腦,做那上網文書的事情,成為不折不扣的用家,雖然間中也會做點不實務的,例如在 eeePC 上安裝 Hackintosh,在 Surface Pro 4 上玩 FT8。2019年9月彷彿回歸於簡約,買了台廠機 HP ProDesk 400 G5 Desktop Mini。電腦硬件迭代神速,AI鋪天盖地而來,老舊的 Intel Core i7-9700T 已成昨日黃花。不過之於我夠用就好,陪伴無數晚上編程至今。

電腦依靠作業系統運作,DOS/WINDOWS 似乎是必修課。WINDOWS 佔據了商業領域的使用,但我並不太喜歡。後來迷上了 IBM OS/2,認為多工作業才是王道。工餘每晚為數十張磁碟的安裝而折騰的較多,實質沒怎樣深度使用。那時期的 Linux 同樣有點高大師,但更不親和。曾玩了一點兒,買過看了也不明的 Linux Bible,實在太難用,放棄了。MacOS 肯定是使用者友善,底層 UNIX like 被包得密實,雖然有接觸 Xcode,袛於看看,未曾深究。HP PC 跟機是 Windows 10,終於完全脫離盗版使用,是我喜歡的版本,由它引領開展研究編寫嵌入式單片機代碼。

早年錯過了學習 C51/PIC 單片機的時機,似乎理所當然由 Arduino 來填補,從頭入門學習,透過大量網上教材,手把手地模仿前行。單片機好玩的地方,袛要代碼上載成功,執行無誤便看得見成果,實實在在充滿成就感。Arduino 語法底層是 C/C++ 包裝,取其簡單易用,適合初學。要更好地運行單片機,C語言是必修之課,於是從入門書起始,認真地遂行輸入代碼及嘗試理解。到了有一定的基礎,才開始入手搭建 STM32 編程的環境。

在QQ群有很多學習資料,原來計劃按這個指引去搭建,然後依照時鐘教程配合 HAM CUBE 起步。但 Keil 當時還未開放供個人使用,免費版有生成固件大小的限制,一般都會採用破解程序來撓過它。基於個人的執著,最後選擇了官方的 STM32CubeIDE,那時的版本是 1.6.0。實質與 Keil 大同小異,各有優劣,袛要修改一些地方來適配。

LCD 顯示的內容,與及按鍵的反饋,是最直觀的成果。當這些基本上搞定後,就是針對時鐘芯片 SD3078 的細研,一份 datasheet 反反覆覆地查閱,希望搾盡每一項功能,這個時鐘初形出來了。之後整整花了個多月,建構成這個模樣,時鐘芯片自帶的温度偵測也加進了。那段日子裏,滿腦子是代碼內容,往反跳轉於程序的走向,預視生成的效果,就連睡了也未停去想。至此時鐘功能基本上完成,可以用於日常。老婆經常表示,何不直接買個時鐘,郤浪費這麼多時間來做一個。

接著另開DS18B20工程項目,遂步構建功能DS18B20不同规格,買了一些來實驗,原來存在仿品。參考的例程多數不涉及 ROM ID 搜尋,於是深入研究 1-Wire 原理,採用這個例程,以二元樹方法來做搜尋。1-Wire 對時脈準確度要求比較高,經無數次測試,不眠不休落了很多功夫才掌握,初步完成這個功能。但搜尋部份的原始碼是存在問題的,間中出現不正確的結果,苦思後解決了,終於完成靠譜的讀取。再整理各種功能應用,並加進自動量程為延伸呼叫的子程序,完成了這個獨立的温度測量固件。

單片機的運行是單工的,依照程序跑的死循環。要它做實事,袛要按步就班老實地執行,不卡在死胡同裏。細心地佈局,恰當的進出控制,基本上可以無限延伸不同應用。經過幾個月的埋頭鍛練,把這兩個獨立應用整合,所秏時間相對地短了,小修小補完成了這個近乎最終的版本,並且將原始碼上傳到QQ群裏。當然對於大部份群友而言,時鐘並非什麼令人驚歎的事情。

曾幾何時,看到什麼 GPIO 的描述,完全摸不著頭腦。那些變數形態,指針等等,了解得還是十分膚淺。事實上,完成的原始碼,是土法錬龬般東湊西併而成,「藝術化」的空間仍多。但教曉自己,專注一件事的重要性,否則什麼都不是了。

有些 bug 是在使用中才發現,問題在計算日期的代碼上,沒考慮潤月的結果。另外擴充了計時功能,變成倒計時及秒錶。2022年中,更新版本上傳到QQ群取代舊的。那時遇上 C51加強版的 CH549,用 SDCC 玩了一會,自然也想用 Keil C51 試一下。因此才醒覺,Keil MDK 免費版的消息,於是也下載來註冊使用,並將原始碼滙入,做了一些微調後成功編繹。後來又做了些小改動,在跨年時找到另一個 bug,也是 UTC 運算上的錯誤,再次完成修補

這個基於 HAM CUBE 的故事,隨著疫情於2023年的退場,走進穩定狀態沒進一步發展。預留擴充的部份,一直未有好的點子去再搞。事實亦太多搞作,未能閒下來專注研製。至年中袛對倒數計時做了點優化去減少顯示的跳動,都在 Keil 下完成。除了再次替換QQ群裏的上傳檔案,GitHub 也開了倉庫,稱它為 myclock_keil

倉庫的目錄結構

myclock_stm32cube/
├── assets/                 # 圖片展示及各種參考資料
├── BSP/                    # 自訂模組(LCD、RTC、DS18B20 等)
├── Core/                   # HAL 初始化與中斷處理
├── Drivers/                # HAL/CMSIS 驅動程式
├── .gitattributes          # 執行自動化文件
├── .gitignore              # Git 忽略設定
├── .mxproject              # CubeMX 專案設定檔
├── LICENSE                 # 版權說明
├── README.md               # 專案說明
├── STM32F103CBTX_FLASH.ld  # linker script
├── myclock_stm32cube.ioc   # CubeMX 設定檔
├── myclock_stm32cube.pdf   # CubeMX 輸出的詳細項目設定
└── myclock_stm32cube.txt   # CubeMX 設定文檔

在 Linux Mint 架設開發環境

上述 STM32 的專注研習止於2021年,之後是多向並行,都在 Windows 10 環境下進行。但參考的資料很多時都扯上 Linux,心想為何不也再次把玩它。Linux 原來經過這許多年頭的發展,已經變得平易近人。SBC 是單片機的近親,沒玩過 Raspberry Pi,對它的鍵盤電腦 Pi 400 郤有點興趣。湊巧遇上這台國産 Orange Pi 800 的推出,它以 Linux 為作業系統,採用 arm64 架構。既然暫時不願「冒險」在日常使用中的 HP mini 上做 dual-boot何不買下來先行預習 Linux 的操作環境,看看是否能夠適應,同時亦可了解一下它類似單片機般的控制應用。可惜這台産品實在有點那個,問題多多,已經停産,亦沒有後續。我那台已無法再啓動,相信是 RAM 壞掉。如今回憶,那時的決定其實更加冒險,因為雖然同是 Linux,走進了另一硬件架構裏,困難程度總比成熟的 x86_64 來得多。不過,確實也有所得著,多長知識。後來老婆的 Surface Pro 4 退役,正好利用它,雖然性能老掉牙,安裝 Ubuntu 尚算稱職,操作暢順。後來才明白原來可以把 Linux 安裝到外置硬盤,隨身携帶,方便地拿到另一台PC上運作,實在太棒了。多翻折騰後成功將 Linux Mint 安裝到舊的 USB 外置硬盤上,速度上是有點慢,但使用上還行。之後反覆試裝過一些 distro,掌握了基本原理,同時也試過 VM 方法,最後買了 Klevv R1 500G SSD,定格在 Linux Mint,成為往後日常主要的使用場地,取其穩定及易用。

這倉庫的工程項目是在 Linux 重新構建的,當前 STM32CubeIDE 版本是 1.19,工具鍵稍有差異,滙入時作了些幑調整,大致上順利。另外遵循:無論在哪個 IDE 或建構系統,應該把程式碼放在 .c,.h 只放宣告。這樣才能保證跨平台、跨工具鏈都能正常編譯。font_ext.h 分拆出 font_ext.c,於近年官方推出的 STM32VSCode 上也能夠順利編繹。新的 IDE 是以 VS code extension 形式來工作的,確實是十分貼心的取向。因為它採用 CMake 來建構,移植舊工程項目時,需作一定程度的調整,使用起來尚算不錯,十分便利。

另外,由於檔案系統操作上的差異,虚擬U盤上傳固件的方法在 Linux 底下需要使用 mtools 的 mcopy 撓過 Linux VFS,才能有效地複製至虚擬U盤。AI 給寫了一個腳本驗證成功上載,可作日常使用。

至此,回憶的記錄,可以劃上一個句號了。

附加內容

About

This story is about 'Ham Cube' which was originally for CW training.

Topics

Resources

License

Stars

Watchers

Forks

Contributors

Languages