GPIO操作是单片机最基本和最常用的操作,在配置GPIO控制LED灯、检测按键输入等功能时都需要用到。NRF52832的GPIO可设置为:输入、输出、复用和模拟通道 4 种模式,一部分与I2C,SPI,UART复用。管脚内部结构如下图所示:
一、GPIO寄存器
1、OUT寄存器:实现写GPIO端口,bit0-31对应引脚P0.00-P0.31,为0表示引脚输出低电平,为1表示引脚输出高电平;
2、OUTSET寄存器:实现引脚置位,bit0-31对应引脚P0.00-P0.31;
3、OUTCLR寄存器:实现引脚清零;
4、IN寄存器:实现读GPIO端口;
5、DIR寄存器:实现引脚的方向配置,为0引脚是输入方向,为1引脚是输出方向;
6、DIRSET寄存器:实现引脚输出方向配置;
7、DIRCLR寄存器:实现引脚输入方向配置;
8、LATCH寄存器:实现锁存电平信号;
9、DETECTMODE寄存器:实现检测模式配置;
10、PIN_CNF[n](n=0-31)寄存器:实现输入缓冲器、上下拉电阻、驱动能力等的配置。
二、相关库函数介绍
1、void nrf_gpio_cfg_output(uint32_t pin_number)功能:设置指定引脚为输出方向
2、void nrf_gpio_range_cfg_output(uint32_t pin_range_start,uint32_t pin_range_end)功能:设置指定范围内的连续引脚为输出方向
3、void nrf_gpio_cfg_input(uint32_t pin_number,nrf_gpio_pin_pull_t pull_config)功能:设置指定引脚为输入方向
4、void nrf_gpio_range_cfg_input(uint32_t pin_range_start,uint32_t pin_range_end,nrf_gpio_pin_pull_t pull_config)功能:设置指定范围内的连续引脚为输入方向
5、void nrf_gpio_pin_set(uint32_t pin_number)功能:驱动指定的GPIO输出高电平
6、void nrf_gpio_pin_clear(uint32_t pin_number)功能:驱动指定的GPIO输出低电平
7、void nrf_gpio_pin_toggle(uint32_t pin_number)功能:翻转指定的GPIO输出状态
8、uint32_t nrf_gpio_pin_read(uint32_t pin_number)功能:读取指定引脚的电平状态,0代表低电平,1代表高电平
9、uint32_t nrf_gpio_port_in_read(NRF_GPIO_Type const * p_reg)功能:读取端口所有的GPIO的状态
三、程序示例
1、 点亮LED:
void LED_Init(void)
{ // 输出
nrf_gpio_cfg_output(LED_0);
nrf_gpio_cfg_output(LED_1);
nrf_gpio_cfg_output(LED_2);
nrf_gpio_cfg_output(LED_3);
}
void LED1_Open(void)
{
nrf_gpio_pin_set(LED_0);
}
void LED1_Close(void)
{
nrf_gpio_pin_clear(LED_0);
}
void LED1_Toggle(void)
{
nrf_gpio_pin_toggle(LED_0);
}
2、按键检测:
void KEY_Init(void)
{
nrf_gpio_cfg_input(KEY1,NRF_GPIO_PIN_PULLUP);
nrf_gpio_cfg_input(KEY2,NRF_GPIO_PIN_PULLUP);
}
uint8_t KEY_Scan(void)
{
if(nrf_gpio_pin_read(KEY1) == 0)
{
nrf_delay_ms(10);
if(nrf_gpio_pin_read(KEY1) == 0)
{
while(nrf_gpio_pin_read(KEY1) == 0); //检测按键是否释放
return KEY1_OK;
}
else
return 0;
}
else
return 0;
return 0;
}