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ù)。
-
封裝
+關注
關注
126文章
7901瀏覽量
142965 -
中斷
+關注
關注
5文章
898瀏覽量
41502 -
串口
+關注
關注
14文章
1554瀏覽量
76522 -
dma
+關注
關注
3文章
561瀏覽量
100587
發(fā)布評論請先 登錄
相關推薦
評論