本帖最后由 百_草_园 于 2025-2-17 10:39 编辑

FR3068E-C是富 芮 坤一款接 口 丰 富 的 高 性 能 双 核 蓝 牙MCU,具有如下主要特点
• RF:BT5.3 BLE+BR/EDR协议认证
• MCU core:MC1(Cortex-M33) 156MHz+32bit MCU 48MHz
• 大容量Memory、丰富的外设接口、Security内置硬件加密单元内置、硬件加速器
• 蓝牙连接性能:支持BLE/BT蓝牙网关功能,支持20条以上BLE连接

      本次试用这个开发板主要是被其高主频、丰富接口和蓝牙多连接这几个方面吸引,并且支持LVGL GUI系统,可以拓展很多之前无法覆盖的场景,并且可以将MCU和蓝牙芯片合二为一,简化系统和降低成本。
       FR3068E-C开发部的总体结构如下:
image.png


image.png




开发板的资料文档和之前接触过的富芮坤芯片资料风格一致,全面,逻辑性强,条理清晰,对开发者非常友好。
image.png
编译环境需要安装 MDK5.36 以上版本,并且需要安装python用于烧录文件生成脚本的运行,具体在“FR306x系统编程说明V1.0.pdf”文档中有详细说明。







本篇主要记录验证调试蓝牙主从一体多连接功能开发调试过程,实现在FR3068E-C实现蓝牙主从机共存,通过蓝牙连接的多个设备控制同一个LED的功能。
具体结构如下:
   FR3068E-C作为蓝牙主机,主动扫描并连接另一个FR8016从机设备,FR8016上按键按下时通过蓝牙给FR3068E-C发送控制命令,控制LED的输出状态翻转,相当于一个无线开关的作用;
   FR3068E-C作为蓝牙从机,可被手机连接,接收手机发来的数据和命令,也可控制控制LED的输出状态翻转;
   FR3068E-C开发板上的按键也可以控制控制LED的输出状态翻转,最终实现三端都可以控制LED的效果。

   理论上可以连接更多设备,本次先验证同时连接一个从机和一个主机的效果。
image.png





代码基于application\ble_simple_central例程基础上开发,添加主从一体功能、按键检测和主从蓝牙连接收发数据的处理。


蓝牙主机和从机功能初始化:
<pre><font size="4">void app_ble_master_init(void)
  • {
  •     printf("app_ble_init\r\n");
  •    
  •     /* set GAP event callback*/
  •     gap_set_cb_func(gap_callback);

  •     /* set security param */
  •     struct gap_security_param smp_param;
  •     smp_param.mitm = true;
  •     smp_param.secure_connection = false;
  •     smp_param.bond = true;
  •     smp_param.rsp_mode = ENABLE_AUTO_RSP;
  •     smp_param.oob_used = GAP_OOB_AUTH_DATA_NOT_PRESENT;
  •     smp_param.io_cap = GAP_IO_CAP_NO_INPUT_NO_OUTPUT;
  •     gap_security_param_init(&smp_param);

  •     /* add client profile, The GAP callback event is GATT_EVT_PROFILE_ADDED*/
  •     app_ble_add_client();
  • }

  • void app_ble_slave_init(void)
  • {
  •     printf("app_ble_init\r\n");
  •    
  •     /* set GAP event callback*/
  •     gap_set_cb_func(gap_callback);

  •     /* set security param */
  •     struct gap_security_param smp_param;
  •     smp_param.mitm = false;
  •     smp_param.secure_connection = false;
  •     smp_param.bond = true;
  •     smp_param.rsp_mode = ENABLE_AUTO_RSP;
  •     smp_param.oob_used = GAP_OOB_AUTH_DATA_NOT_PRESENT;
  •     smp_param.io_cap = GAP_IO_CAP_NO_INPUT_NO_OUTPUT;

  •     gap_security_param_init(&smp_param);

  •     /* add service profile, The GAP callback event is GATT_EVT_PROFILE_ADDED*/
  •     app_ble_add_service();
  •     // ota_gatt_add_service();
  • }</font></pre>
  • 复制代码



    主从机对象分别通过gatt_add_client()和gatt gatt_add_service()添加到gatt层,每个添加的对象中有gatt_msg_handler回调函数来处理对应的gatt事件,比如接收到对属性的读写等。
    主从机gap事件,比如CONNECT和DISCONNECT事件、扫描和连接结果等事件,都在gap_callback()中处理。






    开发板上的按键为PMU_GPIO,本项目中使用KEY1即PP0引脚作为控制按键,通过中断方式检测按键动作,每按一下按键翻转LED的输出状态;
    <pre><font size="4">int app_led_control_init()
  • {
  •     GPIO_InitTypeDef GPIO_Handle;

  •     //按键输入IO:PP0
  •     // pmu_gpio_int_init(PMU_PIN_0, PMU_GPIO_PULL_UP, 1);
  •     pmu_port_wakeup_func_set(PMU_PIN_0|PMU_PIN_2|PMU_PIN_3);
  •     pmu_enable_isr(PMU_GPIO_PMU_INT_MSK_BIT);
  •     NVIC_SetPriority(PMU_IRQn, 4);
  •     NVIC_EnableIRQ(PMU_IRQn);
  •    
  •     //LED输出IO:PD14,PD15
  •     GPIO_Handle.Pin  = GPIO_PIN_14|GPIO_PIN_15;
  •     GPIO_Handle.Mode = GPIO_MODE_OUTPUT_PP;
  •     GPIO_Handle.Pull = GPIO_PULLUP;
  •     gpio_init(GPIOD, &GPIO_Handle);
  •     gpio_write_pin(GPIOD, GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_CLEAR);
  • }</font></pre><pre><font size="4">
  • </font></pre><pre><font size="4">void PMU_GPIO_PMU_IRQHandler(void)
  • {
  •     uint16_t data = ool_read16(PMU_REG_PIN_DATA);
  •     uint16_t result = ool_read16(PMU_REG_PIN_XOR_RESULT);
  •      
  •     /* update last value with latest data */
  •     ool_write16(PMU_REG_PIN_LAST_V, data);
  •     /* clear last XOR result */
  •     ool_write16(PMU_REG_PIN_XOR_CLR, result);

  •     // printf("PMU IO: 0x%04x, 0x%04x\r\n", data, result);

  •     if (result & PMU_PIN_0) {
  •         if (!(data & PMU_PIN_0)) {
  •             printf("Button Key1 press!\r\n");
  •             control_led_output_reversal();
  •         }
  •     }
  •     else if (result & PMU_PIN_2) {
  •         printf("Button Key2 press!\r\n");
  •     }
  •     else if (result & PMU_PIN_3) {
  •         printf("Button Key3 press!\r\n");
  •     }
  • }</font></pre>
  • 复制代码


    详细代码见附件\examples\application\ble_simple_central。


    运行效果如下:




    从芯片资料中看,FR3068E-C可以支持多达20个的多连接,目前手上没有太多设备,以后有机会再做多连接方面进一步的开发,进而实现作为蓝牙网关和10个甚至20个设备的同时连接,应用在更多的场景中。




    FR3068E-C sdk__202411 examples_applicationble_simple_central.zip (3.38 MB, 下载次数: 6)
    全部回复 0
    暂无评论,快来抢沙发吧