1.
为什么?
由于在使用ST的固件库发现1是不能看到最底层的固件库代码,在开发的过程中不管怎么管控和严格测试也不能消除软件的所有bug,所以在ST提供的固件库中也可能存在未知的bug;2是使用库函数的时候效率低下,占用FLASH 较多,
虽然STM32现在有FLASH 512K的了,可毕竟ARM 的资源还是有限,就象上次我公司为DELL开发的一款产品使用的芯片(freescale的)FLASH为256K,到最后完成所有功能时只剩下不到1K的FLASH了,可以想像这个产品如果升级的话将会面临巨大的挑战。
所以,鉴于这两个问题有必要舍弃STM32的现有固件库,虽然做这个工作需要大量的精力和时间,我想如果是大的公司或者想做高质量的产品的公司为自己的产品从新设计一个高效的库文件是很有必要的。
2.
库文件的实现
现以GPIO部分为例来从新建立固件库。
1.
为什么?
由于在使用ST的固件库发现1是不能看到最底层的固件库代码,在开发的过程中不管怎么管控和严格测试也不能消除软件的所有bug,所以在ST提供的固件库中也可能存在未知的bug;2是使用库函数的时候效率低下,占用FLASH 较多,
虽然STM32现在有FLASH 512K的了,可毕竟ARM 的资源还是有限,就象上次我公司为DELL开发的一款产品使用的芯片(freescale的)FLASH为256K,到最后完成所有功能时只剩下不到1K的FLASH了,可以想像这个产品如果升级的话将会面临巨大的挑战。
所以,鉴于这两个问题有必要舍弃STM32的现有固件库,虽然做这个工作需要大量的精力和时间,我想如果是大的公司或者想做高质量的产品的公司为自己的产品从新设计一个高效的库文件是很有必要的。
2.
库文件的实现
现以GPIO部分为例来从新建立固件库。
//****帖子限制字数,见2贴
然后把各个GPIO的map对应到具体的芯片地址,比如GPIOA就是:
#define
GPIOA
(*(volatile struct GPIO
*)GPIOA_BASE)
/* GPIOA
Address*/
其中:GPIOA_BASE 是(APB2PERIPH_BASE + 0x0800)
3.
如何使用自己的库
在使用自己的库时可以直接使用数据结构的数据,比如在使用GPIOA的PA0
时:
GPIOA.CRL.BIT.MODE0 = 0x01;
// 输出模式,最大速度10MHz
GPIOA.CRL.BIT.CNF0 = 0x00;
// 通用推挽输出模式
GPIOA.BSRR.DWOED = 0x01;
也可以在再义一个io文件 比如GPIOA PA0时输出控制LED的则:
#define mTurnOnLed()
GPIOA.BSRR.BIT.BR0
=1
#define mTurnOffLed()
GPIOA.BSRR.BIT.BS0
=1
1.
总结:
通过这样编写的自己库文件很法方便使用并不比ST提供的库文件难,相反很多地方操作更简单,特别在一个口里面既有输出又有输入,各个IO配置各不相同的情况下优势比ST的固件库更简单了。
比如 :GPIOAA.CRL.DWORD =((MODE_OUTPUT_2M| CNF_Out_OD<<2)<<3*4)
|((MODE_INPUT|CNF_IN_FLOATING<<2)<<1*4)|((MODE_OUTPUT_2M| CNF_Out_OD<<2)) // PA3和PA0设置为推挽输出,PA1设置为输入
由于我也还只接触STM32才只有2天,所以我对STM32的基本知识还理解的不够清楚,写出来的东西错误在所难免,我只是把我的想法写出来而已,欢迎大家批评指点。谢谢
|