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取出接收到的数据。

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

    关注

    123

    文章

    7278

    浏览量

    141096
  • 中断
    +关注

    关注

    5

    文章

    884

    浏览量

    41023
  • 串口
    +关注

    关注

    14

    文章

    1483

    浏览量

    74513
  • dma
    dma
    +关注

    关注

    3

    文章

    535

    浏览量

    99021
收藏 人收藏

    评论

    相关推荐

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

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

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

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

    【HAL每天一例】第077例:SPI-NRF24L01无线模块(一对一通信)

    /1i574oPv密码:r3s3(硬石YS-F1Pro开发板HAL例程持续更新\2. 软件设计之高级裸机例程(HAL版本)\YSF1_HAL-111. SPI-NRF24L01无线模块(一对一
    发表于 07-29 09:08

    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

    nRF24Z1 firmware(nRF24Z1源程序)

    nRF24Z1 firmware(nRF24Z1源程序) V2.0版本
    发表于 10-05 15:05 124次下载

    Using the Serial Port on the M

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

    什么是Serial ATA(SATA)

    什么是Serial ATA(SATA)  Serial ATA,缩写SATA,是一种基于串行信号传输技术。串行ATA采用两根250mV差分信号传输,串扰可被有效抑制。
    发表于 01-22 10:40 7789次阅读

    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和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单片无线收发芯片的资料合集

    NRF52840与NRF52832的性能区别

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

    NRF51822和NRF52832的主要区别

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

    USB Gadget serial应用实例(上)

    1. 硬件体验 使用 Linux 自带的 USB Gadget 驱动 /drivers/usb/gadget/legacy/serial.c 使用 USB 线,连接板子的 OTG 口和 PC
    的头像 发表于 07-13 11:06 1251次阅读
    USB Gadget <b class='flag-5'>serial</b>应用实例(上)