zmwa 发表于 2023-11-29 22:07

N32WB031 FreeRTOS+BLE例程

SDK包中没有找到 freeRTOS和BLE结合的工程呢?
是一起用不了,还是没有做这个例程呢?
RT-Thread已经移植好了,就差freeRTOS+BLE的例子做参考,组合起来用呢


527757056 发表于 2023-12-4 13:35

这里有个你可以参考看看

toothbruth 发表于 2023-12-5 13:44

请问可以分享一下RT-Thread+BLE的例程吗

wang6623 发表于 2024-8-28 12:46

FreeRTOS 和 BLE 是可以一起使用的,它们是两种不同的功能,FreeRTOS 提供实时操作系统功能,而 BLE 提供无线通信功能。

shenxiaolin 发表于 2024-8-30 14:34

可依照以下其他家的自己移植

好几遍vh 发表于 2024-9-30 15:07

freeRTOS和BLE结合的工程呢

申小林一号 发表于 2024-10-30 21:03

就很牛X

huangxz 发表于 2025-6-5 09:33

目前也用到这个需求,有这个吗?我现在用的是threadx, 系统运行正常时候就识别不到蓝牙
#include "main.h"
#include "n32wb452_ble_api.h"
#include "interface.h"
#include "eif_iom.h"
#include "ke_event.h"
#include "app.h"
#include "app_task.h"
#include "user.h"
#include "log.h"
#include "ble_monitor.h"

#define THREAD1_PRIO 20u                                /*线程优先级*/
#define THREAD1_STK_SIZE 256u                /*堆栈大小*/

static TX_THREAD APP1_TCB_LED;                                                                                /*线程控制块*/
static uint8_t APP1_STK_LED;                /*线程堆栈*/

static TX_THREAD APP_TCB_BLE;                                                                                /*线程控制块*/
static uint8_t APP_STK_BLE;                /*线程堆栈*/


void APP1_LED(ULONG thread_input)                                /*LED线程*/
{
    bool b = false;


    printf("hello\n");

    while(1)
    {
      GPIO_WriteBit(GPIOA,GPIO_PIN_9, b);
      b = !b;
      tx_thread_sleep(1000);
    }
}

#if   defined(_IAR_ARM)
const char ble_addr[] = "11:22:33:db:30:A0";
#ifdef WCHAR16
const char ble_name[] = "WB452IH11";
#else
const char ble_name[] = "WB452IW11";
#endif

#elifdefined(N32WB452XL_EVB)
const char ble_addr[] = "33:22:33:db:30:A0";
#ifdef WCHAR16
const char ble_name[] = "WB452EH33";
#else
const char ble_name[] = "WB452EW33";
#endif

#else
const char ble_addr[] = "55:22:33:db:30:A0";
#ifdef WCHAR16
const char ble_name[] = "WB452SH55";
#else
const char ble_name[] = "WB452SW55";
#endif
#endif

bt_attr_param bt_init = {0};
uint8_t bt_packet_buf;
uint8_t bt_data_buf;
uint8_t flag_bt_enter_sleep   = 0;
uint32_t system_10s_cnt         = 0;
uint16_t bt_connect_flag = 0;
uint16_t bt_data_rxlen= 0;
uint8_t bt_total_rxlen = 0;
uint16_t bt_data_finish_flag= 0;
__IO uint8_t flag_bt_irq = 0;

TX_EVENT_FLAGS_GROUPble_EventGroup;


/**
* @briefInserts a delay time.
* @param count specifies the delay time length.
*/
void EXTI15_10_IRQHandler(void)
{
    if (EXTI_GetITStatus(EXTI_LINE14) != RESET)
    {
#if 1
      //MCU在STOP2模式时
      if (flag_bt_enter_sleep == 1)
      {
            flag_bt_irq = 1;
      }
      else
            bt_handler();
#endif
   //   tx_event_flags_set(&ble_EventGroup, BIT_1, TX_OR);
    }

    EXTI_ClrITPendBit(EXTI_LINE14);
}

//注意!
//注意!
//注意!
//回调函数中,不可使用阻塞式应用,执行时间应尽可能短。否则会影响BLE传输效率,甚至传输出错;
void bt_event_callback_func(bt_event_enum event, uint8_t* data, uint32_t size, uint32_t character_uuid)
{
    uint16_t length;
//    static uint16_t rvc_total = 0;

    switch (event)
    {
    case BT_EVENT_VERSION:
      log_debug("ble version:\r\n");
      break;

    case BT_EVENT_CONNECTED:
      system_10s_cnt = 0;
//            TIM_Enable(TIM6, DISABLE);//有蓝牙连接时,不允许进入低功耗计时
      log_debug("ble connect:\r\n");
      bt_connect_flag = 1;
      gBT_STS = BT_CONNECTED;
      break;

    case BT_EVENT_DISCONNECTD:
      system_10s_cnt = 0;
//            TIM_Enable(TIM6, ENABLE);   //有蓝牙断开连接时,重新开始进入低功耗计时
      log_debug("ble disconnect:\r\n");
      bt_connect_flag= 0;
      bt_data_rxlen   = 0;
      bt_total_rxlen = 0;
      bt_data_finish_flag = 0;
      gBT_STS = BT_DISCONNECTED;
      break;

    case BT_EVENT_RCV_DATA:
      length = bt_rcv_data(bt_packet_buf, size, character_uuid);

      if (length)
      {
            if(bt_total_rxlen == 0)
            {
                bt_data_rxlen = 0;
                bt_total_rxlen = bt_packet_buf + (bt_packet_buf<<8) + 2;
            }
            memcpy(bt_data_buf+bt_data_rxlen, bt_packet_buf, length);
            bt_data_rxlen += length;
            if(bt_data_rxlen >= bt_total_rxlen)
            {
                bt_data_finish_flag = 1;
            }
      }
      else
      {
            log_debug("rcv data err,\r\n");
      }
      break;

    default:
      break;
    }
}

