nrf52840蓝牙开发之Libuarte外设移植

        移植外设异步传输libuarte到ble_central/ble_app_uart_c的例程里面的,也是蓝牙做主设备时的模板例程,不移植真不知道这么麻烦,并且问题千奇百怪,为了未来的程序员大佬在进阶的时候少掉几根头发,我经过一天多的时间终于在Nordic大佬的帮助下成功移植,并且这个Libuarte传输1个字节的时间比ble_app_uart_c例程里面的1个字节1个字节存放到tx fifo里面再发送出去节省了1个bit(8us)的时间,而且这个串口例程有1个非常非常大的缺陷就是,如果你传输的数据很大,比如一张图片的照片,当在输入输出波特率一致的情况下就会出现tx fifo满的情况,就会报错,并且传输每个字节的间隔不稳定,可能大可能小,并且在传输10个Bit(1起始、8数据、1停止位)之后还存在8us的间隔有时候会170us(在数据大的情况下);

当然,从解决方案上面有以下几种:

1.硬流控(这个方案很可靠,很安全,但是主要看你的设备是否把该引脚接出来)

2.在因为tx fifo溢出报错的情况下,可以重新尝试放入到fifo,达到一定次数如果还没放入fifo成功,就再进行丢数据处理

3.用软流控,需要输入输出确定好交互协议

4.如果有2个串口U1和U2,接收数据的串口U2和从外部传输进来数据的设备U3都设置成2个stop bit,同时输出的串口U1设置成1个bit位置,那么在传输数据量不是特别大(如>30000字节)的情况下可使用这个解决方案

5.如果输入端的传输速率不是特别特别块的话,可以采用Nordic的外设libuarte,这个方案非常好,传输数据间隔很稳定,传输10个bit的时间正好86us,很快也很准。

我在移植过程中,遇到的问题有以下:

1.由于协议栈默认使用的是rtc0,所以移植的时候需要改变libuarte的使用接口,改成使用RTC2,还有就是libuarte的timer0也被占用了,所需要libuarte需要使用其他的timer,我改成的是timer1,在sdk_config.h里面也需要做相应的改动

#define  NRFX_RTC_ENABLED  1

#define NRFX_RTC0_ENABLED  0

#define NRFX_RTC1_ENABLED  0

#define NRFX_RTC2_ENABLED  1

#define RTC_ENABLED 1

#ifndef RTC0_ENABLED
#define RTC0_ENABLED 0
#endif

// <q> RTC1_ENABLED  - Enable RTC1 instance
#ifndef RTC1_ENABLED
#define RTC1_ENABLED 0
#endif
 
#ifndef RTC2_ENABLED
#define RTC2_ENABLED 1
#endif

#ifndef TIMER_ENABLED
#define TIMER_ENABLED 1
#endif

#ifndef TIMER0_ENABLED
#define TIMER0_ENABLED 0
#endif

// <q> TIMER1_ENABLED  - Enable TIMER1 instance
#ifndef TIMER1_ENABLED
#define TIMER1_ENABLED 1
#endif

// <q> TIMER2_ENABLED  - Enable TIMER2 instance
#ifndef TIMER2_ENABLED
#define TIMER2_ENABLED 0
#endif

// <q> TIMER3_ENABLED  - Enable TIMER3 instance
#ifndef TIMER3_ENABLED
#define TIMER3_ENABLED 0
#endif

// <q> TIMER4_ENABLED  - Enable TIMER4 instance
#ifndef TIMER4_ENABLED
#define TIMER4_ENABLED 0
#endif

#ifndef APP_TIMER_ENABLED
#define APP_TIMER_ENABLED 1
#endif

#ifndef NRFX_TIMER0_ENABLED
#define NRFX_TIMER0_ENABLED 0
#endif

// <q> NRFX_TIMER1_ENABLED  - Enable TIMER1 instance
#ifndef NRFX_TIMER1_ENABLED
#define NRFX_TIMER1_ENABLED 1
#endif

