库函数和寄存器的区别

库函数和寄存器的区别,第1张

单片机编程时,都会碰到寄存器or库函数编程的选择问题,“寄存器”需要对芯片手册有足够的了解,程序代码量较少、执行效率较高;“库函数”则无需对芯片有较深认识,只需了解对应“库函数”的“含义”及“使用方法”,就可以对单片机进行编程 *** 作;

不乏网络上的大神,可以兼顾“寄存器”和“库函数”,达到“信手拈来”的地步;对初学者而言,可能会力有不逮;笔者在“初学51单片机”后,感到“51”实在性能有限,但不得不说,能够把“51单片机”玩转的人简直是“神人”,私下一对比,本人即放弃了这条“成神之路”;

之后在正想学习下ARM系列单片机时,由于机缘巧合,接触到“STM32系列单片机”时,已经有“库函数”出来了,因此直接跳过了“AVR”、“MSP430”直接跨到了“STM32系列单片机”;

在学习“51单片机”时,其为“8bit单片机”,且“寄存器数目很少”,将“对应的头文件”(.h文件)看完,耗时也不会超过“1小时”;而对“stm32”而言,其为“32bit单片机”,即使是“单个外设”所涉及到的“寄存器数目”就已经很吓人;本人当时选择了“库函数”,曾经写的第一段代码为:

/*

********************************************************************************

** 函数名称 : void GPIO_Configuration(void)

** 函数功能 : GPIO配置函数,启动PA、PB所有时钟,及复用时钟;

** 输 入: 无

** 输 出: 无

** 返 回: 无

** 注意事项 : 无

** 完成进度 : 已完成,2012-09-16

********************************************************************************

*/

void GPIO_Configuration(void)

{

GPIO_InitTypeDef GPIO_InitStructure

RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE )

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 |GPIO_Pin_2 |GPIO_Pin_3 |GPIO_Pin_12

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP// 推挽输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz// 最高输出速率50MHz

GPIO_Init(GPIOA, &GPIO_InitStructure)// 选择A端口

}

简单配置后,就可以通过“GPIO_SetBits()”或“GPIO_ResetBits()”函数实现“高低电平的控制”;如上代码所示,代码中不涉及具体的“寄存器”,只使用了“库函数”;但“库函数”的底层“仍旧为寄存器”,只是“大神”将“复杂的寄存器”进行了封装,演变成了“库函数”;

但需注意:“库函数”可极大提高代码的复用性,但其与“底层寄存器”仍有“千丝万缕的关联”;因此,不能只为方便,彻底舍弃“寄存器方式”;需根据具体情况,适时选用“合适的编程方式”进行“代码编写”;譬如对常规“GPIO *** 作”主要有3种:“置高”、“置低”、“取反”,对“STM32F103”而言,写法举例如下:

#definePC1_H GPIO_SetBits(GPIOC, GPIO_Pin_1) // PC1 高电平

#definePC1_L GPIO_ResetBits(GPIOC, GPIO_Pin_1) // PC1低电平

#define GPIO_ReversedGPIO_WriteBit(GPIOB, GPIO_Pin_5,(BitAction)(1 - (GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_5))))

注意:“取反”借助库函数“GPIO_WriteBit()”配合“GPIO_ReadOutputDataBit()读取函数”、“(BitAction)枚举强制转换”3者共同实现;同时,对“取反”而言,也可使用“自主编写取反函数,使用if判断实现”,但推荐使用“宏定义方式”实现,其能有效提高代码的“可读性”、“可维护性”;

最后,需明确无论是“寄存器”或是“库函数”,其本质仍是“编程工具”,“编程”的核心是“数据结构+算法”,即“编程思路”;因此,切忌舍本逐末,变成“为编程而编程”;

本人设计单片机有10多年的经验了,从stm32出来到现在也一直在用,我还是认为用寄存器版本比较好,比较灵活,有好多人说直接用库函数方便,方便是方便,当你搞大型程序的时候就知道了,问题一大堆你找都不知道去哪里找,因为你不懂库函数里面的东西,库函数不是你写的。有好多配置库函数是没有给修改入口的。什么adc的缓冲呀!等等。所以建议你还是用寄存器版本为好


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7867527.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-10
下一篇 2023-04-10

发表评论

登录后才能评论

评论列表(0条)

保存