52840串口

谷雨52832板子的串口代码
#define RX_PIN_NUMBER  8
#define TX_PIN_NUMBER  6
.rx_pin_no    = RX_PIN_NUMBER,
.tx_pin_no    = TX_PIN_NUMBER,
也就是P0.06---TX  P0.08---RX
对我们52840的板子来说这2个脚也是可以出来的!

外接传感器的地方 2个线可以对接USB串口!

硬件准备 -----------我是想做一个MCU--PC通过串口TXRX的案例

也就是连接这2根线

 

代码准备

先屏蔽硬定时器timer1的测试 因为谷雨的串口模型用到这个定时器

最后测试成功!如下图

 

现在分析代码

1----- UART_Init(APP_UartEvtHandle);   //初始化串口

这一句话就完成全部设定

 首先  uart_fifo_init();  uart_timer_init();

然后 管脚+115200

最后 nrf_drv_uart_init

还有最后关键的一句话   nrf_drv_uart_rx(&m_Uart, rxBuf,1);// RX NO.1 这和我以前编码一样的 这就是设定第一次接受一个字节放在哪里呢?就是放在这个1位的数组里面的

 

那么后面的话 就是消防数据以后再次接受下一个UART的数据

 

2---    UART_Write("Uart Test\r\n",strlen("Uart Test\r\n"));

这是主动TX一个数据

    nrf_drv_uart_tx(&m_Uart, (uint8_t const*)&tmp, 1); 

这样就把第一个数据发出去 那么后面的呢? 它是依靠上面的 一旦上面的TX完成 就会有完成事件 那么就会使得 nrf_drv_uart_tx_in_progress 为真!

后面的TX是在

//串口事件回调数据
static void uart_event_handler(nrf_drv_uart_event_t * p_event, void* p_context)
{
  switch (p_event->type)
  {
    case NRF_DRV_UART_EVT_TX_DONE:
      {
        uint8_t tmp;
        if (uart_data_get(&m_TxBuf,&tmp) == NRF_SUCCESS)
        {
            nrf_drv_uart_tx(&m_Uart, &tmp, 1);
            NRF_LOG_INFO("nrf_drv_uart_tx [%c]\r\n",tmp);
        }
 

3--如何完成我电脑TX啥板子返回啥的呢

前面描述过 只接受了一个 后面还需要连续接受

//串口事件回调数据
static void uart_event_handler(nrf_drv_uart_event_t * p_event, void* p_context)
{
  switch (p_event->type)
  {
    case NRF_DRV_UART_EVT_RX_DONE:
      {
        //关闭超时定时器
        nrf_drv_timer_disable(&m_TimerUart);
        if(UART_BUF_FREE_SAPCE_LEN(&m_RxBuf))  
        {
          nrf_drv_uart_rx(&m_Uart, rxBuf,1); //RX NO.234567----这就是继续接受下一个字节!
          //启动超时定时器
          nrf_drv_timer_enable(&m_TimerUart);
        }

      break;

TXRX是怎么联系的呢?电脑过来的是一股脑放FIFO放 也就是前面的联系接受 而发送时一股脑的读FIFO 有数据就TX出去 、

看后面的描述

 

和定时器怎么联系的呢?

 一旦接收到一个就启动定时器 然后滴滴答答开始计数 一旦在接受一个数据就停止定时器 就是割韭菜 每次韭菜长高一点就割掉 又长高一点又割掉

所谓张高就是RX以后定时器启动 

所谓割韭菜就是再RX一次就把定时器归零

所以没有新RX的话 就不会有人割韭菜 那就定时器一直++会超市的

void timer_uart_event_handler(nrf_timer_event_t event_type, void* p_context)
{
  switch (event_type)
  {
    case NRF_TIMER_EVENT_COMPARE0:
      //串口接收超时
      {
        uart_user_evt.evt_type = UART_EVT_RX_TIMEOUT;       
        uart_user_evt.status = UART_BUF_DATA_LEN(&m_RxBuf);
        if(m_uart_callback != NULL)
        {
          m_uart_callback(&uart_user_evt);
        }
        
      }
      break;

 

这个事件 在main死循环处理

    for (;;)
    {
        switch(uart_evt.evt_type)
        {
          case UART_EVT_RX_TIMEOUT:
          case UART_EVT_RX_OVERFLOW:
            len = UART_Read(Buf,uart_evt.status);
            UART_Write(Buf,len);      //从串口发出
            Buf[len] = 0;

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
nrf52840是一款功能强大的蓝牙低功耗芯片,具备多种特性,其中之一就是可以驱动多个串口。以下是关于如何使用nrf52840驱动两个串口的说明。 首先,nrf52840具有多个UART接口,每个UART接口都可以用作串口通信。UART是一种通用的异步串行通信协议,常用于与外部设备进行数据传输。nrf52840的UART接口支持多种通信模式和波特率设置,可以根据具体需求进行配置。 为了使用nrf52840的两个串口,我们可以按照以下步骤进行: 1. 确定使用哪两个UART接口作为串口。nrf52840通常具有多个UART接口可供选择,根据实际需要,选择两个适合的UART接口作为串口。 2. 根据选定的UART接口,进行引脚配置。每个UART接口需要与芯片的引脚进行连接,将其与外部设备连接起来。可以根据nrf52840的引脚映射表找到相应的引脚连接。 3. 通过编程配置UART接口。使用nrf52840的软件开发工具,如nRF5 SDK或nRF Connect SDK,在代码中配置两个UART接口的工作模式、数据传输参数等。这些配置可以包括波特率、数据位、停止位、校验等。 4. 在程序中通过API使用串口。一旦两个UART接口已经配置好,就可以通过API函数在程序中使用串口进行数据的收发。可以用用于发送和接收数据的API函数,如nrf_uart_tx和nrf_uart_rx等。 总结起来,nrf52840可以通过正确配置和使用多个UART接口来驱动两个串口。首先选择适合的UART接口,然后进行引脚配置,并通过编程设置每个UART接口的工作模式和参数。最后,在程序中使用相应的API函数来进行数据的收发。这样,我们就可以通过nrf52840来同时驱动两个串口了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值