// <q> NRFX_TIMER2_ENABLED  - Enable TIMER2 instance
#ifndef NRFX_TIMER2_ENABLED
#define NRFX_TIMER2_ENABLED 0
#endif

// <q> NRFX_TIMER3_ENABLED  - Enable TIMER3 instance
#ifndef NRFX_TIMER3_ENABLED
#define NRFX_TIMER3_ENABLED 0
#endif

// <q> NRFX_TIMER4_ENABLED  - Enable TIMER4 instance
#ifndef NRFX_TIMER4_ENABLED
#define NRFX_TIMER4_ENABLED 0
#endif

#ifndef NRF_LIBUARTE_ASYNC_WITH_APP_TIMER
#define NRF_LIBUARTE_ASYNC_WITH_APP_TIMER 1
#endif

#ifndef NRF_LIBUARTE_DRV_HWFC_ENABLED
#define NRF_LIBUARTE_DRV_HWFC_ENABLED 0
#endif

// <q> NRF_LIBUARTE_DRV_UARTE0  - UARTE0 instance
#ifndef NRF_LIBUARTE_DRV_UARTE0
#define NRF_LIBUARTE_DRV_UARTE0 1
#endif

// <q> NRF_LIBUARTE_DRV_UARTE1  - UARTE1 instance
#ifndef NRF_LIBUARTE_DRV_UARTE1
#define NRF_LIBUARTE_DRV_UARTE1 0
#endif

除了sdk_config.h的改变还需要在main.c里面修改

NRF_LIBUARTE_ASYNC_DEFINE(libuarte, 0, 1, 2, NRF_LIBUARTE_PERIPHERAL_NOT_USED, 255, 3);

第三个参数和第四个参数分别代表使用的timer1和RTC2

libuarte串口初始化uart_init,源码里面的那个使用fifo的那个uart_init需要注释掉

static void uart_init(void)
{
		ret_code_t err_code;
    nrf_libuarte_async_config_t nrf_libuarte_async_config = {
            .tx_pin     = TX_PIN_NUMBER,
            .rx_pin     = RX_PIN_NUMBER,
            .baudrate   = NRF_UARTE_BAUDRATE_115200,
            .parity     = NRF_UARTE_PARITY_EXCLUDED,
            .hwfc       = NRF_UARTE_HWFC_DISABLED,
            .timeout_us = 100,
            .int_prio   = APP_IRQ_PRIORITY_LOW
    };		
	
		err_code = nrf_libuarte_async_init(&libuarte, &nrf_libuarte_async_config, uart_event_handler, (void *)&libuarte);
		APP_ERROR_CHECK(err_code);
		
		nrf_libuarte_async_enable(&libuarte);
		
		err_code = nrf_libuarte_async_tx(&libuarte, text, text_size);
    APP_ERROR_CHECK(err_code);
}

main函数里面的代码

int main(void)
{
    // Initialize.
    log_init();
    timer_init();
    uart_init();
    buttons_leds_init();
    db_discovery_init();
    power_management_init();
    ble_stack_init();
    gatt_init();
    nus_c_init();
    scan_init();

    // Start execution.
//    printf("BLE UART central example started.\r\n");
    NRF_LOG_INFO("BLE UART central example started.");
    scan_start();

    // Enter main loop.
    for (;;)
    {
        idle_state_handle();
    }
}

如果有需要源码的哥们可以私信我,我发你。

下载这些Nordic官方例程的网站链接:nRF5 SDK downloads - nordicsemi.com

我下载的是17.1.0的,我不太确定新版本是否更好,大家可以尝试一下

