stm32f103用库函数的方法实现流水灯的实验

在MDK529软件中使用库函数的方法实现流水灯的实验
要解决的问题是【实现流水灯功能,即LED0和LED1的交替亮灭】
我使用的软件是MDK529,,在创建工程的时候,我选择的是stm32f103ZE这个芯片,可能也有选其他芯片的,区别就是芯片对应的电路引脚图不同,也就是gpio口可能会不同,不过道理和方法都还是一样的。
这个是使用GPIO口来实现的,下面是LED0和LED1的引脚图。
stm32f103用库函数的方法实现流水灯的实验_第1张图片

这里没有使用按键控制,只是单纯的让led0和led1交替亮和灭,从图中可以看到led0接PB5,Led1接PE5,所以在实验中就只用到了PB5和PE5。那么我们就只PB5和PE5进行相应的设置就可以了。PB5和PE5是GPIO口中的管脚,要进行设置,首先要开启GPIOB和GPIOE相对应的时钟,然后再进行初始化设置就可以了。其实我了解的函数一般使用的时候都要开启时钟和进行初始化设置的。就像开车一样,要先拿钥匙将车启动,然后再选择是前进,还是倒车,还是开车灯,还是按喇叭等等要使用的功能。当GPIOB和GPIOE都可以正常使用了,我们就对gpiob5和gpioe5的值进行赋值,可以看到灯是一个发光二极管,灯的正极接了vdd,所以灯的负极(也就是gpio口)接低电位时,也就是等于0时,灯就会亮,不然就灭。所以gpiob5=0时,led0就亮了;gpioe5=0时,led1就亮。如果gpio的值是1的话,灯就是灭的。因此就是让gpiob5和gpioe5一个等于0,一个等于1就可以了,然后交替进行。不过在这个过程中他们交替亮和灭的速度不能太快,对于一个状态要有一个延时,当灯亮和灭的频率太快时,人的眼睛分辨不出来,看上去灯就是一直在亮(就像家里的白炽灯一样)。因此要用一个延时函数,让灯的暗的状态保持一段时间。
这里我只选择了2个灯,如果要用多个灯进行流水,只要让其中一个灯亮,其他都灭就可以,也就是让其中一个gpio口的值是0,其他都是1就可以了。(不过我觉得好像就见过两个灯)
下面说一下如何找库函数,一般函数的定义处在.h文件和.c文件中都是有的,而且在.c中还有对函数内容的编写,在.h中还是没有的,不过在.h中有大量的函数名称方便我们寻找。这个就像是在图书馆里面,你直接去找一本书可能会很难(这个书就类似于.c文件中的函数),不过你有一本特别的书,这个书记载了其他的书所在的位置(什么书在哪一个书架,第几层,第几本),这本特别的书就类似于我们的.h文件。(个人理解)
这个实验用到的函数少,开启gpio口时钟的函数在rcc.h中,gpio的初始化以及gpio口的置1(SET)和置0(RESET)都在gpio.h中。
下面我们打开gpio.h文件。双击红色方框中的内容
stm32f103用库函数的方法实现流水灯的实验_第2张图片

拖动到快到最下方时我们看到了一大堆的函数
stm32f103用库函数的方法实现流水灯的实验_第3张图片

在351,357,358行我们看到了要用到的函数,我们选中这个函数,在GPIO_Init上轻轻点两下就可以,注意不要选中void,也不要多余地选中括号以及括号里面的内容,不然在go to definition时候会报错的。我们选中点右键,选go to definition并点击跑到他的定义处。
stm32f103用库函数的方法实现流水灯的实验_第4张图片

下面我们就到了函数的定义处
stm32f103用库函数的方法实现流水灯的实验_第5张图片

在黄色方框中的内容是对我们函数的介绍,就像@param后面的就是对函数中的参数的可能取值的介绍,黄色框下面的就是函数的定义处,以及函数里面的内容。红色方框里的内容我们可以看到都是is什么的,选中这些中的一个,然后go to definition我们就可以看到我们可以选择的参数处了,利用这样的方式就可以进行所有参数的设置,我们就选一下选择gpio工作模式的地方,也就是上图第二个红色方框
stm32f103用库函数的方法实现流水灯的实验_第6张图片

可以看到红色框中的内容就是我们可以选择的模式,gpio可能的工作模式一共有8种,在这里我们选out_PP的模式,我们把我们需要的函数复制走就可以了,不要随意更改库函数中的内容。这样我们就可以了解有关我们函数使用的内容了。一般其他函数的使用大多都是这样的方法。
下面是程序

# include "stm32f10x.h"//添加头文件,这里面有一些定义,我们会用到,如果想要了解更多stm32f10x.h更多作用可以在stm32f10x.h文件中的说明处查看
//这里只取头文件里的一小段内容,可以看出头文件还是很重要的
//This file contains all the peripheral register's definitions, bits 
//  *          definitions and memory mapping for STM32F10x Connectivity line, 
//  *          High density, High density value line, Medium density, 
//  *          Medium density Value line, Low density, Low density Value line 
//  *          and XL-density devices.
//  *
//  *          The file is the unique include file that the application programmer
//  *          is using in the C source code, usually in main.c.

