STM32的HAL庫(kù)分析及使用
STM32的三種開(kāi)發(fā)方式
通常新手在入門STM32的時(shí)候,首先都要先選擇一種要用的開(kāi)發(fā)方式,不同的開(kāi)發(fā)方式會(huì)導(dǎo)致你編程的架構(gòu)是完全不一樣的。一般大多數(shù)都會(huì)選用標(biāo)準(zhǔn)庫(kù)和HAL庫(kù),而極少部分人會(huì)通過(guò)直接配置寄存器進(jìn)行開(kāi)發(fā)。網(wǎng)上關(guān)于標(biāo)準(zhǔn)庫(kù)、HAL庫(kù)的描述相信是數(shù)不勝數(shù)??墒且粋€(gè)對(duì)于很多剛?cè)腴T的朋友還是沒(méi)法很直觀的去真正了解這些不同開(kāi)發(fā)發(fā)方式彼此之間的區(qū)別,所以筆者想以一種非常直白的方式,用自己的理解去將這些東西表述出來(lái),如果有描述的不對(duì)的地方或者是不同意見(jiàn)的也可以大家提出。1、直接配置寄存器
不少先學(xué)了51的朋友可能會(huì)知道,會(huì)有一小部分人或是教程是通過(guò)匯編語(yǔ)言直接操作寄存器實(shí)現(xiàn)功能的,這種方法到了STM32就變得不太容易行得通了,因?yàn)镾TM32的寄存器數(shù)量是51單片機(jī)的十?dāng)?shù)倍,如此多的寄存器根本無(wú)法全部記憶,開(kāi)發(fā)時(shí)需要經(jīng)常的翻查芯片的數(shù)據(jù)手冊(cè),此時(shí)直接操作寄存器就變得非常的費(fèi)力了。但還是會(huì)有很小一部分人,喜歡去直接操作寄存器,因?yàn)檫@樣更接近原理,知其然也知其所以然。2、標(biāo)準(zhǔn)庫(kù)
上面也提到了,STM32有非常多的寄存器,而導(dǎo)致了開(kāi)發(fā)困難,所以為此ST公司就為每款芯片都編寫(xiě)了一份庫(kù)文件,也就是工程文件里stm32F1xx…之類的。在這些 .c .h文件中,包括一些常用量的宏定義,把一些外設(shè)也通過(guò)結(jié)構(gòu)體變量封裝起來(lái),如GPIO口時(shí)鐘等。所以我們只需要配置結(jié)構(gòu)體變量成員就可以修改外設(shè)的配置寄存器,從而選擇不同的功能。也是目前最多人使用的方式,也是學(xué)習(xí)STM32接觸最多的一種開(kāi)發(fā)方式,我也就不多闡述了。3、HAL庫(kù)
HAL庫(kù)是ST公司目前主力推的開(kāi)發(fā)方式,全稱就是Hardware Abstraction Layer(抽象印象層)。庫(kù)如其名,很抽象,一眼看上去不太容易知道他的作用是什么。它的出現(xiàn)比標(biāo)準(zhǔn)庫(kù)要晚,但其實(shí)和標(biāo)準(zhǔn)庫(kù)一樣,都是為了節(jié)省程序開(kāi)發(fā)的時(shí)期,而且HAL庫(kù)尤其的有效,如果說(shuō)標(biāo)準(zhǔn)庫(kù)把實(shí)現(xiàn)功能需要配置的寄存器集成了,那么HAL庫(kù)的一些函數(shù)甚至可以做到某些特定功能的集成。也就是說(shuō),同樣的功能,標(biāo)準(zhǔn)庫(kù)可能要用幾句話,HAL庫(kù)只需用一句話就夠了。并且HAL庫(kù)也很好的解決了程序移植的問(wèn)題,不同型號(hào)的stm32芯片它的標(biāo)準(zhǔn)庫(kù)是不一樣的,例如在F4上開(kāi)發(fā)的程序移植到F3上是不能通用的,而使用HAL庫(kù),只要使用的是相通的外設(shè),程序基本可以完全復(fù)制粘貼,注意是相通外設(shè),意思也就是不能無(wú)中生有,例如F7比F3要多幾個(gè)定時(shí)器,不能明明沒(méi)有這個(gè)定時(shí)器卻非要配置,但其實(shí)這種情況不多,絕大多數(shù)都可以直接復(fù)制粘貼。是而且使用ST公司研發(fā)的STMcube軟件,可以通過(guò)圖形化的配置功能,直接生成整個(gè)使用HAL庫(kù)的工程文件,可以說(shuō)是方便至極,但是方便的同時(shí)也造成了它執(zhí)行效率的低下,在各種論壇帖子真的是被吐槽的數(shù)不勝數(shù)。HAL庫(kù)固件庫(kù)安裝與 用戶手冊(cè)
1、首先設(shè)置讓Cube可以自動(dòng)聯(lián)網(wǎng)下載相關(guān)固件庫(kù)選擇updater Settings
??設(shè)置如下:2、根據(jù)芯片選擇所需固件
版本是向下兼容的,可以直接選擇最新版。但如果覺(jué)得最新版太大,可以閱讀下面的Main Changes.能夠支持你目前的芯片就好。??選好了,點(diǎn)擊Install Now就行,過(guò)程可能有點(diǎn)長(zhǎng)。建議直接官網(wǎng)下載到本地,再安裝文件會(huì)被下載到如下位置,建議更改此目錄,不要選在C盤?。?!3、尋找用戶幫助手冊(cè)
進(jìn)入固件所在文件夾,里面包含很多內(nèi)容。比如說(shuō) 官方提供的開(kāi)發(fā)板程序,每個(gè)型號(hào)下面都有對(duì)應(yīng)功能的實(shí)現(xiàn),用戶手冊(cè)就在Drivers文件夾下面。
STM32 HAL庫(kù)與標(biāo)準(zhǔn)庫(kù)的區(qū)別
1、句柄
句柄(handle),有多種意義,其中第一種是指程序設(shè)計(jì),第二種是指Windows編程?,F(xiàn)在大部分都是指程序設(shè)計(jì)/程序開(kāi)發(fā)這類。- 第一種解釋:句柄是一種特殊的智能指針 。當(dāng)一個(gè)應(yīng)用程序要引用其他系統(tǒng)(如數(shù)據(jù)庫(kù)、操作系統(tǒng))所管理的內(nèi)存塊或?qū)ο髸r(shí),就要使用句柄。
- 第二種解釋:整個(gè)Windows編程的基礎(chǔ)。一個(gè)句柄是指使用的一個(gè)唯一的整數(shù)值,即一個(gè)4字節(jié)(64位程序中為8字節(jié))長(zhǎng)的數(shù)值,來(lái)標(biāo)識(shí)應(yīng)用程序中的不同對(duì)象和同類中的不同的實(shí)例,諸如,一個(gè)窗口,按鈕,圖標(biāo),滾動(dòng)條,輸出設(shè)備,控件或者文件等。應(yīng)用程序能夠通過(guò)句柄訪問(wèn)相應(yīng)的對(duì)象的信息,但是句柄不是指針,程序不能利用句柄來(lái)直接閱讀文件中的信息。如果句柄不在I/O文件中,它是毫無(wú)用處的。句柄是Windows用來(lái)標(biāo)志應(yīng)用程序中建立的或是使用的唯一整數(shù),Windows大量使用了句柄來(lái)標(biāo)識(shí)對(duì)象。
USART_InitTypeDef?USART_InitStructure;
USART_InitStructure.USART_BaudRate?=?bound;//串口波特率
USART_InitStructure.USART_WordLength?=?USART_WordLength_8b;//字長(zhǎng)為8位數(shù)據(jù)格式
USART_InitStructure.USART_StopBits?=?USART_StopBits_1;//一個(gè)停止位
USART_InitStructure.USART_Parity?=?USART_Parity_No;//無(wú)奇偶校驗(yàn)位
USART_InitStructure.USART_HardwareFlowControl?=?USART_HardwareFlowControl_None;//無(wú)硬件數(shù)據(jù)流控制
USART_InitStructure.USART_Mode?=?USART_Mode_Rx?|?USART_Mode_Tx;?//收發(fā)模式
USART_Init(USART3,? 