每天都在进步,各位加油!!!!!!

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: nRF52840是一款由Nordic Semiconductor(挪威北方半导体)推出的低功耗(Bluetooth Low Energy,BLE)芯片。nRF52840开发指南是为了帮助开发人员更好地了解和使用nRF52840芯片而编写的一份技术文档。 在nRF52840开发指南中,首先介绍了nRF52840芯片的概述,包括其主要特点和应用领域。然后详细介绍了nRF52840芯片的硬件设计,包括引脚功能、电源管理、时钟和无线电等方面的设计要点,帮助开发人员在设计电路板时更好地利用芯片的功能。 接着,nRF52840开发指南向开发人员介绍了nRF5软件开发套件(SDK),该套件提供了在nRF52840芯片上进行应用程序开发所需的软件工具和示例代码。文中详细介绍了如何安装和配置SDK,并给出了一些常见的应用程序开发示例。 在软件开发部分中,nRF52840开发指南还介绍了nRF52840的软件架构和支持的协议栈,如BLE协议栈和ANT协议栈。开发人员可以根据自己的需求选择合适的协议栈,并按照指南中给出的步骤进行相应的配置和开发工作。 最后,nRF52840开发指南还提供了一些在nRF52840开发中常见问题的解答,以及针对特定应用场景的案例分析和优化建议,帮助开发人员更好地理解和应用nRF52840芯片。 综上所述,nRF52840开发指南是一本重要的技术文档,对于想要了解和使用nRF52840芯片进行开发的人员来说,是一份不可或缺的参考资料。 ### 回答2: 要下载nRF52840开发指南,可以按照以下步骤进行操作。 首先,打开Nordic Semiconductor官方网站,找到nRF52840产品页面。在该页面中,可以找到各种与nRF52840相关的文档和指南。 在该页面上,找到“开发指南”的选项,并点击进入。在这个页面上,将提供nRF52840开发指南的下载链接。 点击下载链接,然后选择保存文件的位置。可以选择将文件保存到计算机的硬盘中,或者将其保存到移动存储设备,如USB闪存驱动器。 等待下载完成后,打开下载的文件。一般来说,nRF52840开发指南会以PDF格式提供,因此需要确保计算机上有能够阅读PDF文件的软件,如Adobe Acrobat Reader。 在打开的文件中,可以找到详细的nRF52840开发指南。该指南将包含关于nRF52840芯片的详细说明、硬件设计指南、软件开发指南、编程示例和应用案例等内容。 可以根据自己的需要,阅读和学习开发指南中提供的内容。这个指南将有助于理解和学习如何使用nRF52840开发板进行硬件和软件开发,以便于设计和构建自己的应用程序。 总而言之,要下载nRF52840开发指南,需要访问Nordic Semiconductor官方网站,找到nRF52840产品页面并下载相关的开发指南。这些指南将提供关于nRF52840芯片的详细信息和相关开发技术的指导。 ### 回答3: nrf52840开发指南是一本关于nRF52840低功耗多协议系统级芯片开发的书籍。该指南提供了有关硬件和软件开发、调试和优化的详细信息,旨在帮助开发者快速掌握nRF52840的应用。 首先,为了下载nrf52840开发指南,可以通过Nordic Semiconductor官方网站或其开发者社区获得。在网站或社区上,会提供资源下载的链接或指引。 下载nrf52840开发指南后,我们可以逐步了解如何开始使用nRF52840硬件。其中包括了nRF52840的硬件特性和规格,以及连接外部器件的方法。此外,该指南还介绍了如何使用Nordic Semiconductor的开发套件和软件工具,如nRF Connect,以开发和测试nRF52840的应用程序。 在软件开发方面,nrf52840开发指南详细介绍了nRF5 Software Development Kit(SDK)和nRF Command Line Tools的安装和使用。SDK提供了丰富的软件库和示例代码,以支持不同的应用场景。开发者可以学习如何使用SDK创建自己的应用程序,并了解如何将代码编译、烧录和调试到nRF52840芯片上。 此外,该指南还提供了有关nRF52840的低功耗特性和优化技巧的详细指导。开发者可以学习如何使用低功耗模式和功耗管理功能,以延长设备的电池寿命。 总之,nrf52840开发指南是一本全面而详细的指南,为开发者提供了学习和开发nRF52840芯片的必备工具和资源。通过下载并阅读该指南,开发者可以深入了解nRF52840的开发过程和技术细节,从而更好地应用该芯片开发出高性能低功耗的物联网设备。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

fighting787

一起加油,一起成功!

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

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

打赏作者

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

抵扣说明:

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

余额充值