0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

nrf_serial庫的使用技巧

CHANBAEK ? 來源:EEMaker電子創(chuàng)客營 ? 作者: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);

該配置主要是用來配置串口的引腳、波特率、中斷優(yōu)先級等和硬件配置相關的東西。

添加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模式下當收到數(shù)據(jù)就直接把數(shù)據(jù)搬到了BUFFER里面。BUFFER定義的大小可以決定當收到幾個byte以后會產(chǎn)生一個DMA中斷,通知到上層就是一個NRF_SERIAL_EVENT_RX_DATA事件。所以為了讓每接收一個byte會通知到上層來,通常就把SERIAL_BUFF_RX_SIZE設置為1了。

每一次DMA中斷nrf_serial就會自動從BUFFER中取出接收到的數(shù)據(jù),取出來的數(shù)據(jù)又會被寫入到QUEUE中。應用讀取接收到的數(shù)據(jù)實際上也就是從queue中提取出來了。

添加serial事件回調(diào)定義

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就會產(chǎn)生一個NRF_SERIAL_EVENT_RX_DATA事件。收到的數(shù)據(jù)nrf_serial自動的把數(shù)據(jù)存入到了queue中了。應用可以在接收事件中立馬調(diào)用nrf_serial_read函數(shù)去讀取數(shù)據(jù),也可以放在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);

當初始化以后就直接打開的接收功能,一旦有數(shù)據(jù)接收到就會產(chǎn)生事件。

發(fā)送數(shù)據(jù)接口函數(shù)

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);

接收數(shù)據(jù)接口函數(shù)

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模式的時候,該函數(shù)需要在收到接收事件以后再調(diào)用,直接從queue取出接收到的數(shù)據(jù)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 封裝
    +關注

    關注

    126

    文章

    7901

    瀏覽量

    142965
  • 中斷
    +關注

    關注

    5

    文章

    898

    瀏覽量

    41502
  • 串口
    +關注

    關注

    14

    文章

    1554

    瀏覽量

    76522
  • dma
    dma
    +關注

    關注

    3

    文章

    561

    瀏覽量

    100587
收藏 人收藏

    評論

    相關推薦

    在很多單片機調(diào)試通過的 NRF24L01

    最近看論壇,有些人調(diào)試這個,很多的時候都不成功。所以共享一個自己使用的在很多MCU上調(diào)試通過的NRF24L01。這個是從mbed上移植過來的,相當?shù)姆€(wěn)定。而且對于開發(fā)者來說使用起來也很簡單。先看
    發(fā)表于 09-21 14:33

    NRF24L01P原理圖庫_PCB封裝資源下載

    NRF24L01P原理圖庫,PCB封裝的資源下載PCB這個行業(yè)IPC標準化的NRF24L01P原理圖庫,PCB封裝資源,此資料供大家一起學習,探討制作封裝
    發(fā)表于 10-19 17:04

    STM32與NRF24L01是怎樣通過arduino進行通信的

    STM32與NRF24L01是怎樣通過arduino進行通信的?
    發(fā)表于 12-16 07:47

    如何將nRF24l01模塊與Arduino等微控制器平臺連接?

    使用 SPI 協(xié)議進行通信,因此可以輕松與任何微控制器連接。使用Arduino變得容易得多,因為隨時可用。標準nRF24L01 模塊的引腳排列如下所示該模塊的工作電壓為1.9V至3.6V(通常為3.3V
    發(fā)表于 03-01 14:52

    請問nRF52832能移植ARM的DSP嗎?

    nRF52832能移植ARM的DSP嗎?
    發(fā)表于 10-16 07:51

    Using the Serial Port on the M

    Using the Serial Port on the MAXQ610 Microcontroller Abstract: The MAXQ610 microcontroller
    發(fā)表于 08-13 12:05 ?1420次閱讀

    NRF905工作模式

    NRF905工作模式NRF905工作模式NRF905工作模式NRF905工作模式NRF905工作模式NR
    發(fā)表于 11-19 15:24 ?10次下載

    nrf51822_PRO_SCH_20141122

    nrf51822原理圖 nrf51822原理圖 nrf51822原理圖
    發(fā)表于 04-15 17:59 ?19次下載

    NRF24L01接收程序

    程序是NRF24L01接收程序 接收到字符顯示在OLED上面,包含文件非常簡單易懂適合入門學習
    發(fā)表于 06-14 15:29 ?5次下載

    nRF24L01和nRF905、nRF401及nRF9E5單片無線收發(fā)芯片的資料合集

    本文檔的主要內(nèi)容詳細介紹的是nRF24L01和nRF905、nRF401及nRF9E5嵌入微處理器單片無線收發(fā)芯片的資料合集免費下載包括了:Nordic中文選型手冊,
    發(fā)表于 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單片無線收發(fā)芯片的資料合集

    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?
    發(fā)表于 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 語音。需要元件一個功放模塊,麥克風模塊 按鈕
    發(fā)表于 12-17 18:08 ?22次下載
    Mixly arduino <b class='flag-5'>nrf</b>2401+對講機制作

    NRF52840與NRF52832的性能區(qū)別

    藍牙版本的不斷更新,大部分客戶慢慢都向往著藍牙5.0。當然對于前不久NORDIC剛出的藍牙5.0 nrf52840,很多人都還不是很了解。NRF52840可以說是NRF52832的超強升級版,雖然
    的頭像 發(fā)表于 02-24 15:02 ?5088次閱讀

    基于nRF52的nRF52840 SoC

    方案介紹nRF52840 SoC 是 nRF52 系列中最先進的成員。它可以應對需要協(xié)議并發(fā)性和豐富多樣的外圍設備和功能的復雜應用程序的挑戰(zhàn)。它為閃存和 RAM 提供了充足的內(nèi)存可用性,這是此類要求
    發(fā)表于 12-26 15:48 ?3次下載

    NRF51822和NRF52832的主要區(qū)別

    對于NRF51822和NRF52832的選擇性相信大家也是非常困惑的,哪個性價比高?下面為大家講下NRF51822和NRF52832的一個區(qū)別,讓大家能夠更好的快速選型加快研發(fā)產(chǎn)品進度
    的頭像 發(fā)表于 02-20 15:24 ?1310次閱讀