TorryLong

博客园 首页 新随笔 联系 订阅 管理

在调试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”即可解决这个问题。

posted on 2020-09-08 11:33  TorryLong  阅读(1276)  评论(0编辑  收藏  举报