NRF52832串口修改

2024-01-13 10:48
文章标签 串口 修改 nrf52832

本文主要是介绍NRF52832串口修改,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一. 测试的平台

环境 : 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);

这篇关于NRF52832串口修改的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/601188

相关文章

Python模拟串口通信的示例详解

《Python模拟串口通信的示例详解》pySerial是Python中用于操作串口的第三方模块,它支持Windows、Linux、OSX、BSD等多个平台,下面我们就来看看Python如何使用pySe... 目录1.win 下载虚www.chinasem.cn拟串口2、确定串口号3、配置串口4、串口通信示例5

Nginx 413修改上传文件大小限制的方法详解

《Nginx413修改上传文件大小限制的方法详解》在使用Nginx作为Web服务器时,有时会遇到客户端尝试上传大文件时返回​​413RequestEntityTooLarge​​... 目录1. 理解 ​​413 Request Entity Too Large​​ 错误2. 修改 Nginx 配置2.1

Python对PDF书签进行添加,修改提取和删除操作

《Python对PDF书签进行添加,修改提取和删除操作》PDF书签是PDF文件中的导航工具,通常包含一个标题和一个跳转位置,本教程将详细介绍如何使用Python对PDF文件中的书签进行操作... 目录简介使用工具python 向 PDF 添加书签添加书签添加嵌套书签Python 修改 PDF 书签Pytho

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模

Docker镜像修改hosts及dockerfile修改hosts文件的实现方式

《Docker镜像修改hosts及dockerfile修改hosts文件的实现方式》:本文主要介绍Docker镜像修改hosts及dockerfile修改hosts文件的实现方式,具有很好的参考价... 目录docker镜像修改hosts及dockerfile修改hosts文件准备 dockerfile 文

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

Linux修改pip和conda缓存路径的几种方法

《Linux修改pip和conda缓存路径的几种方法》在Python生态中,pip和conda是两种常见的软件包管理工具,它们在安装、更新和卸载软件包时都会使用缓存来提高效率,适当地修改它们的缓存路径... 目录一、pip 和 conda 的缓存机制1. pip 的缓存机制默认缓存路径2. conda 的缓

Linux修改pip临时目录方法的详解

《Linux修改pip临时目录方法的详解》在Linux系统中,pip在安装Python包时会使用临时目录(TMPDIR),但默认的临时目录可能会受到存储空间不足或权限问题的影响,所以本文将详细介绍如何... 目录引言一、为什么要修改 pip 的临时目录?1. 解决存储空间不足的问题2. 解决权限问题3. 提

Linux文件名修改方法大全

《Linux文件名修改方法大全》在Linux系统中,文件名修改是一个常见且重要的操作,文件名修改可以更好地管理文件和文件夹,使其更具可读性和有序性,本文将介绍三种在Linux系统下常用的文件名修改方法... 目录一、引言二、使用mv命令修改文件名三、使用rename命令修改文件名四、mv命令和rename命

如何使用C#串口通讯实现数据的发送和接收

《如何使用C#串口通讯实现数据的发送和接收》本文详细介绍了如何使用C#实现基于串口通讯的数据发送和接收,通过SerialPort类,我们可以轻松实现串口通讯,并结合事件机制实现数据的传递和处理,感兴趣... 目录1. 概述2. 关键技术点2.1 SerialPort类2.2 异步接收数据2.3 数据解析2.