NRF52840 USB串口例程

打开nRF5_SDK_17.0.2_d674dde目录下examples\peripheral\usbd_ble_uart\pca10056\s140\arm5_no_packs中的工程

  • 增加1HZ定时器
#define TICK_1HZ_INTERVAL     32768                                  /*1HZ 定时器 */
APP_TIMER_DEF(m_1hz_id); 

static nrf_atomic_u32_t m_1hz_evt;
static void tick_1hz_timeout_handler(void * p_context)
{
    UNUSED_PARAMETER(p_context);
	  UNUSED_RETURN_VALUE(nrf_atomic_u32_or(&m_1hz_evt, 1));
}


/** @brief Function for initializing the timer module. */
static void timers_init(void)
{
    ret_code_t err_code = app_timer_init();
    APP_ERROR_CHECK(err_code);
    err_code = app_timer_create(&m_1hz_id,
                                APP_TIMER_MODE_REPEATED,
                                tick_1hz_timeout_handler);
	 APP_ERROR_CHECK(err_code);
	
   err_code = app_timer_start(m_1hz_id, TICK_1HZ_INTERVAL, NULL);
   APP_ERROR_CHECK(err_code);
}

-

 - 在main主循环中读取1hz事件,并发送串口数据

```c
static uint32_t tick_cnt;
/** @brief Application main function. */
int main(void)
{
    ret_code_t ret;
    static const app_usbd_config_t usbd_config = {
        .ev_state_proc = usbd_user_ev_handler
    };
    // Initialize.
    log_init();
    timers_init();

 

    app_usbd_serial_num_generate();

    ret = nrf_drv_clock_init();
    APP_ERROR_CHECK(ret);

    NRF_LOG_INFO("USBD BLE UART example started.");

    ret = app_usbd_init(&usbd_config);
    APP_ERROR_CHECK(ret);

    app_usbd_class_inst_t const * class_cdc_acm = app_usbd_cdc_acm_class_inst_get(&m_app_cdc_acm);
    ret = app_usbd_class_append(class_cdc_acm);
    APP_ERROR_CHECK(ret);

    ble_stack_init();
    gap_params_init();
    gatt_init();
    services_init();
    advertising_init();
    conn_params_init();

    // Start execution.
    advertising_start();

    ret = app_usbd_power_events_enable();
    APP_ERROR_CHECK(ret);

    // Enter main loop.
    for (;;)
    {
        while (app_usbd_event_queue_process())
        {
            /* Nothing to do */
        }
		 uint32_t events =  nrf_atomic_u32_fetch_store(&m_1hz_evt, 0);
        if (events)
        {				
					if(m_uart_connected)
					{
						tick_cnt++;
						char buf[32];
						
						 uint32_t length = sprintf(buf,"Tick %d\n",tick_cnt);
						 memcpy(m_nus_data_array,buf,length);
						
						  ret_code_t ret = app_usbd_cdc_acm_write(&m_app_cdc_acm,
                                                m_nus_data_array,
                                                length);
						 NRF_LOG_INFO("tick_cnt %d",tick_cnt);
							if(ret != NRF_SUCCESS)
							{
									NRF_LOG_INFO("CDC ACM unavailable, data received: %s", m_nus_data_array);
							}
					}
        }
        idle_state_handle();
    }
}
  • 在cdc_acm_user_ev_handler函数APP_USBD_CDC_ACM_USER_EVT_RX_DONE事件中读取USB串口数据
 case APP_USBD_CDC_ACM_USER_EVT_RX_DONE:
        {
            ret_code_t ret;
            uint8_t index = 1;
          
            do
            {
                

                /*Get amount of data transferred*/
                size_t size = app_usbd_cdc_acm_rx_size(p_cdc_acm);

                /* Fetch data until internal buffer is empty */
                ret = app_usbd_cdc_acm_read(&m_app_cdc_acm,
                                            &m_cdc_data_array[index],
                                            1);
                if (ret == NRF_SUCCESS)
                {
                    index++;
                }
            }
            while (ret == NRF_SUCCESS);
						
						NRF_LOG_HEXDUMP_INFO(m_cdc_data_array,index);
				
            break;
        }
  • 烧录程序及S140协议栈到NRF52840开发板,连接USB到PC端,win10会自动安装驱动,也可以手动安装nRF5_SDK_17.0.2_d674dde\examples\usb_drivers目录下的驱动,打开PC串口工具,选择115200波特率,及DTR选中,然后打开串口,串口工具会每秒收到NRF5840发来的TICK数据,PC发送数据,RTT VIEW会打印接收到的数据
    在这里插入图片描述

android USB串口例程下载链接

USB串口安卓例程

  • 下载后需要修改USB Vendor ID和Product ID
    以下是NRF52840例程sdk_config.h中定义的USB Vendor ID和Product ID
// <s> APP_USBD_VID - Vendor ID.

// <i> Note: This value is not editable in Configuration Wizard.
// <i> Vendor ID ordered from USB IF: http://www.usb.org/developers/vendor/
#ifndef APP_USBD_VID
#define APP_USBD_VID 0x1915
#endif

// <s> APP_USBD_PID - Product ID.

// <i> Note: This value is not editable in Configuration Wizard.
// <i> Selected Product ID
#ifndef APP_USBD_PID
#define APP_USBD_PID 0x521A
#endif

  • 打开下载后的安卓工程,修改CustomProber.java中的USB Vendor ID和Product ID
    在这里插入图片描述
  • 安装APP后连接到NRF52840开发板,点击USB Devices
    在这里插入图片描述
  • 确定允许设备
    在这里插入图片描述
  • 选择波特率及Control Lines选中,连接设备,每秒会收到NRF52840发来的TICK
    在这里插入图片描述
  • 输入12345678点击发送,NRF52840接收到数据通过RTT VIEW打印
    在这里插入图片描述

完整NRF52840及安卓例程下载链接

点击下载

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
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来同时驱动两个串口了。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风雨依依

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值