这篇文章是基于上一篇文章创建的工程来继续开发的,有兴趣的小伙伴可以先去看一看上一篇——创建stc32G库函数版本的keil项目。
首先,我们先打开Driver\src中的STC32G_GPIO文件看一下,我们可以看到,在这个文件中只有一个函数,有了解过STC32G12K128这款芯片的都知道,他有四个输出方式,分别是:上拉准双向口(8051传统I/O口),浮空输入,开漏输出,推挽输出。重新看一下这个函数:
u8 GPIO_Inilize(u8 GPIO, GPIO_InitTypeDef *GPIOx)
这个函数有两个参数,第一个参数为以下七个中的一个:
#define GPIO_P0 0 //
#define GPIO_P1 1
#define GPIO_P2 2
#define GPIO_P3 3
#define GPIO_P4 4
#define GPIO_P5 5
#define GPIO_P6 6
#define GPIO_P7 7
第二个参数为自定义的结构体:
typedef struct
{
u8 Mode; //IO模式, GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
u8 Pin; //要设置的端口
} GPIO_InitTypeDef;
Mode:
#define GPIO_PullUp 0 //上拉准双向口
#define GPIO_HighZ 1 //浮空输入
#define GPIO_OUT_OD 2 //开漏输出
#define GPIO_OUT_PP 3 //推挽输出
Pin:
#define GPIO_Pin_0 0x01 //IO引脚 Px.0
#define GPIO_Pin_1 0x02 //IO引脚 Px.1
#define GPIO_Pin_2 0x04 //IO引脚 Px.2
#define GPIO_Pin_3 0x08 //IO引脚 Px.3
#define GPIO_Pin_4 0x10 //IO引脚 Px.4
#define GPIO_Pin_5 0x20 //IO引脚 Px.5
#define GPIO_Pin_6 0x40 //IO引脚 Px.6
#define GPIO_Pin_7 0x80 //IO引脚 Px.7
#define GPIO_Pin_LOW 0x0F //IO低4位引脚
#define GPIO_Pin_HIGH 0xF0 //IO高4位引脚
#define GPIO_Pin_All 0xFF //IO所有引脚
找到了这个函数的用法和要输入的参数后,就可以调用它了,首先需要先创建两个新文件:led.c、led.h,由于我用的板子led灯接的引脚是P10,所以我这里初始化引脚为P10,初始化函数如下:
void LED_Init(void)
{
#if 0
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.Mode=GPIO_PullUp;
GPIO_InitStructure.Pin=GPIO_Pin_0;
GPIO_Inilize(GPIO_P1,&GPIO_InitStructure);
#else
P1_MODE_IO_PU(GPIO_Pin_0);
#endif
}
由于要用到延时,所以要包含STC32G_Delay.h这个头文件。头文件如下:
#include "STC32G_Delay.h"
#include "config.h"
#include "led.h"
void main()
{
WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXSFR(); //扩展SFR(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
LED_Init();
while(1)
{
P10=~P10;
delay_ms(500);
}
}
如此可实现led灯的闪烁。工程文件放在资源,有兴趣的小伙伴可以自行下载。