HAL库函数的stm32编程方式的差异
HAL库简介
1.HAL库是ST公司目前主力推的开发方式,全称就是Hardware Abstraction Layer(抽象印象层)。它的出现比标准库要晚,但其实和标准库一样,都是为了节省程序开发的时期,而且HAL库尤其的有效,如果说标准库把实现功能需要配置的寄存器集成了,那么HAL库的一些函数甚至可以做到某些特定功能的集成。也就是说,同样的功能,标准库可能要用几句话,HAL库只需用一句话就够了。并且HAL库也很好的解决了程序移植的问题,不同型号的stm32芯片它的标准库是不一样的,例如在F4上开发的程序移植到F3上是不能通用的,而使用HAL库,只要使用的是相通的外设,程序基本可以完全复制粘贴,注意是相通外设,意思也就是不能无中生有,例如F7比F3要多几个定时器,不能明明没有这个定时器却非要配置,但其实这种情况不多,绝大多数都可以直接复制粘贴。是而且使用ST公司研发的STMcube软件,可以通过图形化的配置功能,直接生成整个使用HAL库的工程文件,可以说是方便至极,但是方便的同时也造成了它执行效率的低下,在各种论坛帖子真的是被吐槽的数不胜数。~
2.HAL库和lib库的区别和联系
(1)联系
@1.HAL库和lib库都是一套API软件接口,通过不同的API接口实现相同的用户功能,本质上都是ST公司为了用户高效开发而做出的一套软件
(2)区别
@1.HAL库相对来说兼容性更强,可以在不同的ST平台下只需要修改最底层的硬件配置就可以实现在不同平台的移植。而lib库兼容性就没有那么强,F1和F4平台的差异化比较大,兼容性不是很强
@2.HAL库和STM32CubeMux图形化裁剪工具软件强强联手,通过STM32CubeMux软件可以配置裁剪后自动生成HAL库形式的软件包,对底层相对不是很熟悉的用户也可以实现快速化的开发,有点更高级一点语言的分层开发,驱动层和应用层剥离开
@3.第三方组件的配置,比如USB驱动库,Freertos,FATS,Lwip等第三方的配置更加方便,更加兼容,lib库开发的一些需要用户移植的第三方库在HAL库的开发过程中可以完全省略掉。
@4.软件执行效率上来看,lib库的软件执行效率,代码的精简性更胜一筹,而HAL库的API接口更加丰富,执行效率上来看差lib库一些
@5.未来的发展来看:HAL库会逐步替代lib库,所以掌握HAL库的整体架构是非常有必要的,包括
整个以HAL库为基础的软件开发流程,HAL库整体软件架构。使用者如何将这个HAL库能整体全局把握+底层外设驱动结合+逻辑层的分层实现+第三方库使用和移植?以上这几个点全部掌握才能做出稳定的产品,也能提高工程师自身的专业技能
一. 比较标准库与HAL库性能差异
博主在此用到了串口通信的例子给大家说明,以下例子基于野火的例程
HAL库
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;
}
}
标准库
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;
}
}
我们很容易观察到,这两者有区别,HAL库的集成度要高一些,如
标准库
for(t=0;t<len;t++)
{
USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发送数据
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
}
HAL库
HAL_UART_Transmit(&UART1_Handler,(uint8_t*)USART_RX_BUF,len,1000); //发送接收到的数据
所以软件执行效率上来看,lib库的软件执行效率,代码的精简性更胜一筹,而HAL库的API接口更加丰富,执行效率上来看差lib库一些,而且要易于于开发