“健康守护者”——STM32标准库和HAL库的比较

“健康守护者”——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库更适合嵌入式开发有一些经验的人员,而标准库更适合刚接触嵌入式开发的新手,帮助他们多了解一些底层库实现和外设的应用。

你可能感兴趣的:(嵌入式,stm32,单片机)