初始化函数,结构体的定义。一直用,不过还真不知道是个结构体呢,所以对结构体这个用法不熟练呢,近期学习正点原子的视频了解到了。
h就是头文件函数库,结构就是:
#ifndef __LED_H__
#define __LED_H__//如果没有定义,下面就定义一下,有的话就不进行下面的定义了。
#endif
其中LED可以根据需要定义,其他三个英文一起,就是防止多次定义。这个我只在头文件用到了,不过应该也可以在函数里面用到。
引申有个#if 0 #endif,跟#if 1 #endif,“#if” 后面的0 表示到“#endif”位置 里面所有的函数不会被运行(这里的函数可以代替/* */,注释掉里面函数。);“#if” 后面的1 表示到“#endif”位置里面的函数会被运行(这里的函数就相当于把/* */去掉,恢复正常函数。)。这里我比较喜欢用,毕竟如果我们需要注释掉的函数不运行的时候,直接改成0,那样可以继续编写其他函数,如果需要在用到的话,就改成1就好了。
如果使用“//”的话就不能收起来,查看的时候中间会隔很多行。
如果使用“/* */”的话,虽然可以收起来,但是如果后面设计过程,需要用到来测试的话,可能会出现意外,行少的话还知道另一半在那里,但是如果超过屏幕显示,而且很多行的话,也为了以后作为参考不便于删掉,就可能找不到,容易出现错误。
所以用#if #endif的话很方便,使用的时候变成1,而且如果是测试函数的话也知道,编写的时候可以弄一些参考函数在里面,以后如果要用的话可以直接知道是那些。
对于跑马灯的实验设置中的亮灭用到的下面函数,根据外面电路来确定使用哪个函数来点亮灯。
GPIO_SetBits(GPIOx,GPIO_Pin_x)//这个是输出高电平,如果led灯接到地的话,可以使用这个来电亮。
GPIO_ResetBits(GPIOx,GPIO_Pin_x)//这个是输出低电平,如果led灯接到电源的话,可以使用这个来电亮。
这个在运行时候可以设置管脚高低电平,并用万用表来检查输出是0还是3.3v,来确认单片机的外围电路是否正常,之前我遇到过使用这两个函数,测量单片机管脚,结果电压没变化,而且查找电路也没有问题,后来才发现设计电路的时候用到了PB4端口。这就提到了PB3、PB4、PA15、PA13和PA14这几个管脚的问题了,它们默认不是I/O口,我们如果要用到的话,需要重映射一下。这里我查了一下是三种模式:
①GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//这种重映射情况就是把PB3、PB4、PA15这三个引脚用作普通GPIO,而把PA13和PA14这两个引脚用作SWD的调试功能。
②GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);//这种重映射情况是把这五个引脚全部用作普通GPIO,因此将不能再用JTAG/SWD仿真器进行调试,但可以使用ST-LINK。
③GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST,ENABLE);//这种重映射情况下仅仅把PB4这一个引脚作为普通GPIO,JTAG/SWD可以正常使用,但是JTAG没有复位功能。
我只用到了第二项,毕竟我设计的使用会用到SWD的调试功能的,所以PA13和PA14是重来没作为I/O使用的。
而且可以使用 GPIO_SetBits(GPIOx,GPIO_Pin_x)跟GPIO_ResetBits(GPIOx,GPIO_Pin_x)来确认是否变成I/O口,能否控制高低电平来确认函数是否正确。
至于寄存器版本,我觉得了解一下就好,我也不怎么用,所以也就不描叙出来了,而且学起来还真记不太住呢。
补:基本上都是我结合以前研发时候遇到的一些问题,加上学习到自己了解的。如果出错的话,应该是我后面在学到新知识以后再回来修改吧
标签:学习,函数,引脚,用到,STM32,的话,endif,GPIO,库函数 From: https://blog.csdn.net/esmember/article/details/144736034