void ble_start(void)
{
    int ret;

    uint8_t ver;

    ulog_init(921600);


    memcpy(bt_init.device_name, ble_name, MIN(strlen(ble_name), sizeof(bt_init.device_name)));
    memcpy(bt_init.device_addr, ble_addr, MIN(strlen(ble_addr), sizeof(bt_init.device_addr)));

    bt_init.service.svc_uuid                = SERVICE_UUID;
    bt_init.service.character.uuid       = USER_IDX_WRITE_NOTIFY_CHAR;
    bt_init.service.character.permission = BT_WRITE_PERM | BT_NTF_PERM;

    ret = bt_ware_init(&bt_init, (bt_event_callback_handler_t)bt_event_callback_func);
    if (ret != BT_RET_SUCCESS)
    {
      log_debug("bt init failed.\r\n");
    }
    else
    {
      log_debug("bt init ok.\r\n");
    }

    BT_get_version(ver);
    printf("ble driver version %s\r\n", ver);

    TIM6_init();

    hlt_rtc_init();
}


void APP_BLE(ULONG thread_input)
{
    UINT status;
    ULONG actual_events;
    LED_Initialize(GPIOB, GPIO_PIN_7);
   
    tx_event_flags_create(&ble_EventGroup, "EventGroupName");   

    while (1)
    {
      bt_run_thread();

      status = tx_event_flags_get(&ble_EventGroup,   /* 事件标志控制块 */
                                    BIT_ALL,         /* 等待标志 */
                                    TX_OR_CLEAR,   /* 等待任意bit满足即可 */
                                    &actual_events,/* 获取实际值 */
                                    TX_WAIT_FOREVER);/* 永久等待 */

      if(status == TX_SUCCESS)
      {
            switch (actual_events)
            {
            case BIT_1:
                break;
            default:
                break;
            }
      }
#if 0
      if (wakeup_flag == 1)
      {
            wakeup_flag = 0;
            ble_status_monitor();
//            ble_monitor_wait(SystemCoreClock/100);
      }

      flag_bt_enter_sleep = 1;
      if((stop2_flag == 1) && (ke_state_get(TASK_APP) != APPM_CONNECTED))
      {
            stop2_flag = 0;
            if(mainboard_enter_stop2())
            {
                if(wakeup_flag == 1)
                {
                  stop2_flag = 1;
                }

            }

            mainboard_exit_stop2();
      }
      else
      {
            ble_monitor_wait(SystemCoreClock/100);
      }


      if(flag_bt_irq)
      {
            flag_bt_irq = 0;
            bt_handler();
      }

      flag_bt_enter_sleep = 0;

      //此部分为回环测试, 在蓝牙回调函数接收完成一帧数据后, MCU往测试APP端发送所接收到的数据
      if(bt_data_finish_flag == 1)
      {
            bt_snd_data(bt_data_buf, bt_total_rxlen, USER_IDX_WRITE_NOTIFY_VAL);
            bt_total_rxlen   = 0;
            bt_data_rxlen = 0;
            bt_data_finish_flag = 0;
      }
      tx_thread_sleep(100);

      LED3_BLINK();
#endif
    }
}

voidtx_application_define(void *first_unused_memory)
{

    tx_thread_create(&APP1_TCB_LED,                                                                /*线程控制块*/
                     "APP1_LED",                                                                        /*线程名*/
                     APP1_LED,                                                                                /*启动线程函数地址*/
                     0,                                                                                                        /*传递给线程的参数*/
                     &APP1_STK_LED,                                                /*堆栈基地址*/
                     THREAD1_STK_SIZE,                                                /*堆栈大小*/
                     THREAD1_PRIO,                                                                /*线程优先级*/
                     3,                                                                                                        /*线程抢占阀值*/
                     TX_NO_TIME_SLICE,                                                /*不开启时间片*/
                     TX_AUTO_START);                                                        /*任务创建后立即启动*/

    tx_thread_create(&APP_TCB_BLE,                                                                /*线程控制块*/
                     "APP_BLE",                                                                        /*线程名*/
                     APP_BLE,                                                                                /*启动线程函数地址*/
                     0,                                                                                                        /*传递给线程的参数*/
                     &APP_STK_BLE,                                                /*堆栈基地址*/
                     THREAD1_STK_SIZE,                                                /*堆栈大小*/
                     THREAD1_PRIO,                                                                /*线程优先级*/
                     3,                                                                                                        /*线程抢占阀值*/
                     TX_NO_TIME_SLICE,                                                /*不开启时间片*/
                     TX_AUTO_START);                                                        /*任务创建后立即启动*/
}



latera 发表于 2025-6-7 11:04

好像真没有
页: [1]
查看完整版本: N32WB031 FreeRTOS+BLE例程