nrf52832调试记录之IO引脚配置
[复制链接]
本帖最后由 志心工作室 于 2020-11-18 14:38 编辑
由于本工作室开发的蓝牙心电记录模块采用的是nrf52832作为主控芯片,在开发过程中遇到一些问题会陆续和大家分享:
下图是nrf52832芯片QFN48封装的引脚图
image.png (99.03 KB, 下载次数: 0)
2020-11-18 11:36 上传
其中P0.02~P0.05和P0.28~P0.31可配置为ADC采集引脚,其他的IO脚可任意分配到各个外设
其中P0.09和P0.10默认分配到NFC功能外设,如果需要设置为普通IO或映射到其他外设需要添加宏CONFIG_NFCT_PINS_AS_GPIOS
image.png (38.41 KB, 下载次数: 0)
2020-11-18 11:41 上传
P0.21默认作为复位引脚,如果需要设置为普通IO或映射到其他外设需删除宏CONFIG_GPIO_AS_PINRESET
image.png (38.46 KB, 下载次数: 0)
2020-11-18 11:44 上传
但是实际调试删除后无效,debug观察发现PSELRESET还是连接到默认的复位引脚
image.png (60.97 KB, 下载次数: 0)
2020-11-18 11:48 上传
查找源码发现下面的if语句始终不成立,因此需要手动修改 NRF_UICR->PSELRESET[0] NRF_UICR->PSELRESET[1]至需要的reset引脚或断开连接,我在debug调试的时候直接修改寄存器至空着的IO脚
由于此寄存器掉电不丢失,所以可以正常修改
/* Bit 31 : Connection */
#define UICR_PSELRESET_CONNECT_Pos (31UL) /*!< Position of CONNECT field. */
#define UICR_PSELRESET_CONNECT_Msk (0x1UL << UICR_PSELRESET_CONNECT_Pos) /*!< Bit mask of CONNECT field. */
#define UICR_PSELRESET_CONNECT_Connected (0UL) /*!< Connect */
#define UICR_PSELRESET_CONNECT_Disconnected (1UL) /*!< Disconnect */
#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))){
NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Wen << NVMC_CONFIG_WEN_Pos;
while (NRF_NVMC->READY == NVMC_READY_READY_Busy){}
NRF_UICR->PSELRESET[0] = 0xffff;
while (NRF_NVMC->READY == NVMC_READY_READY_Busy){}
NRF_UICR->PSELRESET[1] = 0xffff;
while (NRF_NVMC->READY == NVMC_READY_READY_Busy){}
NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Ren << NVMC_CONFIG_WEN_Pos;
while (NRF_NVMC->READY == NVMC_READY_READY_Busy){}
NVIC_SystemReset();
}
#endif
串口通信引脚
配置串口通信时,当串口接收引脚悬空,并使能接收时容易出现错误,导致程序死在串口接收错误里,可在RX引脚接上拉电阻解决
由于正常使用的32768时钟所以未作IO配置