HAL庫|神器cubemx的正確打開方式


前言

工欲善其事,必先利其器。HAL庫的開發不一定必須使用cubemx,但是使用了cubemx,你絕對不會后悔。基於一些小伙伴對cubemx的使用還有一些疑問,本次小飛哥從新建工程到生成工程,編寫應用代碼,和大家一起聊一聊到底該如何使用這個神器。本次是建立在已經安裝好cubemx的情況下,錯誤之處還請多多指教。

1、cubemx總體界面介紹


  選擇控制器MCU/MPU,有4個選項,一般小飛哥最常用的是第一個和第四個,第三個主要是沒有對應板卡,可以快速找到自己用的MCU。


  通過板子選擇,如果小伙伴們手里有里面的開發板型號,可以直接選擇開發板,另外兩種小伙伴們可以自己摸索摸索啦,就不啰嗦了。

2、cubemx芯片界面介紹

小飛哥本次使用的是上期介紹的falling-star board,主控STM32f103RET6,cubemx選擇的是此型號。


MCU工程配置的一些說明:


  如果使用cubemx創建工程,選擇好MCU之后,小飛哥經常按照以下幾個順序(純屬個人習慣,大家參考即可):

時鍾選擇配置

STM32 有4個獨立時鍾源:HSI、HSE、LSI、LSE。

  • HSI是高速內部時鍾,RC振盪器,頻率為8MHz,精度不高。

  • HSE是高速外部時鍾,可接石英/陶瓷諧振器,或者接外部時鍾源,頻率范圍為4MHz~16MHz。

  • LSI是低速內部時鍾,RC振盪器,頻率為40kHz,提供低功耗時鍾。 

  • LSE是低速外部時鍾,接頻率為32.768kHz的石英晶體。

其中LSI是作為IWDGCLK(獨立看門狗)時鍾源和RTC時鍾源 而獨立使用,而HSI高速內部時鍾 HSE高速外部時鍾 PLL鎖相環時鍾,這三個經過分頻或者倍頻作為系統時鍾來使用。

注意:內部高速時鍾相比較外部高速時鍾是不夠穩定的,在一些極限條件下,很可能出現始終不穩定,導致通訊失敗。

根據自己需要以及硬件設計,如果設計有外部時鍾,建議一定要選擇外部時鍾作為時鍾源,不用的話,你設計來干嘛呀~


  如果確定使用內部高速時鍾的話,上一步選擇時鍾的操作就不用做了,cubemx新建工程,默認是內部高速時鍾。

  確認了時鍾來源之后,就可以為我們的外設接口分配時鍾頻率啦,一頓操作猛如虎,感覺做了很多,有感覺什么又沒做,倍頻、分頻,最終得到合適的時鍾頻率。

仿真器、時基配置

外設等MCU資源配置

本節我們以最基礎的GPIO配置、定時器配置、串口配置來說明如何配置使用到的MCU資源。

  • GPIO配置(經典點燈)

硬件連接PA2,這里提一句,由於設計的是灌電流的方式點亮LED,一定要注意MCU IO所能承受的灌電流,選擇合適的阻值。


  點亮LED,我們只需要控制PA2引腳的輸出電平即可


  需要對IO進行一些配置,關於輸出模式,推挽或者開漏,上下拉,既不上拉也不下拉,輸出速度,可以與標准庫里面的50MHZ,100MHZ聯系起來,一個道理,GPIO的配置就是這么簡單。

  • 串口配置(經典printf)

這個就比較簡單了,不多做介紹了。


  中斷需要手動開啟,DMA設置可以添加TX或者RX,IO配置可以看到已經是復用為串口模式了。

  • 定時器配置(哪都少不了的神器)

定時器的功能就比較多了,輸入捕獲、PWM、比較輸出等等,本次僅僅介紹定時的功能。

關於定制周期的計算,T = 周期/(分頻系數/時鍾頻率),比如,72MHZ頻率下,圖示配置周期為:T = 100/(72000000/7200)S = 0.01S,即10ms

