STM32開發入門及實戰

2021-08-31 03:41:18 字數 3116 閱讀 8967

本部落格的編寫目的:

一、自我總結,記錄。

二、分享,輸出,加深思考。

三、不作細緻如書本般編排,儘管那樣的排版很好看,但是過於耗費時間,還有很多東西沒有必要說明,完全可以自己去解決,但還是盡量做好排版,便於閱讀。

四、盡可能舉一反三,做到真正能夠處理實際問題。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...