NRF52832串口修改

本文详细介绍了在nRF52平台上通过修改UART配置实现低功耗的方法,包括UART与UARTE的区别、功耗分析、SDK_config.h与apply_old_config.h的配置修改,以及串口开关的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. 测试的平台

环境 : win10,64位,MDK集成开发环境.
SDK :nRF5_SDK_15.2
协议栈:s132_nrf52_6.1_softdevice.hex.
使用例程:ble_app_uart
硬件平台:pca10040开发板.

二. Uart概述

1、 类别
52832中串口分为两类,分别是UART和UARTE.

UARTUARTE
模式传统串口模式easyDMA+串口
优点功耗低可接收大数据,减少CPU工作量
缺点无法接收大数据功耗高

2、 功耗
由于UART需要实时检测RX线上有没有下降沿,所以一旦UART初始化成功,高频时钟将一直处于打开状态,从而导致UART模块消耗的电流比较大,虽然UART模块本身只需要55uA的工作电流,但是自动打开的高频时钟电路需要消耗250uA左右电流。如果使能了UARTE的easyDMA,那么DMA还需要消耗额外的2mA电流。这样UARTE工作总共需要消耗:55uA + 250uA + 2mA。因此在进入idle模式之前,强烈建议将UART关掉,以节省系统功耗。注:为了达到低功耗和实时性双重目的,在设计UART通信的时候,我们经常会额外再加2个GPIO口用来通知对方UART要传送数据了。关闭uart的API为:nrf_drv_uart_uninit或者app_uart_close。

三.Application修改

降低功耗需要关闭easyDMA.修改如下:
在不断的开关Uart的时候,会导致NRF_DRV_UART_EVT_ERROR这个错误产生,这个时候需要重新使能RX就可以的。
在nrfx_uart.c的nrfx_uart_rx函数中,将rx_enable函数替换成nrfx_uart_rx_enable这个函数。

if ((!p_cb->rx_enabled) && (!second_buffer))
{
//        rx_enable(p_instance);
		nrfx_uart_rx_enable(p_instance);
}

我们可以看到,nrfx_uart_rx_enable函数对rx_enabled这个参数重新设置为true.

void nrfx_uart_rx_enable(nrfx_uart_t const * p_instance)
{
    if (!m_cb[p_instance->drv_inst_idx].rx_enabled)
    {
        rx_enable(p_instance);
        m_cb[p_instance->drv_inst_idx].rx_enabled = true;
    }
}

四. Sdk_config.h修改

在这里插入图片描述
在nrf_drv_uart.h中,我们可以看到NRF_DRV_UART_DEFAULT_CONFIG串口的默认配置参数(这个在串口初始化的时候会调用app_uart_init)
这里面有一个关于easyDMA的配置选项,跟NRF_DRV_UART_WITH_UARTE和NRF_DRV_UART_WITH_UART这两个宏定义有关系。
在nrf_drv_uart.h中,我找到了这两个宏定义,如下所示
在这里插入图片描述

那么我们只要让NRFX_UARTE_ENABLED设置为0就可以了。这个参数在sdk_config.h中能够找到。事情并没有那么简单,我们可以看下apply_old_config.h这个头文件。
在apply_old_config.h中,可以看到Uart的相关配置,如下图所示:
在这里插入图片描述
所以说要配合apply_old_config.h中的相关配置对sdk_config.h的参数进行相应的修改。
在这里插入图片描述
不要被UART0_CONFIG_USE_EASY_DMA这个宏定义给迷惑了,这个参数对Uart是否使用easyDMA没任何影响。
对apply_old_config.h中的配置进行解析,我们可以知道只要将UART_ENABLED和UART_LEGACY_SUPPORT配置成1,将UART_EASY_DMA_SUPPORT配置成0就可以了。

五、串口开关

1、打开串口
① 外设上电;
② 初始化串口;
在这里插入图片描述
2、关闭串口
① 触发串口停止接收事件;
②清空串口接收标志;

nrf_uart_task_trigger(NRF_UART0,NRF_UART_TASK_STOPRX);
nrf_uart_event_clear(NRF_UART0,NRF_UART_EVENT_RXDRDY);

③关闭串口

err_code = app_uart_close();
APP_ERROR_CHECK(err_code);
<think>嗯,用户提到nrf52832串口初始化配置无法设置成9600波特率。我需要先回忆一下nRF52832的UART配置相关的内容。首先,nRF52832使用的是UARTE(带EasyDMA的UART),它的波特率配置是通过设置BAUDRATE寄存器来完成的。这个寄存器支持特定的波特率值,比如1200、9600、115200等等。但可能有某些情况下用户设置的波特率不正确。 接下来,我应该检查常用的波特率配置值是否正确。例如,Nordic的SDK中通常会有预定义的宏,比如NRF_UARTE_BAUDRATE_9600,这个宏对应的数值是否正确?用户可能在代码里直接写了数值而没有使用宏,导致配置错误。比如,正确的波特率寄存器值应该是0x00275000,对应十进制的16进制值是否正确? 另外,硬件连接问题也可能导致通信失败,比如TX和RX引脚是否接反,或者电平不匹配。但用户的问题明确是配置无法设置成9600,可能更偏向软件配置的问题。 可能用户使用的SDK版本或库函数有变化,导致旧的配置方式不再适用。例如,某些SDK版本中UART的初始化结构体成员是否有变化,或者配置函数参数是否正确。需要检查UARTE的初始化结构体是否正确设置了pselrxd、pseltxd等引脚,以及是否启用了流控,如果不需要的话应该设为NRF_UARTE_HWFC_DISABLED。 还有时钟源的问题,nRF52832的UART时钟源是否正确?通常使用内部时钟即可,但如果有外部晶振是否配置正确? 另外,用户是否在配置后正确启动了UARTE外设?比如调用nrf_uarte_enable()函数。或者是否有其他配置覆盖了波特率设置,比如在之后的代码中修改了波特率寄存器? 可能的解决步骤包括:检查波特率宏定义是否正确,查看数据手册确认寄存器值,使用示波器或逻辑分析仪测量实际波特率,确认代码中没有其他地方修改了UART配置,以及确保使用的SDK例程是否正确。 总结下来,可能的原因有:波特率寄存器值错误、SDK版本差异、引脚配置错误、硬件问题等。需要逐步排查这些可能性。</think>针对nRF52832串口无法配置为9600波特率的问题,以下是逐步排查与解决方案: --- ### **1. 确认波特率寄存器值正确性** nRF52832的UARTE外设使用32位寄存器`BAUDRATE`,需写入Nordic预定义的宏值: ```c #define NRF_UARTE_BAUDRATE_9600 0x00275000 // 正确宏定义 ``` **检查代码中是否使用宏或直接赋值:** ```c nrf_uarte_baudrate_set(NRF_UARTE0, NRF_UARTE_BAUDRATE_9600); // 正确方式 // 或直接赋值(不推荐) nrf_uarte_baudrate_set(NRF_UARTE0, 0x00275000); ``` --- ### **2. 排除SDK版本差异** - **旧版SDK(如nRF5 SDK 15.3以下)**:使用`NRF_UART_BAUDRATE_9600`。 - **新版SDK(nRF5 SDK 17.0+)**:改用`NRF_UARTE_BAUDRATE_9600`。 **解决方法:** 核对SDK头文件(如`nrfx_uarte.h`),确认宏定义名称与值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值