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庫更加強大。