基于uVision的STM32F103C8编程第二弹

以下是我学习基于uVision中的STM32F103C8编程的一点感悟和指导,分享出来,希望对大家有所帮助。如果有错误的地方可以留言指出来,我一定耐心听取。相信大家只要付出努力,就一定学有所成!

目录

1.头文件和功能函数封装与使用

2.按键驱动

话不多说,步入正题

1.头文件和功能函数封装与使用

这个基本功能还是很重要的, 想一想一个成百上千行的项目,如果可以模块化开发,不仅仅是对队友的便利,更是对自己以后维护和更改留了一条路。但是也因为基础而常常被学习人员因为不是必要的而忽略。接下来我来讲解一下整个过程,也不是很难,相信大家努力一下下都可以掌握!!!!

1.1

1.1.1

单击file–>new 来建立两个新文档,分别命名成.c文件和.h文件(我以led.c和led.h为例,其中.c文件表示源代码文件,.h文件表示头文件)。然后保存在自己建立的项目里,可以建立一个新的文件夹(我以system文件名为例),也可以保存在user文件里面。

1.1.2

对于第一种情况,还需要后续的对于文件夹进行一下添加到路径操作。后续操作如下图所示
在这里插入图片描述

按照步骤将文件路径添加到项目配置路径

  1. 点击项目配置按键
  2. 点击c/c++选项
  3. 点击include paths中的添加按钮
  4. 点击文件弹出框中的添加按钮
  5. 选择并且将自己新建的文件夹添加进去即可

1.1.3

将以.c结尾的源文件添加到软件中project展示板中。步骤是右键点击project–>new Group,然后慢速双击这个新group来换一个和自己建立的文件夹相同名字(我的改成system),然后再快速双击新group来把自己的.c文件添加到新的group中。

1.1.4

在头文件led.h中添加如下代码

#ifndef _LED_H/*/头文件开始声明*/
#define _LED_H/*头文件声明*/

void allon(void);/*所要声明开灯函数*/
void alloff(void);/*关灯函数*/
#endif/*头文件结束声明*/

此时有两个容易忽略的错误(我觉得不是错误的错误)
1)解决办法是头文件里传输参数是空的话,在括号里写上void就可以
…\system\LED\key.h(5): warning: #1295-D: Deprecated declaration key_init - give arg types
2)在#endif后面添加一行空行就可以
…\system\LED\key.h(10): warning: #1-D: last line of file ends without a newline

1.1.5

其中所要声明的函数(我以allon函数为例),在对应的led.c文件中具体实现,实现代码和格式如下

#include <stdio.h>
#include <stm32f10x.h>
#include <led.h>//对应所要编写的头文件名字

void allon(){
	GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4);//亮灯函数
}
void alloff(){
	GPIO_ResetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4);
}

1.1.6

然后就只需要在所要引用这个函数的文档添加对应头文件,然后直接调用函数名字就可以,比如说我在main.c函数中写

#include <stdio.h>
#include <stm32f10x.h>
#include <led.h>//对应头文件

int main (){
	allon();//直接调用即可
	return 0;
}

至此,对于头文件和功能函数的封装和使用就介绍完成啦,是不是比较简单呢

2.按键驱动

2.1

书写key.c和key.h两个文件并添加进去project和路径里面。

添加的步骤讲的比较详细了,我就直接上代码了哦!

//key.h中的代码

#ifndef _KEY_H
#define _KEY_H


void key_init(void);//按钮初始化函数

int key_scan(void);//检查按钮是否按下的函数


#endif
//key.c中的代码

#include <key.h>
#include <stm32f10x.h>
#include <stdio.h>
//初始化按键
void key_init(){
   GPIO_InitTypeDef GPIO_InitStructure;//声明变量
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //初始化时钟
   
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//以下为初始化变量,pin_0为自己根据原理图所得
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//由于按键特性,需要将模式改成上拉输入,看图1
   
   GPIO_Init(GPIOA, &GPIO_InitStructure);//将变量和时钟关联
}
int key_scan(){
   return GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);//函数解释看下图2
}

以下是图1
图1
以下是图2
图2

2.2

在主函数中调用函数即可

#include <stdio.h>
#include <stm32f10x.h>
#include <led.h>
#include <key.h>

int main (){
 led_init();//初始化led灯,在上一章中有讲过,就不在此赘述了
 key_init();//初始化key
 while(1){
  if(key_scan()==0){
    allon();//亮灯
  }
  else{
   alloff();//关灯
  }
 }
 return 0;
}

此代码的运行结果是reset以后,四个led灯是灭的,当按wakeup按钮的时候led灯会被点亮。

到此为止,大家就学习完了头文件和功能函数的封装和使用以及按键驱动这两个知识点了。希望大家继续加油哦!!!

猜你喜欢

转载自blog.csdn.net/weixin_43661569/article/details/100125951