最近刚做完一个DA14580的项目,对这个芯片的使用也是有了一些心得,现在打算写出来,分享给大家。从最简单的GPIO开始吧,打算一天写一篇,大家有问题可以留言或者评论,互相交流。
1.首先是GPIO引脚的定义,默认是在periph_setup.h这个文件里,引脚的定义如下,指定PORT和pin,
//定义一个LED引脚,port为2,pin为5
#define LED_PORT GPIO_PORT_2
#define LED_PIN GPIO_PIN_5
//定义一个KEY引脚,port为2,pin为4
#define KEY_PORT GPIO_PORT_2
#define KEY_PIN GPIO_PIN_4
//定义一个LED引脚,port为2,pin为5
#define LED_PORT GPIO_PORT_2
#define LED_PIN GPIO_PIN_5
//定义一个KEY引脚,port为2,pin为4
#define KEY_PORT GPIO_PORT_2
#define KEY_PIN GPIO_PIN_4
2.然后是GPIO引脚的初始化,引脚的初始化是在periph_setup.c里,格式如下
GPIO_ConfigurePin( LED_PORT, LED_PIN, OUTPUT, PID_GPIO, false );
GPIO_ConfigurePin( KEY_PORT, KEY_PIN, INPUT, PID_GPIO, false );
GPIO_ConfigurePin里一共有四个参数,前两个是port和pin,第三个是指定IO口的输入输出方向,DA1458x的IO口输入输出方向一共有四种,悬空输入,上拉输入,下拉输入,输出(应该是push-pull),不知道为什么没有open drain输出,写软件I2C时不是很方便,以后的帖子里我会说DA1458x软件I2C的实现方法。这里LED就初始化为OUTPUT,KEY初始化为INPUT。
typedef enum {
INPUT = 0,
INPUT_PULLUP = 0x100,
INPUT_PULLDOWN = 0x200,
OUTPUT = 0x300,
} GPIO_PUPD;
最后一个参数是ture或者false,当输入输出方向为输出时,选择IO默认初始化之后的电平,比如为true时,初始化后,IO口就会输出高电平。
3.GPIO输入输出方向为输出时的使用
点亮一个LED
GPIO_SetActive(LED_PORT, LED_PIN);
熄灭LED
GPIO_SetInactive(LED_PORT, LED_PIN);
4.GPIO输入输出方向为输入时的使用
用GPIO_GetPinStatus()来获取指定port和pin的IO的当前输入电平
if(GPIO_GetPinStatus(KEY_PORT, KEY_PIN) == 0)
{
delay(); //加个延时防抖
if(GPIO_GetPinStatus(KEY_PORT, KEY_PIN) == 0)
{
//operation
}
}
5.IO口的使用就这些内容吧,需要注意一点的是如果DA1458x定义了睡眠,如下,
/*Sleep modes*/
#define CFG_EXT_SLEEP
那么当你想要保持输出电平时,就需要先disable睡眠
app_disable_sleep();
这样输出电平才可以保持,不然的话当DA1458x已进入睡眠,IO口就会被释放掉,输出电平就没了。
可以用如下程序恢复睡眠
app_set_extended_sleep();
GPIO_ConfigurePin( LED_PORT, LED_PIN, OUTPUT, PID_GPIO, false );
GPIO_ConfigurePin( KEY_PORT, KEY_PIN, INPUT, PID_GPIO, false );
GPIO_ConfigurePin里一共有四个参数,前两个是port和pin,第三个是指定IO口的输入输出方向,DA1458x的IO口输入输出方向一共有四种,悬空输入,上拉输入,下拉输入,输出(应该是push-pull),不知道为什么没有open drain输出,写软件I2C时不是很方便,以后的帖子里我会说DA1458x软件I2C的实现方法。这里LED就初始化为OUTPUT,KEY初始化为INPUT。
typedef enum {
INPUT = 0,
INPUT_PULLUP = 0x100,
INPUT_PULLDOWN = 0x200,
OUTPUT = 0x300,
} GPIO_PUPD;
最后一个参数是ture或者false,当输入输出方向为输出时,选择IO默认初始化之后的电平,比如为true时,初始化后,IO口就会输出高电平。
3.GPIO输入输出方向为输出时的使用
点亮一个LED
GPIO_SetActive(LED_PORT, LED_PIN);
熄灭LED
GPIO_SetInactive(LED_PORT, LED_PIN);
4.GPIO输入输出方向为输入时的使用
用GPIO_GetPinStatus()来获取指定port和pin的IO的当前输入电平
if(GPIO_GetPinStatus(KEY_PORT, KEY_PIN) == 0)
{
delay(); //加个延时防抖
if(GPIO_GetPinStatus(KEY_PORT, KEY_PIN) == 0)
{
//operation
}
}
5.IO口的使用就这些内容吧,需要注意一点的是如果DA1458x定义了睡眠,如下,
/*Sleep modes*/
#define CFG_EXT_SLEEP
那么当你想要保持输出电平时,就需要先disable睡眠
app_disable_sleep();
这样输出电平才可以保持,不然的话当DA1458x已进入睡眠,IO口就会被释放掉,输出电平就没了。
可以用如下程序恢复睡眠
app_set_extended_sleep();
关于GPIO的部分就写到这里,以后发现不对或者不足的地方,我会及时更新。