很多人都是喜欢在自己熟悉或者习惯了的环境生活,因为在这样的环境中对很多事情都有所了解,对于发生的事情也是可控的。你觉得你是这样的吗?对于这样的生活方式我觉得有好的方面也有不好的方面。好的就是在这样的环境相对来说生活得比较舒服,因为每天都不用对生活环境的变化而有过多的考虑,每天只需要过着跟作天一样的生活节奏。不好的方面就是在这样的生活环境生活久了就会对这个生活环境产生一定依赖,每天基本上都是一样的就很难发现新事物学会新方法。处理事情的思维方法一般是根据自己的生活环境和成长经历所培养的。长时间在一个环境所培养出来的思维方法必然有一定的局限性,处理事情也只能用自己现在认为是最好的方法去处理,这就是处理事情的局限性。那么处理同一件事情那种方法最好,这个就需要自己去接触不同的环境才能学到不一样的思维方法,学到更多好玩的事件。 STM32开发其实也是如此。在开始学习stm32的时候大部分的人应该都是从stm32的标准库开始学起。在没有接触到或者用过其他开发库的时候我不觉得stm32的标准库有什么不好,我从开始学习stm32的时候首先接触的是STM32的标准库,直接寄存器开发的方式在开始学STM32的时候教程里的老师就说纯寄存器的开发方式不适合STM32的程序开发,因为stm32的寄存器有上百甚至上千个,寄存器开发需要清楚寄存器的每一个寄存器位的功能是什么从而设定指定的寄存器值从而使能或者配置成你想要的功能。也就是说纯寄存器开发你要清楚上百甚至上千个寄存器的操作,当然你也可以查找相应的STM32数据手册,只是要花点时间而且。寄存器开发也是有好处的,那就是直接,简单,代码比较简洁。比如单总线的18B20温湿度传感器的总线换向,代码如下所示:
寄存器方式: - #define DS18B20_IO_IN() {GPIOB->CRL&=0XFFFFFFF0;GPIOB->CRL|=8<<0;}
- #define DS18B20_IO_OUT() {GPIOB->CRL&=0XFFFFFFF0;GPIOB->CRL|=3<<0;}
标准库方式: - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
这两种方式你喜欢哪种?寄存器虽然简单但是如果不清楚寄存器的情况是看不懂程序这样配置的目的是什么?所以还是回到标准库吧。
从学stm32后的两三年里无论是公司还是自己的相关项目使用的stm32芯片有STM32F0系列、STM32F103系列、STM32F4、STM32L等等这些芯片在stm的系列里相对来说都是比较旧的基本上都是使用标准库的方式进行开发。两三年时间都在使用标准库,没有特别设计需要也就没有去学其他的库进行开发,直到去年开始stm32系列芯片从常用的几个系列开始价格疯狂暴涨,stm32f103c8t6从原来的**块钱的价格暴涨到如今的100块以上。STM32F103RCT6从原来的10几块的价格暴涨到如今的200块以上。十倍百倍的暴涨率不得不找一些之前相对比较少用而且价格还算正常的芯片来用。
之前有一个项目做方案的时候选用的是stm32f103cbu6当时查的价格是十几块,等设计完原理图画好PCB发出去打样后采购测试元件时发现一两天的时间stm32f103cbu6的价格已经从10几块升到了50多块,一下子就想把发出去的PCB取消掉,只可惜已经取消不了,那只好找一款替代的芯片来使用,经过查找数据手册对比发现stm32f411cbu6和stm32f401cbu6芯片只有一个IO口跟stm32f103cbu6的IO口有点区别,而且stm32f411cbu6和stm32f401cbu6的价格当时是22块,价格差不多就选了更优秀的stm32f411cbu6。
写程序的时候发现标准库对于stm32f411好像并不是那么的适用。stm32f411的一些核心板的配套例程发现基本上都不是以标准库的方式写的,对于一个陌生的开发方式一开始肯定不想用,我只想用标准库。使用标准库经过一番测试后出现各种问题,最后都是没办法解决。好吧,看来自己的能力还是不够。标准库这种方式只能放弃,好好学习新的开发方式了。
这种不是标准库的开发方式会是什么。那就是HAL库。是STM32最新推出的抽象层嵌入式软件。对于HAL库有这样的描述:
HAL是Hardware Abstraction Layer的缩写,中文名:硬件抽象层。HAL库是ST为STM32最新推出的抽象层嵌入式软件,可以更好的确保跨STM32产品的最大可移植性。该库提供了一整套一致的中间件组件,如RTOS,USB,TCP / IP和图形等。
HAL库是基于一个非限制性的BSD许可协议(Berkeley Software Distribution)而发布的开源代码。 ST制作的中间件堆栈(USB主机和设备库,STemWin)带有允许轻松重用的许可模式, 只要是在ST公司的MCU 芯片上使用,库中的中间件(USB 主机/设备库,STemWin)协议栈即被允许随便修改,并可以反复使用。至于基于其它著名的开源解决方案商的中间件(FreeRTOS,FatFs,LwIP和PolarSSL)也都具有友好的用户许可条款。 对于HAL库和标准库的对比是这样描述的:
相比标准外设库,STM32Cube HAL库表现出更高的抽象整合水平,HAL API集中关注各外设的公共函数功能,这样便于定义一套通用的用户友好的API函数接口,从而可以轻松实现从一个STM32产品移植到另一个不同的STM32系列产品。HAL库是ST未来主推的库,ST新出的芯片已经没有STD库了,比如F7系列。目前,HAL库已经支持STM32全线产品。
通过文字描述可以知道HAL库的几个点:
- 最大可移植性。
- 提供了一整套一致的中间件组件,如RTOS,USB,TCP / IP和图形等。
- 通用的用户友好的API函数接口。
- ST新出的芯片已经没有标准库。
- HAL库已经支持STM32全线产品。
第一点,最大可移植性。对于标准库来说F1系列的标准库与f4和f0的标准库,虽然同样是标准库但是各自又有一定的区别要是想把f1上开发的程序移植到F4芯片上,工作相对来说比较繁琐,如果是从下往上的话,首先就是要把F1的标准库给替换掉然后就很多的报错,好了我也没这么干过。一般都是把功能模块给搬过去,所以说程序设计的模块化是很有必要的。HAL库的最大可移植性在于不管你是F1还是F4配置底层的函数都是一样的。 第二点,提供了一整套一致的中间件组件,如RTOS,USB,TCP / IP和图形。使用标准库的时候你是怎么移植RTOS,怎么使用USB的?使用标准库的时候无论是使用RTOS还是ucos这些第三方功能基本上都是需要自己下载相应的文件然后加入到项目中来,痛苦的是加到项目后编译不过而又不知道哪里有问题。UCOS HAL库是没有提供的,这里只是用作举例说明。USB虽然stm32芯片有这个功能但是标准库并没有这部分的支持也是需要移植很多的usb相关的很多文件才能使用。而HAL库已经把这些功能归纳在一起,使用也非常简单,只需要使用图像软件简单配置就可以正常使用。 第三点,通用的用户友好的API函数接口。API函数的命名比较合理,就是一看就知道这个API函数是干嘛用的。还有通用性也比较好。 第四点,这个很好理解。不管用什么库,都是STM32官方提供,新出的芯片已经没有标准库,也就是说st也许不再对标准库进行更新和维护。而更多的是在维护新的HAL库。新事物的出现必将取代旧事物。学习新出的HAL库确实是有必要的。 第五点就不用说了。
使用标准库创建一个项目模板的步骤:
- 新建一个基于 V3.5 版本固件库的 STM32F1 工程模板。步骤如下:
- 使用MDK创建一个空的项目。这部分跟8051创建项目基本上一样。
- 下载对应的芯片标准库包。
- 把芯片包里面的相关文件复制到项目中来。然后把相关文件添加到项目,某个项目模板下面的文件如下所示
文件多的时候就非常容易出错,少一个文件,少一个设置编译出的错会让你很难受。所以用标准库开发一般都会直接使用模板,但是对于一些功能的移植还是比较麻烦。标准库是从底层到应用的功能基本上都是需要自己去写。当你把底层弄好时已经花了不知多久了。
使用HAL库创建一个项目又是什么样的体验:使用HAL库前你需要下载STM32CubeMX这个软件,因为项目的创建不需要你自己去复制相应的文件,创建项目的操作基本上在这个软件上面进行。软件的安装和配置可以在网上找到很多的教程在这就不说了。下面就以基于HAL库的USB虚拟串口为例。
第一步,打开软件选择对应的芯片。
第二步,配置时钟。
时钟的配置按照自己使用的晶振进行设置。选择不同的芯片上面会有提示该芯片的最高频率。软件默认设置25M的外部时钟。
我用的是stm32f411芯片,软件显示时钟最高频为100M,我用的外部晶振是8M晶振,设置如下
USB的时钟固定为48M,需要选择打开了USB设备才能设置USB的时钟,只需要选择合适的分频达到48M即可。 第三步,配置自己要开启的功能。
第四步,然后设置项目导出的相关配置
设置项目名称、保存位置、编译环境等等。还有一个比较重要的就是保存位置和项目名称不能使用中文,否则导出的项目会出现问题。下面设置项目文件相关的设置比较重要。
第五步,设置完就可以导出项目。
导出的项目底层是已经配置好直接编译好下载到芯片就可以。
到此HAL库项目创建完成。使用这个软件创建项目一开始是有点麻烦,因为不熟悉,用多几次就好了。
对于项目创建来说使用HAL库可以节省很多底层配置部分的时间,对于项目开发的时间来说这也许更合理,可以把更多的时间用在关键的功能实现部分,而不是配置芯片底层功能。
|