1啥也别说,先上来就是gpio
什么叫做gpio?这个东西就是那个开发板上的io口,
就是那个一排一排的排针
她有好多的功能
他是单片机与外部设备的最重要的沟通媒介
用来把信息传进来,用哪个函数?
用这个GPIO_ReadInputDataBit
怎么用?
定义一个变量a
a =GPIO_ReadInputDataBit (GPIOB, GPIO_Pin_7);
随便找个gpio,比如GPIOB,之后使用他的7引脚,
如果外部给这个7引脚的是高电平,一般是3.3左右,那么a的值就是1
为啥是1,不是别的?是因为之前还要对GPIO进行初始化,这个跟默认电平有关系
也就是说,要对GPIO这个寄存器在使用前,进行一些配置,
接下来我们看她最开始应该怎么配置
GPIO是stm32的一个外设,在这个单片机中,无论你使用哪个外设,用哪个硬件,都要开启对应的时钟,时钟相当于每一个外设的动力源,这个配置时钟的过程,在对于寄存器方面的编程上,就是对对应的寄存器一个特定的位置写1(或者其他什么值),用库函数或者是hal库的话,就方便很多。
时钟通过APB2外设总线连到GPIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
那么,在哪里去找这个APB2总线所连接到其他外设呢?
看看在函数名前那三个字
RCC
这个就是时钟跟相关的几乎所有东西都在rcc.h和rcc.c里面,以后要用到什么外设,就去那里找就可以了。
她的位置就在xx_rcc.h的文件的最下端,很多个外设都跟这几个总线连起来,也就是所谓的挂载,所以,当你想要初始化任何外设的时候,都要首先找时钟和总线,就去rcc.h这个文件里面即可。
那么这个函数RCC_APB2PeriphClockCmd()怎么使用呢,在keil里面,双击这个函数名之后右键,选择Go to definition
之后就会进入到一个界面
这个就是函数的定义的地方,在他的上面,能看到好多的解释和参数,这里你能够看到被逗号分隔的许多参数,这些参数直接可以复制之后粘贴到函数的参数位置,也能够看到对应总线挂载的各种外设,如果APB1没有,那不妨就去APB2外设看看。
有的时候,右键的时候,会出现“报错”,其中一个原因就是没有编译,点一下这个按钮
就可以了,但是有的时候还是不行,那么就可以去看看
在这里,把对勾打上,估计就可以了,
然而有的时候还是不行,有一次我的文件夹好像设置了管理员权限,这个时候我试着复制一个工程,把他放在一个其他的地方,就欧克了。可以正常运行。
我们接下来把参数配置好
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE)
第二个参数就是使能这个外设,当然,DISABLE就是失能,就是停止使用这个外设。
接下来就使用结构体配置GPIO的一些初始值
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
这里面的第一行,是结构体,对于这个问题,我目前不做具体的说明(1),为了让初学者比较容易理解,这里做一个比喻:
GPIO_InitTypeDef这个东西跟“类型名”差不多,
GPIO_InitStruct这个东西,跟变量“差不多”,
为了方便配置参数,可以是我们又定义了一个新的变量,这个变量里面还有变量,之后就是对这些具体的变量进行配置
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;这个是推挽输出,是有驱动能力的模式
这个点“ .”非常像micropython的语法,这里有一点面向对象编程的味道,但我认为,毕竟C语言是个面向过程的语言,这种感觉,也仅仅就是一直”味道“罢了,不得不说,面向对象编程,适合快速开发大规模的软件或者工程,简洁性和易用性是非常强的。这又引起了我的一个新的想法,如何让stm32的编程更简单快捷一点呢,这个问题我们放在后面说。