0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

nrf_serial库的使用技巧

CHANBAEK 来源:EEMaker电子创客营 作者:DK45王 2023-10-24 14:33 次阅读

nrf_serial 库是nordic封装的比较上层的串口抽象层。可以支持多个串口,可以使用阻塞、中断、DMA三种模式。接口API比较简单,但是在使用之前需要先进行比较多的宏定义。

SDK_CONFIG使能配置

在sdk_config中使能如下配置

NRFX_UARTE_ENABLED
NRFX_UART_ENABLED
NRF_SERIAL_ENABLED

并把对应的c文件添加到工程中,h头文件路径包含进工程中

添加串口底层配置定义

#define UART_TX_PIN 5
#define UART_RX_PIN 6
NRF_SERIAL_DRV_UART_CONFIG_DEF(uart_drv_config,
                      UART_RX_PIN, UART_TX_PIN,
                      NRF_UART_PSEL_DISCONNECTED, NRF_UART_PSEL_DISCONNECTED,
                      NRF_UART_HWFC_DISABLED, NRF_UART_PARITY_EXCLUDED,
                      NRF_UART_BAUDRATE_115200,
                      UART_DEFAULT_CONFIG_IRQ_PRIORITY);

该配置主要是用来配置串口的引脚、波特率、中断优先级等和硬件配置相关的东西。

添加FIFO和BUFFER定义

#define SERIAL_FIFO_TX_SIZE 128
#define SERIAL_FIFO_RX_SIZE 256
NRF_SERIAL_QUEUES_DEF(serial_queues, SERIAL_FIFO_TX_SIZE, SERIAL_FIFO_RX_SIZE);
#define SERIAL_BUFF_TX_SIZE 1
#define SERIAL_BUFF_RX_SIZE 1
NRF_SERIAL_BUFFERS_DEF(serial_buffs, SERIAL_BUFF_TX_SIZE, SERIAL_BUFF_RX_SIZE);

这两个东西很容易让人分不清,为什么既要定义queue又要定义一个buffer,是不是有点重复?

这里的BUFFER实际上就是传递给了底层,在DMA模式下当收到数据就直接把数据搬到了BUFFER里面。BUFFER定义的大小可以决定当收到几个byte以后会产生一个DMA中断,通知到上层就是一个NRF_SERIAL_EVENT_RX_DATA事件。所以为了让每接收一个byte会通知到上层来,通常就把SERIAL_BUFF_RX_SIZE设置为1了。

每一次DMA中断nrf_serial就会自动从BUFFER中取出接收到的数据,取出来的数据又会被写入到QUEUE中。应用读取接收到的数据实际上也就是从queue中提取出来了。

添加serial事件回调定义

static void uart_evt_handler_t(struct nrf_serial_s const * p_serial,nrf_serial_event_t event)
{
    if(event==NRF_SERIAL_EVENT_RX_DATA)
    {
    }
    else if(event==NRF_SERIAL_EVENT_FIFO_ERR)
    {
    }
    else if(event==NRF_SERIAL_EVENT_DRV_ERR)
    {
    }
}

前面的SERIAL_BUFF_RX_SIZE设置的是1,当接收到一个byte就会产生一个NRF_SERIAL_EVENT_RX_DATA事件。收到的数据nrf_serial自动的把数据存入到了queue中了。应用可以在接收事件中立马调用nrf_serial_read函数去读取数据,也可以放在app_scheduler中去

添加NRF_SERIAL定义

NRF_SERIAL_UART_DEF(serial_uarte, 0);
NRF_SERIAL_CONFIG_DEF(  serial_config, NRF_SERIAL_MODE_DMA,
                        &serial_queues, &serial_buffs, 
                        uart_evt_handler_t, NULL);

初始化nrf_serial

ret_code_t ret;
ret = nrf_serial_init(&serial_uarte, &uart_drv_config, &serial_config);
APP_ERROR_CHECK(ret);

当初始化以后就直接打开的接收功能,一旦有数据接收到就会产生事件。

发送数据接口函数

ret_code_t nrf_serial_write(nrf_serial_t const * p_serial,
                            void const * p_data,
                            size_t size,
                            size_t * p_written,
                            uint32_t timeout_ms);

接收数据接口函数

ret_code_t nrf_serial_read(nrf_serial_t const * p_serial,
                           void * p_data,
                           size_t size,
                           size_t * p_read,
                           uint32_t timeout_ms);

当使用DMA模式的时候,该函数需要在收到接收事件以后再调用,直接从queue取出接收到的数据。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 封装
    +关注

    关注

    126

    文章

    7873

    浏览量

    142891
  • 中断
    +关注

    关注

    5

    文章

    898

    浏览量

    41468
  • 串口
    +关注

    关注

    14

    文章

    1551

    浏览量

    76419
  • dma
    dma
    +关注

    关注

    3

    文章

    560

    浏览量

    100544
收藏 人收藏

    评论

    相关推荐

    在很多单片机调试通过的 NRF24L01

    最近看论坛,有些人调试这个,很多的时候都不成功。所以共享一个自己使用的在很多MCU上调试通过的NRF24L01。这个是从mbed上移植过来的,相当的稳定。而且对于开发者来说使用起来也很简单。先看
    发表于 09-21 14:33

    NRF24L01P原理图库_PCB封装资源下载

    NRF24L01P原理图库,PCB封装的资源下载PCB这个行业IPC标准化的NRF24L01P原理图库,PCB封装资源,此资料供大家一起学习,探讨制作封装
    发表于 10-19 17:04

    STM32与NRF24L01是怎样通过arduino进行通信的

    STM32与NRF24L01是怎样通过arduino进行通信的?
    发表于 12-16 07:47

    如何将nRF24l01模块与Arduino等微控制器平台连接?

    使用 SPI 协议进行通信,因此可以轻松与任何微控制器连接。使用Arduino变得容易得多,因为随时可用。标准nRF24L01 模块的引脚排列如下所示该模块的工作电压为1.9V至3.6V(通常为3.3V
    发表于 03-01 14:52

    请问nRF52832能移植ARM的DSP吗?

    nRF52832能移植ARM的DSP吗?
    发表于 10-16 07:51

    Using the Serial Port on the M

    Using the Serial Port on the MAXQ610 Microcontroller Abstract: The MAXQ610 microcontroller
    发表于 08-13 12:05 1417次阅读

    NRF905工作模式

    NRF905工作模式NRF905工作模式NRF905工作模式NRF905工作模式NRF905工作模式NR
    发表于 11-19 15:24 10次下载

    nrf51822_PRO_SCH_20141122

    nrf51822原理图 nrf51822原理图 nrf51822原理图
    发表于 04-15 17:59 19次下载

    NRF24L01接收程序

    程序是NRF24L01接收程序 接收到字符显示在OLED上面,包含文件非常简单易懂适合入门学习
    发表于 06-14 15:29 5次下载

    nRF24L01和nRF905、nRF401及nRF9E5单片无线收发芯片的资料合集

    本文档的主要内容详细介绍的是nRF24L01和nRF905、nRF401及nRF9E5嵌入微处理器单片无线收发芯片的资料合集免费下载包括了:Nordic中文选型手册,
    发表于 05-23 08:00 22次下载
    <b class='flag-5'>nRF</b>24L01和<b class='flag-5'>nRF</b>905、<b class='flag-5'>nRF</b>401及<b class='flag-5'>nRF</b>9E5单片无线收发芯片的资料合集

    AD7380/AD7381: What are the pros and cons of a Serial 2 wire mode and serial 1 wire mode?

    AD7380/AD7381: What are the pros and cons of a Serial 2 wire mode and serial 1 wire mode?
    发表于 02-02 09:24 14次下载
    AD7380/AD7381: What are the pros and cons of a <b class='flag-5'>Serial</b> 2 wire mode and <b class='flag-5'>serial</b> 1 wire mode?

    Mixly arduino nrf2401+对讲机制作

    ;SPI.h>#include “nRF24L01.h”#include “RF24.h”用NRF2401+搞了个对讲机,搭建容易代码简单。主要用的的是 RF24Audio 语音。需要元件一个功放模块,麦克风模块 按钮
    发表于 12-17 18:08 22次下载
    Mixly arduino <b class='flag-5'>nrf</b>2401+对讲机制作

    NRF52840与NRF52832的性能区别

    蓝牙版本的不断更新,大部分客户慢慢都向往着蓝牙5.0。当然对于前不久NORDIC刚出的蓝牙5.0 nrf52840,很多人都还不是很了解。NRF52840可以说是NRF52832的超强升级版,虽然
    的头像 发表于 02-24 15:02 5073次阅读

    基于nRF52的nRF52840 SoC

    方案介绍nRF52840 SoC 是 nRF52 系列中最先进的成员。它可以应对需要协议并发性和丰富多样的外围设备和功能的复杂应用程序的挑战。它为闪存和 RAM 提供了充足的内存可用性,这是此类要求
    发表于 12-26 15:48 3次下载

    NRF51822和NRF52832的主要区别

    对于NRF51822和NRF52832的选择性相信大家也是非常困惑的,哪个性价比高?下面为大家讲下NRF51822和NRF52832的一个区别,让大家能够更好的快速选型加快研发产品进度
    的头像 发表于 02-20 15:24 1302次阅读