stm32下标准库函数与HAL库函数编程方式的差异
标准库函数
由于寄存器开发难度很大,因此ST公司就专门编写了芯片的库函数(固件库),将一些常用量的宏定义和一些外设也通过结构体变量封装起来,如GPIO口时钟等。所以我们只需要配置结构体变量成员就可以修改外设的配置寄存器,从而选择不同的功能。
标准外设库(Standard Peripherals Library)是对STM32芯片的一个完整的封装,包括所有标准器件外设的器件驱动器。这应该是目前使用最多的ST库,几乎全部使用C语言实现。但是,标准外设库也是针对某一系列芯片而言的,没有可移植性
HAL库函数
HAL(Hardware Abstraction Layer)是硬件的抽象层,它表现出更高的抽象整合水平,HAL API集中关注各外设的公共函数功能,这样便于定义一套通用的对用户友好的API函数接口,从而可以轻松实现从一个STM32产品移植到另一个不同的STM32系列产品。下图是HAL库的整体框架。
HAL库是ST未来主推的库,从前年开始ST新出的芯片已经没有STD库了,比如F7系列。现在,ST主推HAL库,目前,HAL库已经支持STM32全线产品。总的来说,HAL库相对于库函数层次架构更加清晰,更加抽象。
标准库函数与HAL库函数代码对比
标准库函数:
char stop[]={'S','t','o','p',',','s','t','m','3','2'};
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(a)
{
if(USART_RX_STA&0x8000)
{
len=USART_RX_STA&0x3fff;//µÃµ½´Ë´Î½ÓÊÕµ½µÄÊý¾Ý³¤¶È
printf("\r\nhello windows!:\r\n\r\n");
for(t=0;t<len&&USART_RX_BUF[t]==stop[t];a++,t++)
{if (a>=10) {a=0;break;}}
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库函数:
HAL_Init();
Stm32_Clock_Init(RCC_PLL_MUL9);
delay_init(72);
uart_init(115200);
LED_Init();
KEY_Init();
while(1)
{
if(USART_RX_STA&0x8000)
{
led=USART_RX_STA&03fff;
HAL_UART_Transmit(&UART1_Handler,(uint8_t*)USART_RX_BUF,led,1000);
while(_HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_TC)!=SET);
printf("\r\n\r\n");
USART_RX_STA=0;
}
else
}
总结
通过比较STM32库函数和HAL库的开发方式,库函数和HAL库其实本质上都是将STM32的底层的寄存器进行封装并向用户提供友好的接口,这都极大的降低了用户的开发门槛。但是相对于库函数来说,HAL库更加“通用”,能够较好的移植到其他的芯片上去,但也正是这样,导致其代码比较庞大、执行效率比较低的结果。总的来说,HAL库相对于库函数更加友好,能够让用户将精力放在开发的产品上。
MCU集成开发平台 stduino IDE
该平台网址为 http://www.stduino.com/pindex.php
是一款面向32位处理器快速入门学习的集成开发平台
它的好处是免费、高效、开源等,操作界面简洁,易上手。