那時鍾周期是多少怎么確定的呢,這就需要看時鍾樹,以及TIM3掛載在哪個時鍾下了,TIM3是掛在APBH1時鍾線下的,所有時鍾頻率為72MHZ。

配置項總覽

對於我們剛才的配置,我們可以通過圖示,來對我們剛才的配置進行一一確認,可能有小伙伴發現問題了,那我剛才先點擊每一個模塊,具體參數在這里調整不是更方便嗎?沒錯,我們可以打開所需模塊后,然后在這里統一進行配置,這里關於外設的使用情況,參數配置一目了然,還是很方便的。

3、生成代碼工程配置

配置完之后,我們只需要小手一點,就可以愉快的玩耍啦!

4、代碼風采

可以看到,關於GPIO、定時器、串口的配置生成了獨立的文件,非常的整潔。

  • LED GPIO配置函數
  • 定時器3配置函數

定時器配置分為了兩部分,一部分是定時功能參數配置


另一部分是關於中斷的配置

  • 串口配置函數

串口配置和定時器一樣,也是分為兩部分,一部分是基本參數配置


另一部分是IO復用和中斷優先級配置

5、應用代碼編寫

前面搞了那么多,好像跟我們沒一毛錢關系,接下來,到我們大展身手的時候了,進行應用代碼的編寫,實現定時器控制,500ms串口打印一句話,LED閃爍。

寫代碼啦,寫代碼啦,該怎么寫,趕緊百度百度,WC,怎么沒網了,這怎么辦?其實,基本的接口函數都在工程本身,我們要學會從工程本身去找資料。

  • LED控制代碼編寫

因為我們控制LED亮滅,實際上就是操作GPIO輸出高低電平,我們只需要去找跟GPIO相關的庫函數即可,以下文件寫的還是比較詳細的,該如何使用GPIO驅動庫。

打開GPIO.h文件,關於GPIO操作的函數都在這里,我們要做的只不過是看懂,傳參數就可以了,比如,IO輸出的函數,第一個是輸出高或者低,第二個是IO狀態翻轉,我們都可以用,比如GPIO輸出原型,我們只需要按照說明傳參數就可以了。

void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)

    HAL_GPIO_WritePin(Sys_LED_GPIO_Port,Sys_LED_Pin,GPIO_PIN_RESET);

    HAL_GPIO_TogglePin(Sys_LED_GPIO_Port,Sys_LED_Pin);
  • 定時器代碼編寫

老規矩,打開定時器相關的庫函數,WC,這這么多,鬼知道那個是我需要的~因為定時器涉及到的功能是很多的,這里我們使用的是最基本的定時器中斷,所以只需要去找跟定時器中斷相關的函數即可。我們依然去找幫助說明,在說明我們可以看到,跟定時計數器相關的幾個函數,我們只需要在合適的時機執行這些函數即可。

要實現定時器中斷的功能,我們還需要開啟定時器中斷

既然牽扯到,中斷,那必須少不了中斷響應函數,HAL庫對每一類中斷封裝了個中斷回調函數,定時器回調函數,這里牽扯到一個_weak關鍵字,大家可以百度百度,這里不展開說了,簡單一句話(當然是有很多說法的,大家可以自行百度哈),這個函數,你可以拿到別的文件里不用改名字,我們只需要在定時器中斷回調函數中編寫中斷服務程序即可,有一句話,也是很好的習慣,中斷不要做很多事情,尤其是長延時,最好置個標志就走,萬花叢中過,片葉不沾身那種感覺。

  • 串口代碼編寫

看了前面兩個的介紹,應該不用小飛哥啰嗦該怎么做了吧。本次主要做發送,用串口發送函數即可。

實驗現象

關於Embeded-Party

如果你覺得對自己有幫助的話,給個贊,點個關注,點個在看,感謝前進的道路上有你的陪伴!

所有公眾號文章資料源碼已上傳,關注公眾號回復資料即可獲取哦,歡迎加群一起炸起來!

這里有一群可愛的小伙伴,等待着你的到來,歡迎你的加入!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM