1. 程式人生 > 其它 >HAL庫與標準庫的理解

HAL庫與標準庫的理解

技術標籤:stm32

HAL庫的學習

HAL庫和標準庫的原理區別

HAL簡介:
== HAL庫 ==是st公司為了更方便地進行stm32之間的移植而開發的庫,通用性很強,在不同的兩款stm32晶片之間的移植基本上不需要修改。之前使用的標準庫都是基於暫存器的操作。暫存器版本使用較麻煩,每個設定都要去檢視晶片datasheet,好處是可以讓你熟悉晶片的暫存器配置。庫函式是基於暫存器版本進行二次封裝後推出的,它的優勢就是暫存器版本的劣勢,方便了使用,不再需要手動去配置暫存器,使用更方便了。但是它的劣勢就是HAL的優勢,就是每次修改MCU功能,都需要手動去修改功能,而且自己修改也不能保證正確性,程式程式碼在不同MCU之間的移植性不強。

== HAL庫 ==,HAL是Hardware Abstraction Layer的縮寫,中文名稱是:硬體抽象層,HAL庫工程一般使用Cube軟體來生成工程。HAL庫是ST公司為STM32的MCU最新推出的抽象層嵌入式軟體,更方便的實現跨STM32產品的最大可移植性。優勢就是不需要開發工程師再關注所用MCU型號,只需要專注所以要的功能軟體開發工作。而且是未來主推的方向,正在不斷的推出更新。HAL庫推出的同時,也加入了很多第三方的中介軟體,有RTOS,USB,TCP / IP和圖形等等。和標準庫對比起來,STM32的HAL庫更加的抽象,ST最終的目的是要實現在STM32系列MCU之間無縫移植,甚至在其他MCU也能實現快速移植。

區別:
HAL 庫相對標準庫更加複雜更加繁瑣,但是HAL庫能夠適應不同的st晶片的應用,所以應用能力更加廣泛,但是是直接和硬體聯絡的,所以比起標準庫來說,更難上手。


串列埠通訊實驗包含的檔案區別

標準庫:
在這裡插入圖片描述
HAL:
在這裡插入圖片描述


具體程式碼區別

主函式:
標準庫:

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
 int main(void)
 {		
 	u16 t;  
	u16 len;
u16 times=0; delay_init(); //延時函式初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設定NVIC中斷分組2:2位搶佔優先順序,2位響應優先順序 uart_init(115200); //串列埠初始化為115200 LED_Init(); //LED埠初始化 KEY_Init(); //初始化與按鍵連線的硬體介面 while(1) { if(USART_RX_STA&0x8000) { len=USART_RX_STA&0x3fff;//得到此次接收到的資料長度 printf("\r\n您傳送的訊息為:\r\n\r\n"); for(t=0;t<len;t++) { USART_SendData(USART1, USART_RX_BUF[t]);//向串列埠1傳送資料 while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待發送結束 } printf("\r\n\r\n");//插入換行 USART_RX_STA=0; }else { times++; if(times%5000==0) { printf("\r\n精英STM32開發板 串列埠實驗\r\n"); printf("正點原子@ALIENTEK\r\n\r\n"); } if(times%200==0)printf("請輸入資料,以回車鍵結束\n"); if(times%30==0)LED0=!LED0;//閃爍LED,提示系統正在執行. delay_ms(10); } } }

HAL庫:

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"

int main(void)
{
	u8 len;	
	u16 times=0;
	
    HAL_Init();                    	 	//初始化HAL庫    
    Stm32_Clock_Init(RCC_PLL_MUL9);   	//設定時鐘,72M
	delay_init(72);               		//初始化延時函式
	uart_init(115200);					//初始化串列埠
	LED_Init();							//初始化LED	
	KEY_Init();							//初始化按鍵
	
    while(1)
    {
			
       if(USART_RX_STA&0x8000)
		{					   
			len=USART_RX_STA&0x3fff;//得到此次接收到的資料長度
			printf("\r\n您傳送的訊息為:\r\n");
			HAL_UART_Transmit(&UART1_Handler,(uint8_t*)USART_RX_BUF,len,1000);	//傳送接收到的資料
			while(__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_TC)!=SET);		//等待發送結束
			printf("\r\n\r\n");//插入換行
			USART_RX_STA=0;
		}else
		{
			times++;
			if(times%5000==0)
			{
				printf("\r\nALIENTEK 精英STM32開發板 串列埠實驗\r\n");
				printf("正點原子@ALIENTEK\r\n\r\n\r\n");
			}
			if(times%200==0)printf("請輸入資料,以回車鍵結束\r\n");  
			if(times%30==0)LED0=!LED0;//閃爍LED,提示系統正在執行.
			delay_ms(10);   
		} 
    }
}

總結

HAL庫相對標準庫來說,同樣的串列埠通訊實驗需要更多的檔案包含,HAL庫更加繁瑣複雜,但是相對標準庫來說,HAL庫的移植性更加強,能夠適應更多不同種類的硬體,所以能夠一個工程多個硬體使用,所以就能力上,HAL庫更加強大。