本部落格的編寫目的:
一、自我總結,記錄。
二、分享,輸出,加深思考。
三、不作細緻如書本般編排,儘管那樣的排版很好看,但是過於耗費時間,還有很多東西沒有必要說明,完全可以自己去解決,但還是盡量做好排版,便於閱讀。
四、盡可能舉一反三,做到真正能夠處理實際問題。12
345stm32開發實戰 (1)
目錄一、概述,目的
二、搭建步驟
三、時鐘部分案例分析
四、理論總結
一、概述,目的
目的:解決stm32入門問題
個人認為stm32的最快,最直接的入門方法之一就是:從stm32cubemx+keilv5入手。無論 你採用freertos還是keil自帶的rtx,通過圖形化的介面配置,都能快速生成專案所需的基礎層架構**,從而將主要精力用於自身專案需求開發上,大大提高開發效率。
上一段話包含兩層意思:1、在不熟悉stm32的情況下,如何入手學習相關的技術知識。2、在不熟悉stm32的情況下,作為公司在職開發人員,如何快速進入stm32相關的專案開發工作中,保證開發效率。12
345二、搭建步驟
安裝完成後,就可以選擇你要使用的具體晶元型號,本篇晶元為stm32030系列 、stm32103系列
初始介面如下,圖形化的管腳配置,點點滑鼠就可以,so easy!更深入的在後續章節再說。
左側欄先要注意的幾個問題:
1、你可以選擇是否使用freertos
2、如果選擇外部時鐘,請務必選擇 「rcc-hse 選項,如圖配置」否則 input frequency 輸入選項不可更改,系統時鐘最高只能為64mhz,達不到72mhz
3、sys選項,時鐘源雖然預設看起來是systick,但實際上沒起作用,所以,需要重新選擇一次,知道sys標題變綠色,即選擇成功。
自己摸索一下,看看網上的教程,比如「微雪教程」。然後,選單欄 project->generate code
生成**之後,就可以直接開啟工程了。
開啟工程後預設的專案檔案列表:
三、時鐘部分案例分析
對於微控制器系統來說,cpu和匯流排以及外設的時鐘設定是非常重要的,因為沒有時鐘就沒有時序。
1ahb匯流排,這是貫穿所有外設的一條匯流排,上圖可知:ahb經過橋接,由apb1、apb2控制著幾乎所有外設;
apb2屬於高速裝置; (控制著如:adc、gpio、exit、tim1等外設)
apb1屬於低速裝置; (控制著如:dac、timx、usart、i2c等外設)
很多人在講解知識時,如上作以解釋,有用嗎?反正我覺得是沒用。那怎麼做更好呢?
看乙個我碰到的專案例項:一同事在用stm32cubemx生成的**,要交到我這裡來對專案**進行整合,**裡用到的延時函式有兩個hal_delay(), osdelay(),理論上,這兩個延時函式的引數延時基準都是ms,也就是說hal_delay(1000), osdelay(1000)都表示延時1000ms,但是我還是要測試一下延時是否準確,因為還有其他好多地方要用到,而且對延時精度要求可能更高點。12
通過示波器測試得知osdelay(1000)是準確的,而hal_delay(1000)的延時值實際只有500ms,問題在哪呢?通過圖形配置部分,得知他設定的sys 時鐘源為tim1,那麼,理論上是和apb2的fckl2相關。我們先定得找到延時函式所用到的引數配置,看源**:
函式原型:
__weak void hal_delay(__io uint32_t delay)
}–>
__weak uint32_t hal_gettick(void)
–>
static __io uint32_t uwtick;
__weak void hal_inctick(void)
–>
void hal_tim_periodelapsedcallback(tim_handletypedef *htim) // 在 此檔案下,定義了 tim_handletypedef htim1;
–>
__weak hal_statustypedef hal_inittick(uint32_t tickpriority)
–>
hal_statustypedef hal_inittick(uint32_t tickpriority)
由uwtimclock = hal_rcc_getpclk1freq(); // 開始這裡用的pclk1,顯然不符合理論要求
串列埠輸出除錯資訊:
dbstrlong(「pclk1freq」,hal_rcc_getpclk1freq());
dbstrlong(「pclk2freq」,hal_rcc_getpclk2freq());
pclk1freq 36000000
pclk2freq 18000000
由uwtimclock = hal_rcc_getpclk2freq();// 這裡修改後,測試延時仍然不正確,為什麼?pclk2freq 18000000 頻率是不對的,而要修改pclk2freq的值,無非就是修改apb2的分頻值。本來是可以直接再圖形配置這裡直接修改的,但是我要做**整合,很多**自動公升後,修改不方便,就直接通過原始碼修改。在系統時鐘初始化函式裡,如下:
systemclock_config(void)
串列埠輸出除錯資訊:
dbstrlong(「pclk1freq」,hal_rcc_getpclk1freq());
dbstrlong(「pclk2freq」,hal_rcc_getpclk2freq());
pclk1freq 36000000
pclk2freq 72000000
再次測試,結果就正確了。
上邊的問題說明三點:
1、雖然定時器(timer)1是由apb2的pclk2提供的時鐘輸出,但是解決問題的辦法並不是死的,所以由hal_rcc_getpclk1freq();提供的頻率輸出,結果不會錯誤,然而不符合理論要求:所以還是要在源
頭修改。特別是整合程式時,基本我不再用stm32cubemx去自動生成**,不然很多**被自動修改,會造成很**煩。
2、stm32cubemx生成的**,有可能存在bug,所以除錯需全面考慮。
3、在不用手冊,通過觀察cubemx圖形配置部分,然後明確具體有關時鐘匯流排,外設關係的情況下,就可以找到**的問題所在。
然後參照上圖詳細總結一下系統時鐘的關係如下:
stm32基礎入門
1 開發工具,初學者建議mdk,後期ivr 2 暫存器開發or庫 版本開發 先暫存器開發,後期兩者結合 3 軟體 or開發板,先軟體 後期兩者結合 建立工程 1 包含三部分 start user lib output outlist資料夾 並設定 outlist目錄 用來存放生成的中間檔案 outp...
STM32學習 入門
嵌入式系統定義 以應用為中心,以計算機技術為基礎,軟硬體可按需求進行定製,從而滿足各種設計指標。與通用計算機系統不同在於它是為某些特定任務而設計的。體系結構 嵌入式硬體 處理器 外圍裝置 嵌入式軟體 作業系統 應用軟體 微控制器與微處理器 常見外設介面和匯流排 嵌入式作業系統 搶占式排程機制 響應時...
STM32基礎入門(二) STM32入坑指南
最近有不少學弟新入微控制器的坑,萬事開頭難。作為乙個比較陌生的領域,再結合我當時入坑時的一些問題,寫下這篇部落格,希望能夠給初學者一些啟發。1.開發板的選擇 學習stm32,不能繞開的第一件事,那就是開發板。開發板的意義 開發板提供了足夠的資源,包含硬體資源和軟體資源。硬體資源,即開發板上自帶的le...