基于标准库函数与基于HAL库函数的stm32编程方式
文章目录
- 基于标准库函数与基于HAL库函数的stm32编程方式
- 一、基于标准库
- 1. 介绍
- 2. 库函数的STM32串口程序编写
- 二、基于HAL库
- 1.介绍
- 2.HAL库STM32串口程序编写
- 三、差异
- 四、 stduino IDE的试玩
基于标准库函数与基于HAL库函数的stm32编程方式
一、基于标准库
1. 介绍
STM32有非常多的寄存器,而导致了开发困难,所以为此ST公司就为每款芯片都编写了一份库文件,也就是工程文件里stm32F1xx…之类的。在这些 .c .h文件中,包括一些常用量的宏定义,把一些外设也通过结构体变量封装起来,如GPIO口时钟等。所以我们只需要配置结构体变量成员就可以修改外设的配置寄存器,从而选择不同的功能。也是目前最多人使用的方式,也是学习STM32接触最多的一种开发方式。
由于寄存器开发难度很大,因此ST公司就专门编写了芯片的库函数(固件库),将一些常用量的宏定义和一些外设也通过结构体变量封装起来,如GPIO口时钟等。所以我们只需要配置结构体变量成员就可以修改外设的配置寄存器,从而选择不同的功能。
标准外设库(Standard Peripherals Library)是对STM32芯片的一个完整的封装,包括所有标准器件外设的器件驱动器。这应该是目前使用最多的ST库,几乎全部使用C语言实现。但是,标准外设库也是针对某一系列芯片而言的,没有可移植性。
2. 库函数的STM32串口程序编写
int main(void){ u16 t; u16 len; u16 times=0;delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级uart_init(115200); //串口初始化为115200LED_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;}else{times++;if(times%5000==0){printf("\r\n精英STM32开发板 串口实验\r\n");printf("正点原子@ALIENTEK\r\n\r\n");}if(times%200==0)printf("请输入数据,以回车键结束\r\n"); if(times%30==0){LED0=!LED0; LED1=!LED1;}//闪烁LED,提示系统正在运行.delay_ms(10); }} }
二、基于HAL库
1.介绍
HAL库是ST公司目前主力推的开发方式,全称就是Hardware Abstraction Layer(抽象印象层)。库如其名,很抽象,一眼看上去不太容易知道他的作用是什么。它的出现比标准库要晚,但其实和标准库一样,都是为了节省程序开发的时期,而且HAL库更有效,如果说标准库把实现功能需要配置的寄存器集成了,那么HAL库的一些函数甚至可以做到某些特定功能的集成。也就是说,同样的功能,标准库可能要用几句话,HAL库只需用一句话就够了。
HAL库也很好的解决了程序移植的问题,不同型号的stm32芯片它的标准库是不一样的,例如在F4上开发的程序移植到F3上是不能通用的,而使用HAL库,只要使用的是相通的外设,程序基本可以完全复制粘贴,注意是相通外设,意思也就是不能无中生有,例如F7比F3要多几个定时器,不能明明没有这个定时器却非要配置,但其实这种情况不多,绝大多数都可以直接复制粘贴。
2.HAL库STM32串口程序编写
int main(void)
{u8 len; u16 times=0;HAL_Init(); //初始化HAL库 Stm32_Clock_Init(RCC_PLL_MUL9); //设置时钟,72Mdelay_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;}else{times++;if(times%5000==0){printf("\r\nALIENTEK 精英STM32开发板 串口实验\r\n");printf("正点原子@ALIENTEK\r\n\r\n\r\n");}if(times%200==0)printf("请输入数据,以回车键结束\r\n"); if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行.delay_ms(10); } }
}
三、差异
库函数配置好串口以后,当串口接收到数据再发送给上位机时需要循环发送,但是HAL库就直接调用HAL_UART_Transmit函数就能直接将串口的数据发给上位机。库函数的串口通信函数只适用于STM32F1系列,对于其他系列的就不能通用了;但是对于HAL库来说,只要外设相同,基本上能够很容易的移植。
延伸:标准外设库(Standard Peripherals Library)是对STM32芯片的一个完整的封装,包括所有标准器件外设的器件驱动器。这应该是目前使用最多的ST库,几乎全部使用C语言实现。但是,标准外设库也是针对某一系列芯片而言的,没有可移植性。
HAL库与新增的LL库,都是ST公司提供的新标准库,包含在ST为新的标准库注册了一个新商标:STMCube™当中。LL库和HAL库两者相互独立,只不过LL库更底层。而且,部分HAL库会调用LL库(例如:USB驱动)。同样,LL库也会调用HAL库。
可以说HAL库就是用来取代之前的标准外设库的。
四、 stduino IDE的试玩
“Stduino IDE 是一款面向 32 位 ARM 单片机快速入门学习的集成开发平台,目前已经支
持 Arduino_Core_STM32 框架(Arduino 式开发),集聚快捷、高效、免费、开源、易得于一身,软件还集成了 GDB 调试功能。另外后续开发的外设扩展库将采用开源共享的理念进行分发,一处分享全球共用,极大保障后续软件维护的动力支撑。”
它的优势:
- GDB 调试
- 封装库下载安装
- 代码自动补全提示
- 中英文模式
- UTF-8\GBK 编码格式
- 代码快速格式化
- SWD\串口程序
- 下载&调试等
与Ardunio IDE类似, stduino IDE的代码编写都一样,只是在下载程序和一些、工具选项位置有些差异。
基于标准库函数与基于HAL库函数的stm32编程方式相关推荐
- 基于标准库函数与基于HAL库函数的stm32编程方式对比
基于标准库函数与基于HAL库函数的stm32编程方式对比 一.标准库函数 二.HAL库函数 三.差异 四.stdunio IDE试玩 参考资料 一.标准库函数 1.标准库的解释 标准外设库(Stand ...
- 1、新建基于标准固件库MDK5工程模板(STM32F103ZET6)
新建基于标准固件库MDK5工程模板 1.STM32官方库文件夹介绍 如上图,是ST官方提供的STM32标准固件库的文件包结构: STM32官方固件库下载地址: "https://www.st ...
- 总结基于寄存器与基于固件库stm32编程的差异
基于寄存器与基于固件库stm32编程方式有什么差异 总的来说是专业层面或者说是应用层面的区别 总的来说是专业层面或者说是应用层面的区别 从应用角度讲,寄存器相对来说是属于更底层的,类似于驱动层,而固件 ...
- Ardunio和HAL库函数的stm32编程
Ardunio的STM32串口通信 一.安装Ardunio IDE和相关支持库 1.Ardunio是什么 2.安装及配置过程 二.STM32板的串口通信程序 1.代码 2.烧录 三.基于标准库函数与H ...
- 为什么您应该使用基于标准的开发实践
为什么您应该使用基于标准的开发实践 Why you should use standards-based development practices (even if you don't have t ...
- 技术宝典 | 基于标准 WebRTC 低延迟直播的开源实践
导读:2020年,新冠疫情爆发并席卷全球,对包括中国在内的全球经济造成了巨大的冲击,同时深刻影响了社会生活.在这一背景下,以消费市场上轰轰烈烈的直播电商为引爆点,直播行业再次掀起热潮.在中国企业数字化 ...
- stm32单片机屏幕一直闪_STM32使用HAL库函数点亮OLED
OLED屏幕应用十分广泛,我们可以使用STM32单片机对其进行控制,使其显示我们需要的各种数字.字母.汉字.图画等.我们此次使用下图这款非常普遍的0.96寸OLED液晶屏.此款OLED屏采用IIC的通 ...
- php 上传sb2,基于标准的http来实现Android多文件上传
实现多文件的上传,基于标准的http来实现. 多文件上传MyUploader类的实现: /** * * 同步上传多个文件 * 基于标准的http实现,需要在非UI线程中调用,以免阻塞UI. * */ ...
- STM32F103VE基于标准库下DHT11数据串口打印输出
STM32F103VE基于标准库下DHT11数据串口打印输出
最新文章
- 哈夫曼编码(Huffman)Java实现代码简化版
- python 内置函数 sum()函数 求和函数
- iOS之深入解析内存管理散列表SideTables和弱引用表weak_table的底层原理
- 注解_自定义注解_元注解
- MySQL - 视图
- 2020蓝桥杯省赛---java---B---7(单词分析)
- 由炮灰模型到“微软钻石题”
- eigrp hello报文格式
- java学习日记(1-7)
- 浮点数转换成字符串函数
- miui11精简_MIUI11评测:真的是缺乏创新吗?
- M2Det论文解读和开源代码
- 《软件项目管理》课程知识总结
- 站班汇报 水印 加相册插件
- 解决 Chrome 浏览器跨域加载本地文件的问题
- 手机比较版本差异工具
- Windows下cmd命令—systeminfo
- 面试常用mysql语句_50个常用的笔试、面试sql语句
- 最优化:一维搜索的Wolfe条件与Goldstein条件
- 使用LEADTOOLS文档比较工具比较文档和图像