基于标准库和HAL库的stm32编程

stm32编程方式之标准库与HAL库

  • 引言:
  • 一、简介
    • (1)stm32的三种开发方式
    • (2)库函数与HAL库对比
  • 二、实例程序
    • (1)实例程序对比
    • (2)分析
  • 三、总结
  • 参考文献

引言:

通常在入门STM32的时候,首先都要先选择一种要用的开发方式,不同的开发方式编程的架构是完全不一样的。一般大多数都会选用标准库和HAL库,而极少部分人会通过直接配置寄存器进行开发。网上关于标准库、HAL库的描述相信是数不胜数。可是一个对于很多刚入门的朋友还是没法很直观的去真正了解这些不同开发发方式彼此之间的区别,所以笔者想以一种非常直白的方式,用自己的理解去将这些东西表述出来,如果有描述的不对的地方或者是不同意见的也可以大家提出。

一、简介

(1)stm32的三种开发方式

  • 一、直接配置寄存器

学习过51的朋友可能会知道,会有一小部分人或是教程是通过汇编语言直接操作寄存器实现功能的,这种方法到了STM32就变得不太容易行得通了,因为STM32的寄存器数量是51单片机的十数倍,如此多的寄存器根本无法全部记忆,开发时需要经常的翻查芯片的数据手册,此时直接操作寄存器就变得非常的费力了。但还是会有很小一部分人,喜欢去直接操作寄存器,因为这样更接近原理,知其然也知其所以然。

  • 二、标准库

STM32有非常多的寄存器,而导致了开发困难,所以为此ST公司就为每款芯片都编写了一份库文件,也就是工程文件里stm32F1xx…之类的。在这些 .c .h文件中,包括一些常用量的宏定义,把一些外设也通过结构体变量封装起来,如GPIO口时钟等。所以我们只需要配置结构体变量成员就可以修改外设的配置寄存器,从而选择不同的功能。也是目前最多人使用的方式,也是学习STM32接触最多的一种开发方式。

  • 三、HAL库
  • HAL库是ST公司目前主力推的开发方式,全称就是Hardware Abstraction Layer(抽象印象层)。库如其名,很抽象,一眼看上去不太容易知道他的作用是什么。它的出现比标准库要晚,但其实和标准库一样,都是为了节省程序开发的时期,而且HAL库更有效,如果说标准库把实现功能需要配置的寄存器集成了,那么HAL库的一些函数甚至可以做到某些特定功能的集成。也就是说,同样的功能,标准库可能要用几句话,HAL库只需用一句话就够了。
  • HAL库也很好的解决了程序移植的问题,不同型号的stm32芯片它的标准库是不一样的,例如在F4上开发的程序移植到F3上是不能通用的,而使用HAL库,只要使用的是相通的外设,程序基本可以完全复制粘贴,注意是相通外设,意思也就是不能无中生有,例如F7比F3要多几个定时器,不能明明没有这个定时器却非要配置,但其实这种情况不多,绝大多数都可以直接复制粘贴。

(2)库函数与HAL库对比

  • 库函数配置好串口以后,当串口接收到数据再发送给上位机时需要循环发送,但是HAL库就直接调用HAL_UART_Transmit函数就能直接将串口的数据发给上位机。
  • 库函数的串口通信函数只适用于STM32F1系列,对于其他系列的就不能通用了;但是对于HAL库来说,只要外设相同,基本上能够很容易的移植。

二、实例程序

(1)实例程序对比

  • 基于固件库:
int main(void)
{	
  /*初始化USART 配置模式为 115200 8-N-1,中断接收*/
  USART_Config();
	
	/* 发送一个字符串 */
	Usart_SendString( DEBUG_USARTx,"这是一个串口中断接收回显实验\n");
	
  while(1)
	{	
		
	}	
}
void Usart_SendString( USART_TypeDef * pUSARTx, char *str)
{
	unsigned int k=0;
  do 
  {
      Usart_SendByte( pUSARTx, *(str + k) );
      k++;
  } while(*(str + k)!='\0');
  
  /* 等待发送完成 */
  while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET)
  {}
}
  • 基于HAL库:
int main(void)
{
  HAL_Init();        
  /* 配置系统时钟为72 MHz */ 
  SystemClock_Config();
	   
  /*初始化USART 配置模式为 115200 8-N-1,中断接收*/
  DEBUG_USART_Config();
  
	/*调用printf函数,因为重定向了fputc,printf的内容会输出到串口*/
	printf("欢迎使用野火开发板\n");	

	/*自定义函数方式*/
	Usart_SendString( (uint8_t *)"自定义函数输出:这是一个串口中断接收回显实验\n" );
	
  while(1)
	{		
	}
}
void Usart_SendString(uint8_t *str)
{
	unsigned int k=0;
  do 
  {
      HAL_UART_Transmit(&UartHandle,(uint8_t *)(str + k) ,1,1000);
      k++;
  } while(*(str + k)!='\0');
  
}

(2)分析

  • 可以发现在对串口函数的处理时,固件库编程方式的代码量更大,HAL的代码量更小,使用HAL更加简洁。

三、总结

  • 通过对HAL库和标准库函数函数方式的对比,观察了基于两种方式编程风格的不同,HAL库是一种更加简洁,精简的库,可移植性更好。

参考文献

[1]HAL库、标准库、寄存器三种方式的开发区别
[2]stm32标准库与HAL库比较
[3]stm32固件库详解

你可能感兴趣的:(嵌入式开发,stm32)