野火STM32学习笔记
互~凉~网的广大观众朋友们大家好,本up猪在C站(CSDN俗称粪坑)的ID叫飞天大司马,鉴于C站虽然阅读量大,但是本人反馈无法及时,因此在B站同步更新创作内容,欢迎各位新老粉丝前来批评指正一起学习。
头文件和C文件的创建
编写这个函数,我们首先建立一个叫“stm32f10x_gpio.c”的C文件,和一个“stm32f10x_gpio.h”C语言头文件。如图

导入工程列表
再回到工程界面,双击Source Group 1文件夹添加“stm32f10x_gpio.c”随后要将头文件导入进来,头文件导入方法我会单独出一个小专栏让大家了解一下。导入成功文件目录会出现下面的界面,如图。

头文件编写
接下来我们开始编写函数的头文件,在STM32当中每一个头文件的框架都是这样的,如图

#ifndef空格两个双下划线头文件大写把所有点改成下划线
#define空格两个双下划线头文件大写把所有点改成下划线
头文件程序
#endif
至于为什么要这么写,本up猪才疏学浅,不知道深层次的原因,只能从字面意思上翻译:如果没有定义此头文件,我就定义这个头文件······结束,作用是为了避免头文件里的的内容被重新定义。如果有了解更具体的同学,大牛,欢迎在评论区留言。不明白也没有关系,只要知道是这样用就行了。
我们在编写置位复位函数的时候,还是要用到之前的寄存器定义函数的头文件的,因为置位复位本质上也是对寄存器操作要用到“stm32f10x.h”里的寄存器定义,所以要把“stm32f10x.h”这个头文件包含进来。

进入函数的C文件
头文件配置完成,我们要进入C文件开始写程序了,程序开头同样要导入stm32f10x.h。如图

此时我如果按下编译键,会出现一个问题,error:#256 invalid redeclaration of type name “ ···”。这就是因为在上节课的头文件stm32f10x.h开头和结尾没有写那样的框架“#ifndef·········#endif”,导致的头文件重定义错误。什么是头文件重定义错误,这个是C语言的知识,可以在其他资料里面查找,这里不再赘述,改正方法如下图。


前面的都是准备工作,到这里我们才开始正式编写函数。首先,定义这个函数的名字,给他取名GPIO_SetBits,这个函数有两个形式参数,为什么呢?我来举个栗子,就比如我要操作PB0这个端口,那我要告诉别人操作GPIOB这个寄存器,而且是GPIOB的Pin0。因此函数内的第一个形式参数是GPIO_TypeDef * GPIOx这样一个指针,当这个x为B时,就对应GPIOB这个寄存器的地址。第二个参数针对的是IO口,每个GPIO端口有16个IO,因此这个参数可以设定为uint16_t GPIO_Pin。将来这个参数怎么传,下面会告诉大家先不要急。
置位的时候我们就不操作端口ODR寄存器了,而是操作BSSR端口置位清除寄存器,而且我们只用他的低16位,我把技术手册关于这个寄存器的功能截下来如图

因此我在这个函数里面操作BSSR寄存器输入GPIOx->就会出现如下图所示的界面,我们可以选择要用的寄存器,那么光标移动到BSSR上点击回车都可以选择。由于BSSR寄存器都是置1有效,因此我们要对寄存器的某一位置1,如果直接用二进制或者16进制位进行|=运算的话,程序会显得过于冗杂,于是ST公司给每一个IO口做了一个宏定义。代码如下图,看起来很可怕,其实原理很简单,而且对后面的操作寄存器位非常有帮助。

还有一个细节要注意一下,一会我们要进入主函数测试刚才写的程序,我们要把这个程序在头文件里定义一下,才能被主函数方便调用

主函数的操作(测试)
现在看回主函数这两行代码我们把它们删掉,如图

改用我们刚写的函数,第一个参数改成GPIOB,第二个参数改成GPIO_Pin_0如图所示,

由于ODR寄存器默认置0,所以在GPIO_SetBits之前的代码操作下灯是亮着的,将它置位之后,我们可以看到灯灭了。
同理可得,复位的函数,也是两个参数,只不过作用是置0的。大家依葫芦画瓢看看能不能写出来,发在评论区。我会精选正确答案。
————————————————
版权声明:本文为CSDN博主「飞天大司马」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。