HAL库函数的stm32编程方式的差异

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库一些,而且要易于于开发

上一篇:基于语音控制的智能衣柜系统之应用层——单片机的功能实现


下一篇:verilong 串口通信程序及原理