1. 前言
STM32目前市面上使用比較廣泛,資料多,接下來就介紹如何快速入門STM32,進(jìn)行基礎(chǔ)開發(fā)。
這篇文章是STM32F103系列文章的第一篇,主要介紹開發(fā)環(huán)境的搭建、編程思路、如何查看原理圖、配置時(shí)鐘,配置GPIO口模式等等。
下面文字是來至STM32中文手冊(cè),對(duì)STM32系列做了詳細(xì)的介紹:
STM32是一個(gè)微控制器產(chǎn)品系列的總稱,目前這個(gè)系列中已經(jīng)包含了多個(gè)子系列,分別是: STM32小容量產(chǎn)品、 STM32中容量產(chǎn)品、 STM32大容量產(chǎn)品和STM32互聯(lián)型產(chǎn)品;按照功能上的劃分,又可分為STM32F101xx、 STM32F102xx和STM32F103xx系列;
● 小容量產(chǎn)品是指閃存存儲(chǔ)器容量在16K至32K字節(jié)之間的STM32F101xx、 STM32F102xx和STM32F103xx微控制器。
● 中容量產(chǎn)品是指閃存存儲(chǔ)器容量在64K至128K字節(jié)之間的STM32F101xx、 STM32F102xx和STM32F103xx微控制器。
● 大容量產(chǎn)品是指閃存存儲(chǔ)器容量在256K至512K字節(jié)之間的STM32F101xx和STM32F103xx微控制器。
● 互聯(lián)型產(chǎn)品是STM32F105xx和STM32F107xx微控制器。
整體來說,STM32F10x系列里所有型號(hào)芯片大多數(shù)功能模塊都是相同,主要是區(qū)別還是:引腳數(shù)量不一樣,F(xiàn)LASH閃存、RAM空間大小不一樣,還有就是功能模塊的數(shù)量不一樣。 配置高的芯片,引腳多,功能模塊多。
配置低的型號(hào),引腳自然就少,功能模塊就少。 但是只要有這個(gè)功能模塊,所有型號(hào)的代碼都是一樣的編寫方式。所以,STM32F10x系列里所有型號(hào)代碼都是通用的。
目前STM32開發(fā)方式主要由3種:寄存器、標(biāo)準(zhǔn)庫(kù)、HAL 庫(kù)。 其中HAL 庫(kù)是目前意法半導(dǎo)體主推的開發(fā)方式,有 STM32CubeMx軟件加持,可以一鍵生成keil工程,圖形化編程非常方便,資源網(wǎng)上也有很多。
當(dāng)前這個(gè)系列文章的STM32開發(fā)主要是選擇寄存器方式開發(fā),寄存器開發(fā)優(yōu)點(diǎn)是: 代碼較少、整體比較精簡(jiǎn),運(yùn)行效率較高。但是學(xué)習(xí)成本、入門成本、調(diào)試難度比HAL 庫(kù)要難一些,因?yàn)槭褂眉拇嫫鏖_發(fā),需要不斷的看芯片手冊(cè),了解寄存器每個(gè)位的詳細(xì)功能,需要對(duì)芯片寄存器非常熟悉。但是寄存器開發(fā)相對(duì)比較通用,所有的芯片都支持寄存器開發(fā),了解寄存器開發(fā)之后,對(duì)優(yōu)化庫(kù)函數(shù)、HAL庫(kù)的效率、對(duì)其他芯片編程、入門Linux驅(qū)動(dòng)開發(fā)、了解硬件等都有一定的幫助。
2. 開發(fā)前準(zhǔn)備
入門STM32開發(fā),首先需要準(zhǔn)備一塊開發(fā)板,拿到開發(fā)板的原理圖、下載STM32的中文參考手冊(cè),下載一個(gè)串口下載軟件、準(zhǔn)備一臺(tái)windows電腦安裝keil5軟件。
開發(fā)板淘寶很多,推薦買:搭載STM32F103ZET6芯片的板子,可以買系統(tǒng)板也可以買開發(fā)板,系統(tǒng)板的板載資源少,引腳都引出來的,可以自己買模塊擴(kuò)展;開發(fā)板板載資源較多,引腳基本也是引出來的,板子的價(jià)格比較貴,購(gòu)買可以參考正點(diǎn)原子、野火等一些廠家的板子。 一般購(gòu)買板子之后,都有配套的資料包:原理圖、手冊(cè)都有了。
STM32支持st-link、jlink、串口等多種下載方式,其中成本比較低的就是串口下載,不需要購(gòu)買額外的硬件,生成hex文件之后,通過串口下載到開發(fā)板運(yùn)行,如果hex文件較大,下載速度比較慢。如果資金允許,購(gòu)買st-link、jlink下載更加快,調(diào)試更加方便。
keil軟件最新版可以在這里下載:http://www.myir-tech.com/download.asp?nclassid=108&anclassid=71
下載后,根據(jù)提示,一直點(diǎn)擊next即可。軟件安裝在英文目錄下,防止出現(xiàn)一些不必要的麻煩。
3. 點(diǎn)亮LED燈
準(zhǔn)備工作就緒之后,下面就入門STM32,點(diǎn)亮LED燈。
拿到開發(fā)板先看一下LED原理圖,找到LED的硬件接線位置。
關(guān)于keil軟件如何新建STM32工程的文章之前是寫過的,詳細(xì)步驟看這里: https://blog.csdn.net/xiaolong1126626497/article/details/119879328
點(diǎn)亮LED燈,需要控制STM32的GPIO口輸出指定的電平,STM32GPIO口編程步驟分為:
- 開時(shí)鐘
- 配置GPIO口模式
- 控制GPIO口輸出
中文參考手冊(cè)里的第6章和第8章分別介紹了時(shí)鐘寄存器和GPIO口配置寄存器,主要看這兩章節(jié)即可。
GPIO口模式配置寄存器有兩個(gè):CRL和CRH,一個(gè)IO口由4個(gè)二進(jìn)制位表示,STM32是32位的MCU,一個(gè)寄存器是32位,GPIO口分為GPIOA,GPIOB,GPIOC等很多組,每一組的GPIO口的數(shù)量是16個(gè)。所以要配置一組GPIO口的模式需要64個(gè)二進(jìn)制位,所以就分成了兩個(gè)寄存器來表示。 CRL配置07的GPIO口,CRH就配置815的IO口。
如果GPIO口作為普通的輸出,一般配置位置推挽輸出,如果作為按鍵這種輸入檢測(cè)硬件,一般配置為上下拉輸入。如果需要使用GPIO口內(nèi)置的功能輸出,就配置為復(fù)用功能推挽輸出。
配置LED燈對(duì)應(yīng)的GPIO口示例代碼:
/*
函數(shù)功能: LED初始化
硬件連接: PB6 PB7 PB8 PB9
特性: 低電平點(diǎn)亮
*/
void LED_Init(void)
{
//開時(shí)鐘
RCC->APB2ENR|=1<<3;
//配置GPIO口
GPIOB->CRL&=0x00FFFFFF;
GPIOB->CRL|=0x22000000;
GPIOB->CRH&=0xFFFFFF00;
GPIOB->CRH|=0x00000022;
//上拉
GPIOB->ODR|=1<<6;
GPIOB->ODR|=1<<7;
GPIOB->ODR|=1<<8;
GPIOB->ODR|=1<<9;
}