現(xiàn)象描述
基于light_switch例程,按照新的GPIO配置IO后不能生效
具體細(xì)節(jié)
例程中GPIO的分配為P0口的13饥努、14胳泉、15、16们何,現(xiàn)需要改為
原例程中4個(gè)LED分別如下
#define LED_1 NRF_GPIO_PIN_MAP(0,13)
#define LED_2 NRF_GPIO_PIN_MAP(0,14)
#define LED_3 NRF_GPIO_PIN_MAP(0,2)
#define LED_4 NRF_GPIO_PIN_MAP(0,16)
現(xiàn)改為P1口的6萄焦、11、2冤竹、5口
#define LED_1 NRF_GPIO_PIN_MAP(1,11)
#define LED_2 NRF_GPIO_PIN_MAP(1,6)
#define LED_3 NRF_GPIO_PIN_MAP(1,2)
#define LED_4 NRF_GPIO_PIN_MAP(1,5)
改為后發(fā)現(xiàn)未生效拂封,針對此現(xiàn)象進(jìn)行了代碼追尋
代碼分析
GPIO驅(qū)動發(fā)現(xiàn)有問題,只能使用Port0不能使用port1鹦蠕,代碼如下
NRF_GPIO->OUTCLR = (1 << pin);
#ifndef NRF_GPIO
#define NRF_GPIO NRF_P0
#endif
#ifndef NRF_GPIO_BASE
#define NRF_GPIO_BASE NRF_P0_BASE
#endif
改為根據(jù)pin腳號來自動區(qū)分Port0還是Port1,更新驅(qū)動后如下
nrf_gpio_pin_write(pin, value);
NRF_GPIO_Type * reg = nrf_gpio_pin_port_decode(&pin_number);
nrf_gpio_port_out_set(reg, 1UL << pin_number);
修改后仍不能控制冒签,發(fā)現(xiàn)仍有一個(gè)問題,初始化也是有局限性的钟病,只能是從小到大且為連續(xù)的pin腳萧恕,代碼如下
for (uint32_t i = LED_START; i <= LED_STOP; ++i)
{
NRF_GPIO->PIN_CNF[i] = LED_PIN_CONFIG;
NRF_GPIO->OUTSET = 1UL << i;
}
修改通用初始化代碼如下:
/* 管腳輸出配置,管腳的刪減同步更新管腳個(gè)數(shù) */
static const uint8_t gpio_out_list[4] = { LED_1, LED_2, LED_3, LED_4 };
for (uint32_t i = 0; i < 4; i++)
{
nrf_gpio_cfg_output(gpio_out_list[i]);
}
結(jié)果
修改驅(qū)動后肠阱,可以自如控制GPIO