Во многих проектах примеров устройств из SDK используется опция CONFIG_GPIO_AS_PINRESET, чтобы назначить определенный вывод GPIO под функцию сброса.
Работает это следующим образом. Если для препроцессора определен макрос CONFIG_GPIO_AS_PINRESET (это делается через свойства проекта путем редактирования определений препроцессора), то выбранная ножка GPIO (выбор определяется макросом RESET_PIN) конфигурируется под функцию сброса. Это делается, когда нужна функция сброса от внешнего вывода (Pin Reset). Если этот макрос не определен, то сброс от внешнего вывода недоступен. В таком случае один вывод GPIO (какой именно, см. даташит на используемый MCU) будет зарезервирован для PinReset, и он не будет доступен как обычный вывод GPIO.
По умолчанию CONFIG_GPIO_AS_PINRESET определен, и назначается ножка сброса на порт P0.21 (вывод 24 корпуса QFN48). Ножка порта P0.21 используется как вывод сброса на макетной плате PCA10040. При этом если подать лог. 0 на этот вывод, то произойдет сброс.
Конфигурирование выбранной ножки делает код запуска в процедуре SystemInit (находится в модуле system_nrf52.c). При изменении конфигурации CONFIG_GPIO_AS_PINRESET перекомпилируйте проект, чтобы изменить поведение кода SystemInit.
Код SystemInit, который настраивает поведение вывода для сброса:
#if defined (CONFIG_GPIO_AS_PINRESET)
if (((NRF_UICR->PSELRESET[0] & UICR_PSELRESET_CONNECT_Msk) !=
(UICR_PSELRESET_CONNECT_Connected << UICR_PSELRESET_CONNECT_Pos)) ||
((NRF_UICR->PSELRESET[1] & UICR_PSELRESET_CONNECT_Msk) !=
(UICR_PSELRESET_CONNECT_Connected << UICR_PSELRESET_CONNECT_Pos)))
{
nvmc_config(NVMC_CONFIG_WEN_Wen);
NRF_UICR->PSELRESET[0] = RESET_PIN;
nvmc_wait();
NRF_UICR->PSELRESET[1] = RESET_PIN;
nvmc_wait();
nvmc_config(NVMC_CONFIG_WEN_Ren);
NVIC_SystemReset();
}
#endif
Важный момент: если необходимо поменять конфигурацию CONFIG_GPIO_AS_PINRESET, недостаточно просто исключить или просто добавить определение макроса CONFIG_GPIO_AS_PINRESET. Пока не будет предварительно выполнена полная очистка памяти, это изменение не вступит в силу. Причина в том, что настройка конфигурации для вывода сброса делается в энергонезависимой памяти, которая должна быть очищена, а это возможно только через полную очистку FLASH.
Очистку памяти чипа nRF5x можно выполнить либо с помощью J-Link Commander [1], либо с помощью утилиты nrfjprog [2] (с помощью команды nrfjprog --recover).
[Ссылки]
1. Keil IDE: настройка меню Tools. 2. nRF Command Line Tools. |