在stm32教学光盘的A里,有两个开发指南,一个是库函数版本,一个是寄存器版本。那么问题来了,作为一个初学者,我应该用库函数好还是直接对寄存器操作比较好? 首先,两个都是C语言 从51过渡过来的话,就先说寄存器操作。每个MCU都有自己的寄存器,51是功能比较简单的一种,相应的寄存器也比较少,我们常用的就那么几个,像P0 P1 SMOD TMOD之类的,这些存在于标准头文件reg.h里面,因为少,所以大家就直接这么去操作了,每一位对应的意义随便翻一下手册就看得到,甚至做几个小项目就记的很清楚了。所以做51开发的时候大多数都是直接操作寄存器。 到了STM32,原理一样,也是有自己的寄存器,但是作为一款ARM内核的芯片,功能多了非常多,寄存器自然也就多了很多,STM32的手册有一千多页,这时候想去像51那样记住每个寄存器已经不现实了,所以ST的工程师就给大家提供了库函数这么一个东西。 这是个神器。 库函数里面把STM32的所有寄存器用结构体一一对应并且封装起来,而且提供了基本的配置函数。我们要去操作配置某个外设的时候不需要再去翻眼花缭乱的数据手册,直接找到库函数描述拿来就可以用,这样就能把精力放在逻辑代码的开发上,而不是去费力的研究一个芯片的外设要怎么配置寄存器才能驱动起来。 简单讲就是这些了,库函数是为了让开发者从大量繁琐的寄存器操作中脱离出来的一个文件包,在使用一个外设的时候让开发者直接去调用相应的驱动函数而不是自己去翻手册一个一个配置寄存器。 有人说用库函数掌握不到芯片的精髓,见仁见智了。熟悉一款芯片是在不断的开发使用中逐渐了解并掌握的,调试的过程中会遇到很多问题,会要求我们去跟踪相关寄存器的状态,在整个框架都已经建立起来的基础上再去对照手册做具体到寄存器每一位的分析,代码对照现象,很快就能积累起来经验。 学习stm32的路还很长,我必须静下心来,踏实钻研,相信努力一定会有回报! |
从未寄存器
当时用的是汇编语言编程,
你不懂寄存器根本用不了,
但是现在的STM32寄存器这么多,根本就记不住。而且F1系列的与F4系列的寄存器也有差异。
所以STM32是用标准库开始用的,
发展到现在用HAL库。
选项少了。
标准库函数还好,一级跳转后基本就对应寄存器了,HAL需要又加深了级数,找寄存器越来越这容易了。
ST的BlueNRG库,满满的函数指针结构体,跟踪跳转是做不到了。
这个是ST嵌入式软件相关页面,在页面的图片上点相应内容的局部超链接,可跳转到相应分类页面
http://www.st.com/en/embedded-so ... ria=productId=SC961
点评
添加HAL库吧,毕竟新出的器件只有这个库,而没有了标准函数库。
HAL (Hardware Abstraction Layer)
标准外设库( Standard Peripherals Library),习惯称为标准函数库
BlueNRG库这个没必要加,这个是主要是类似USB协议栈的,自成体系,不具有代表性
点评
"STM32的手册有一千多页,这时候想去像51那样记住每个寄存器已经不现实了" ——为什么要想记住每个寄存器。且不同片子的寄存器不完全一样,不是用熟了F103就直接能搬到F746上。自己都不会用到的片上设备,也就不用去管。像GPIO这样的简单设备(F0x, F4x, F7x通用,F1x例外),几个寄存器记住也不难。
难道用库函数就不用记?也得背得住库函数有什么,每个参数有啥吧。 当然用模板生成代码的有另外的套路,或者编辑器自动提示补全。
我自己不喜欢用库函数的原因是老要填一个结构,作为参数去配置硬件,虽然背后就是翻译成寄存器。我的意见是寄存器都是有默认值的,经常用默认值不动就可以了,但用库函数就得都写上每一项设成什么,不敢都写0啊。
用现成的代码?用模板生成的代码?寄存器的也一样可以呀 写过几个,后面拿来稍微改改就能用了。当然,用库函数的可能移植性好一点。