“健康守護者”——STM32標準庫和HAL庫的比較
- 串口通信
- 標準庫初始化串口
- HAL庫初始化串口
- 區別
- 總結
使用STM32芯片的時候呢,大家可能都喜歡用庫,什么標準庫啦,HAL庫啦,拿到了就一股腦的用,也沒有深究其區別,這樣出BUG的時候就只能兩手一攤,程式癱瘓了,所以今天咱們來看看標準庫和HAL庫有啥區別,各個庫它的優點在哪里,
串口通信
標準庫初始化串口
void uart_init(u32 bound)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1時鐘
//串口1對應引腳復用映射
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9復用為USART1
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10復用為USART1
//USART1埠配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9與GPIOA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//復用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽復用輸出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA9,PA10
//USART1 初始化設定
USART_InitStructure.USART_BaudRate = bound;//波特率設定
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長為8位資料格式
USART_InitStructure.USART_StopBits = USART_StopBits_1;//一個停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//無奇偶校驗位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無硬體資料流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收發模式
USART_Init(USART1, &USART_InitStructure); //初始化串口1
USART_Cmd(USART1, ENABLE); //使能串口1
}
HAL庫初始化串口
void MX_USART1_UART_Init(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = 9600;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler();
}
}
區別
標準庫的UART和USART的初始化的核心代碼是一樣的(USART和UART的區別在于USART在UART異步通信的基礎上增加了同步通信的功能,而同步通信在通信網路中使用的比較多),普通的設備中,異步通信即可滿足需求,所以USART的用法和UART基本差不多,
回到標準庫和HAL庫的對比,在標準庫中,初始化函式內部先對GPIO進行了初始化,然后再對串口的停止位,引腳等進行配置,好處就是每個增加的部分都是互相獨立得,代碼可拓展性更強一些,壞處就是邏輯結構不是很明確,
在HAL庫中直接對串口進行了配置,并且在串口初始化錯誤的時候會死回圈這對于嵌入式開發來說是很重要的,因為芯片不同于作業系統,芯片不能把每個錯誤都以人類看得懂的方式顯示出來哦~所以死回圈可以在Debug的時候幫助我們快速定位問題,但是在HAL庫中在哪里初始化串口GPIO口的配置?仔細一看,原來HAL庫里面有SystemClock_Config();對各個部分所需要的時鐘線都進行了配置并且做了封裝,使得代碼的邏輯性更加好了,但是如果要新增加模塊,就很有可能出現問題,
總結
以串口通信的初始化為例可以看出,HAL庫對于代碼的封裝性做的更好,管理得也是十分到位,但是如果對于HAL庫內部結構不熟悉的話又貿然增加新的模塊可能會有莫名的BUG出現哦,但是如果搭配CubeMX這款軟體,HAL庫的使用又變的很簡單了呢,標準庫的話各個結構分立比較明確,增加代碼的難度比HAL庫略低一點,綜合以上考慮,本人覺得HAL庫更適合嵌入式開發有一些經驗的人員,而標準庫更適合剛接觸嵌入式開發的新手,幫助他們多了解一些底層庫實作和外設的應用,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/35858.html
標籤:其他
