在調試nRF52832的uart的過程中,發現調試信息會時不時打印“APP_UART_COMMUNICATION_ERROR”這個錯誤,看上去似乎毫無規律。查看SDK的相關說明,可以大致知道打印這個的提示的原因是uart硬件接收到了一些錯誤數據。但是為什么會收到錯誤數據呢?
經過反復試驗,發現只要用手觸碰到芯片的RX引腳,就會打印這個錯誤提示。由此,可以推測是手觸碰到uart的接收腳,觸發了uart的接收,但是又沒接收到正確數據,所以才導致了這個問題。說到這里,能很自然地想到這一定是和芯片的管腳輸入模式有關。博主之前有寫過一篇文章《觸摸單片機的IO會使單片機死機的問題》,文中所寫的問題,與當前這個問題本質上是一樣的,都是由於輸入管腳浮空造成的。
通過不斷追蹤uart初始化代碼,發現SDK確實是把RXD引腳默認設置成了浮空輸入。代碼如下:
在“nrf_drv_uart.c”文件的第110行:
__STATIC_INLINE void apply_config(nrf_drv_uart_t const * p_instance, nrf_drv_uart_config_t const * p_config)
{
if (p_config->pseltxd != NRF_UART_PSEL_DISCONNECTED)
{
nrf_gpio_pin_set(p_config->pseltxd);
nrf_gpio_cfg_output(p_config->pseltxd);
}
if (p_config->pselrxd != NRF_UART_PSEL_DISCONNECTED)
{
nrf_gpio_cfg_input(p_config->pselrxd, NRF_GPIO_PIN_NOPULL);
}
把代碼中的“NRF_GPIO_PIN_NOPULL”,改成“NRF_GPIO_PIN_PULLUP”即可解決這個問題。