int i;
int count;
void delay(count)
{
     
	for (i=0;i<count;i++);
}//这里是定义了一个延时函数,这个是自己编写的,因为库函数中没有延时函数

 void led_unit(){
           //这里定义了一个函数,内容(作用)是让要用到的GPIO口能正常使用
	GPIO_InitTypeDef GPIO_InitStruct;//定义结构体,因为GPIO初始化函数中的参数有一个是结构体类型的,而且一般定义结构体常常放在函数开头处。不放函数开头处有时候会报错

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);//开启GPIO中B口和E口的时钟
	
	 
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;//工作模式选推挽输出
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_5;//选择5管脚
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;//选则工作频率50MHz
	 //给结构体里的成员变量赋值
	 
	GPIO_Init(GPIOB, &GPIO_InitStruct);//调用初始化函数,完成GPIOB的初始化
	//这里是因为GPIOB和GPIOE里选择的内容都是一样的,都是推挽输出,都是5管脚,工作频率也可以选择一样的,所以就不用再次对结构体里的成员变量进行赋值了
	 //如果GPIOE不是选的5管脚,或是其他的工作频率,就要在这里再对结构体里的成员变量再次进行赋值。
	GPIO_Init(GPIOE, &GPIO_InitStruct);//完成GPIOE的初始化
 }
 
	int main () {
     
	led_unit();//运行led_unit函数中的内容
	while(1)//让while中的内容一直循环运行,也就是让灯亮和灭的过程一直运行
	{
      
	 {
     GPIO_ResetBits(GPIOB, GPIO_Pin_5);
		 GPIO_SetBits(GPIOE, GPIO_Pin_5);
	 }//将PB5置0,led0灯将会亮;将PE5置1,led1灯将会灭;
	 delay(300000);//将灯的状态保持一段时间
	 
	{
     GPIO_ResetBits(GPIOE, GPIO_Pin_5);
		 GPIO_SetBits(GPIOB, GPIO_Pin_5);
```cpp
}//将PE5置0,led1灯将会亮;将PB5置1,led0灯将会灭;
    delay(300000);//将灯的状态保持一段时间
//
}
	}


这个程序仅供大家参考
下面进行软件上的仿真(因为没有开发板)
首先要保存一下我们写的程序,然后编译一下看看有没有错误。如果是第一次编译的话,可以选择图中方框里的位置进行编译,这个是对所有程序进行编译的,时间会比较久。如果编译过了,改动了一小处内容,可以选择红色方框左边的按钮进行编译,这个是对你改动的地方进行的编译。时间会很快。
stm32f103用库函数的方法实现流水灯的实验_第7张图片
之后进入debug调试界面
stm32f103用库函数的方法实现流水灯的实验_第8张图片

进入调试界面之后,可以把不用的窗口页面关掉,只保留main.c就可以,然后可以调出我们用到的GPIO口的管脚,看gpiob5和gpioe5的电平情况。按照这个图可以调出gpiob口,gpioe口也是同理,只需要在第三步选gpioe即可.
stm32f103用库函数的方法实现流水灯的实验_第9张图片

下面我们就可以看到把gpio口给调出来了,
stm32f103用库函数的方法实现流水灯的实验_第10张图片
在@2处可以看到16个方框,名称是pin,也就是管脚的意思,也就是表示gpio口的16个管脚,在这里我们可以看到16个管脚的电位情况,最右边是gpio0,我们要看的是gpiob5,也就是从右边数第6个框了,gpioe5也是同理。如果某处打对勾表示这个管脚是高电位,没打对勾就是低电位了。
点Run运行即可运行程序了,在Run右边有个乘号(就是叉号),运行后点叉号就可以停止程序的运行了。再往右看能看到四个按钮,第一个是一个蓝色箭头伸进了黑色大括号里边,应该是表示会在大括号里运行,第二个是蓝色箭头在黑色大括号外边,应该是表示不进入大括号里的程序运行。一般如果想要单步运行程序的话,推荐使用第二种,不过用第一种有时候更容易检查自己出现的错误。至于后边两个我没使用过,有兴趣的可以尝试点击看一下。
下面是运行时候的截图
stm32f103用库函数的方法实现流水灯的实验_第11张图片
可以看到gpiob5对应的方框是对勾,因此gpiob5是高电位,那么led0也就不会亮,在gpioe5中没有对勾,所以gpioe5处是低电位,那么led1灯将会被点亮。
stm32f103用库函数的方法实现流水灯的实验_第12张图片

这个是经过一个延时后的情况,这时候gpiob5是低电位,那么led0就会被点亮了, gpioe5处是高电位,那么led1灯将会熄灭。
然后这个过程就会一直进行,至此我们就实现了流水功能。

你可能感兴趣的:(嵌入式)