STM32的学习记录--单个模块开发思路
1. 前言
很久沒寫STM32的學習博客了,不是因為沒在搞,而且因為STM32要學習的部分太多,而且代碼量太大了,有些代碼還涉及到版權問題,就一直沒寫,最近剛好在搞一個智能設備有關WiFi模塊的開發,大概總結一下,在STM32中,單個模塊的開發思路。因為我也是一個新手,可能有些部分說的并不正確,請大家不吝請教。為了盡可能不涉及到版權問題,本博客所有資料均來自網絡,如有侵權請聯系我刪除!
本博客原創,轉載請注明!!!
本文鏈接
個人博客:https://ronglin.fun/?p=92
PDF鏈接:見博客網站
CSDN: https://blog.csdn.net/RongLin02/article/details/115600952
2. 硬件
2.1. 供電分析
因為是單個模塊的開發,所以就用現成已經寫好的系統框架,通常來說廠家會有配套代碼的,這里主要是STM32F4系列廠家自帶的框架,和部分從網上copy下來,用于針腳、串口初始化的部分代碼。這一部分涉及到硬件部分,也是對于入門者而言比較復雜的部分,總而言之,目的就是讓單片機上的STM32F4芯片給要添加的模塊供電和供時鐘信號。
舉一個例子,這是我隨便從網上查到的STM32F4的一個原理圖(如有侵權請聯系我刪除),圖很糊,大致看一下就行,可以看到黃色區域上標注了每一個針腳的序號,而針腳上標注了這個針腳實現了什么功能或者說這個針腳連接了什么模塊。
有的模塊還需要額外配套一個供電模塊,STM32給供電模塊供電,供電模塊給功能模塊供電。
隨便從網上找一張ESP模塊的原理圖(如有侵權請聯系我刪除)
我們一般只需要關注兩個部分,第一個就是綠色區域部分,也就是Vcc供電和控制端部分,看是什么控制ESP模塊的開啟,這里圖是直接連接了高電平,有的時候是一個供電模塊;第二個需要注意的就是右側粉紅色部分,也就是TXD和RXD,分別對應發送和接受端,上圖是接到了一個叫“串口TTL”上,一般在STM32中,也是接到一個獨立的串口里。
這樣就很清楚了,回到我們的目的,我們是想讓STM32控制一個單獨的模塊,那就在STM32中選擇一個針腳,讓這個針腳連接這個模塊(或者是這個模塊的供電模塊),然后我們在代碼里,通過控制STM32的那個針腳就可以實現給這個模塊的上電和斷電。
2.2. 模塊初始化
僅僅控制上電還不行,還需要指定一些參數,告訴模塊要按照什么參數來工作,,這里貼出來一部分從網上找的“正點原子”寫的有關GPIO的初始化代碼,僅用于學習,如有侵權,請聯系我刪除。
//設置高電平GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE); //打開GPIO口時鐘GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//開時鐘//初始化化13針腳,并設置為高電平(即開啟模塊)GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//50MHzGPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO_SetBits(GPIOB,GPIO_Pin_13);//一直上電這段代碼很復雜,涉及到的知識點很多,我這里不展開說明,想要詳細了解的話請自行翻閱相關資料!我就簡單的說明一下這段代碼干了什么,首先是一個GPIO的復雜結構體,這個結構體負責STM32的引腳,代碼里開啟了13針腳,在原理圖中,13針腳可能就是選擇好要控制模塊的針腳。初始化STM32的針腳,同時設置模塊的一些工作參數,大概這就是一個模塊初始化要干的事情。
3. 代碼
分析完硬件之后,就要開始開發模塊,嵌入式開發一般用的C語言,而且涉及到很多宏定義、指針、位運算等C語言語法,要想熟練的開發模塊,對C語言要十分熟悉,雖然是嵌入式,涉及到很多硬件,同時開發中,對于代碼實現能力的要求也是有一定門檻的。我這里就簡單的提幾個在開發過程中嵌入式代碼的“特色”吧,僅僅是我個人學習過程中遇到的,并沒有什么系統理論,如有錯誤請以教科書為準。
3.1. 無限循環
一般來說,一個單片機,上電之后,我們希望它一直工作,除非斷電,所以體現在代碼中就是while(1)的無限循環。在main()函數里,前面部分就是各個模塊的初始化,一些變量的聲明等等,然后就是一個while(1),用來實現CPU一直工作。基本上一個模塊的主要功能就是在這個while(1)中執行,這就引出來設計模塊的一個思想:狀態。
因為是while(1),我們需要給模塊設計多個狀態,在不同的功能需求下,有不同的狀態用來與其對應,舉一個簡單的例子,假如模塊遇到了一些不可預料的錯誤,就可以把模塊的狀態切換為重啟狀態,然后從頭開始。在我接觸的STM32開發中,用狀態控制單個模塊的做法是十分好用的。
3.2. 延遲問題
因為是硬件,數據的處理是存在時間問題的,對于串口來說,一個明顯的參數就是波特率。CPU處理速度很快很快,但是一些模塊的反應速度可能遠遠慢于CPU,CPU發出命令后,模塊可能過了幾毫秒才給出回應,但是CPU速度很快,程序不能阻塞在這里等待它回應。這也是嵌入式開發過程中的一個設計點,不能讓單個模塊的代碼執行占用太長CPU,如果阻塞太長時間,會影響其他模塊的工作。最近剛好開始學操作系統,打一個不太恰當的比方,在操縱系統中,CPU也是一直在工作,同時操作系統用來負責CPU對于每一個任務的調度,根據調度算法,CPU可以根據硬件情況和用戶需求,來“智能”的處理好何時應該運行哪一部分的代碼。單片機也是一個小規模的操作系統,但是它沒有那么智能的算法,當然也可能是它的硬件也沒辦法讓它這么智能。這樣的話,在while(1)中,也就是按照代碼順序來執行模塊,每一個模塊占用多長時間CPU完全取決于模塊代碼的執行時間。所以說在設計中,單個模塊的代碼不能占用太長時間的CPU,這樣會影響其他模塊的運行。
4. 總結
寫著寫著發現自己思維變亂了,越寫越不知道要說什么,主要還是STM32中要考慮的因素太多了,很多東西我自己知道怎么回事,但是因為語言能力表達有限,寫出來可能有些云里霧里,還有很多概念也是有些一知半解,再加上本人做STM32的項目也不是很多,能力有限,本人是先上手項目,并沒有系統的學習過嵌入式開發,如有錯誤,希望大家能多多指點。其實最好還是買一塊STM32電路板自己上手玩一次,這是我個人認為學習STM32最快的方法。最后,本博客原創,轉載請注明,本博客所有資料均來自網絡,如有侵權請聯系我刪除!
總結
以上是生活随笔為你收集整理的STM32的学习记录--单个模块开发思路的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue 父传子_Vue.js教程Vue基
- 下一篇: ThinkPHP6项目基操(20.实战部