前言
本文主要记载笔者在使用nrf52832进行学习的时候遇到的问题记录下来方便自己日后进行复盘
由于笔者是学生尚无比较成熟的工程经验,如本文中出现了错误恳请各位斧正。
本文是基于nrfdsk例程进行学习
路径如下nRF5_SDK_17.1.0_ddde560\examples\peripheral\uart
一、UARTE
NRF52832学习笔记(12)——UART串口使用
有关UARTE基础外设的介绍,博主在这里就不赘述了,网上有很多帖子讲述基础的uarte,本文主要希望基于官方的例程搞明白官方库的原理。
二、官方示例函数拆解
对于nrf官方使用的app_uart库来进行串口的操控,我们拆解原理的时候只需要把握主体问题进行分析,也就是我们只需要明白在这套框架下最后是如何设置我们的串口,这套框架最后设置出来的硬件串口会有什么特点,然后了解大体的框架即可不必过于在意其中细节。
1.init调用关系
下面是基于源码的分析当我们可以从下图中的调用关系看出APP_UART_FIFO_INIT 最后会调用nrfx_uarte_init或者是nrfx_uart_init 这取决于宏NRF_DRV_UART_USE_UARTE和宏NRF_DRV_UART_USE_UART
2.m_event_handler
这里介绍的是我们event_handler这个函数指针是在什么地方被使用以及他是如何进行传递的进行讲解,从下图可以知道当我们调用宏APP_UART_FIFO_INIT他调用app_uart_init 里面有 m_event_handler = event_handler;所以我们用户自己书写的事件处理函数最后被绑定到了m_event_handler这个函数指针上并且在uart_event_handler中进行调用。
3.m_handlers
这里介绍的是我们的函数指针数组m_handlers 是如何绑定的从下图的调用关系中我们可以看见m_handlers其实最后绑定的是uart_event_handler所以当我们在uarte_evt_handler中调用m_handlers我们其实调用的函数是uart_event_handler
4.p_cb->handler
这里也是我们主要介绍一下这个绑定的流程具体的处理我们并不需要仔细研究我们不难发现以uarte为例子这个p_cb->handler最后其实是会被绑定成uarte_evt_handler
到此我们就解释清楚了最后比较重要的几个函数指针分别指向什么函数
m_event_handler ->uart_error_handle
m_handlers[inst_idx]->uart_event_handler
p_cb->handler = uarte_evt_handler;
我们来总体的理清楚这里的流程,也就是整个串口数据的过程,首先当我们接收到一个数据的时候如果触发了中断会进入到uart(e)_irq_handler进行统一处理然后调用uart_event_handler
这个函数会更根据当前发生的事件的区别例如说是串口接收完成还是发送完成来进行操作然后触发m_event_handler 这个函数进入用户注册到的事件处理句柄,例程中使用的是uart_error_handle
到这里我们就简单搞明白了app_uart库的数据流向原理,我们这里再重点提出一些问题。
由于app_uart库底层设计的问题他使用edma设置的maxcnt是1也就是每次dma最多只能传输一个字节有点类似于非空中断了,感觉有点太浪费看了其他大神的帖子貌似还有更好的方法后续博主找到了更好的方法会继续修改。