HAL库和标准库
--标准库(搜索:STM32标准库点灯)
标准库就是将寄存器封装好,移植性没有HAL好。
--把寄存器封装成函数
--HAL库
HAL库就是封装的比较猛,移植性比较强
HAL_GPIO_WRITE(GPIOB,GPIO_PIN_0,1)
--把库函数上再封装一层
a) STD库-标准外设库
寄存器操作,将一些基本的寄存器操作封装成函数
b) HAL库-硬件抽象库
将这些抽象成了一个抽象层,从使用的角度来看,是与硬件无关的
c) HAL库优势
HAL库是ST未来主推的库,从2015开始ST新出的芯片已经没有STD库
HAL库的处理机制比STD库好很多,HAL库支持STM32全线产品
HAL库跨芯片的可移植性非常好
d) HAL库与STD库区别
HAL库就是封装的比较猛,移植性比较强,标准库就是将寄存器封装好,移植性没有HAL好。
HAL库可以用ST的软件CUBE生成初始化工程。3.HAL库最方便的就是可以用CUBEMX自动生成代码,动态的调用资源,不会出现地城配置上的冲突。
其实就是两种库的区别,Hal库更加全面一点,目前STM32官方也在主推Hal库,目前STMcubemx软件可以直接生成HAL库代码,非常方便编程,易移植。
HAL库是ST近年来推出的新库,可以直接在CubeMX下生成例程,并且各个不同型号的STM32之间的函数差异也减少了。
HAL库是现在ST主推的库,标准库现在已经不更新了。HAL库做了更深的封装,可以很方便的移植在F0/F1/F3/F4/F7的各个系列的芯片上。
hal库通用型强,但是效率稍微低一点,标准库效率高。
本质上是一样的,就是配置寄存器,只是HAL库将应用层与驱动层分的比较明确。
HAL库设计进一步降低了API对硬件的依赖性,它借鉴了OS中驱动程序的思路,使得API的通用性更强。 能使用ST的CubeMX图形化界面来生成软件框架,它和CubeMX生成的软件代码完全兼容。减少了程序员的负担,同时代码也更规范。 至于与原库函数之间的使用差异, 关键还是要掌握内核及外设的工作原理,如果熟悉了硬件的工作原理,这些库函数还是很好用的。
HAL库似乎是为初学者而制定,但这也许是STM32的未来所在。
HAL和STD库最大的区别是移植性上的区别,HAL相当于在标准库上在加以封装了。增强了移植性,STD库是在寄存器的基础上封装了一次。 hal库封装的更想arduino,移植性强,相对效率就低一些,在时间就是金钱的现在,hal库无疑是很好的选择。
HAL库和标准库都是对寄存器操作的封装,但是这些库的函数不同在HAL库每个.c文件的开头会介绍这个库里面包含哪些函数,这些函数的用途,可以留意一下。
标准库是STM32最早推出的库,应用非常广泛,但是比较新的F7和H7等系列已经不支持了。
HAL库是官方主推的库,目前支持所有系列,相对效率没有标准库高,但是各个系列之间的兼容性很好,而且能够配合STM32CubeMX进行使用。由于官方现在不在更新和支持标准库了,所有精力都放在了HAL库和LL库上了,所以建议今后学习和应用还是以HAL库和LL库为主要对象。
hal库和标准库的最大区别就是减少了不同系列器件之间的库函数层差异,并且可以直接用cubemx生成。
HAL移植性比较强,可以通过cubemx生成代码,不过效率比较低标准库更像寄存器的操作,感觉更符合对寄存器使用的理解。
HAL库移植性比较好,操作比较简单。标准库移植性没那么方便,操作比较复杂,直接对寄存器的操作。
HAL库的封装比较多,大部分都是面向对象的设计,移植比较简单。
HAL的优点就是用API的设计,十分方便移植,而且操作也简单。
HAL的移植性是最好的,但是标准库不太方便移植,所以ST出了一个HAL库
GPIO输出功能(点亮LED)
HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
功能:写输出数据(高低电平 )
参数:GPIOx 填使用的GPIO组(GPIOB) GPIO_Pin 使用了哪个引脚(GPIO_PIN_0)
PinState 输出数据(高低1 或者0 GPIO_PIN_RESET 0 GPIO_PIN_SET 1
HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
功能:IO口输出状态翻转
参数:GPIOx 填使用的GPIO组(GPIOB) GPIO_Pin 使用了哪个引脚(GPIO_PIN_0)
HAL_Delay()//延时函数参数填延时时间,毫秒级延时
任务:使用 cubemax生成程序,使用翻转函数实现2个 LED灯闪烁
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
//结构体声明
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOB_CLK_ENABLE();
//使能GPIOB时钟
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
//输出高电平
/*Configure GPIO pin : PtPin */
GPIO_InitStruct.Pin = LED_Pin;//配置使用的GPIO引脚
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;//推挽输出
GPIO_InitStruct.Pull = GPIO_NOPULL;//上下拉不配置
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;//输出速度
HAL_GPIO_Init(LED_GPIO_Port, &GPIO_InitStruct);
//初始化参数写入
}
方法一:
while (1)
{ HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,0);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,0);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,1);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,1);
HAL_Delay(500);
}
方法二:
while (1)
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0);
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);
HAL_Delay(500);
}