[N32WBxxx] N32WB031 FreeRTOS+BLE例程

[复制链接]
2172|9
 楼主| zmwa 发表于 2023-11-29 22:07 | 显示全部楼层 |阅读模式
SDK包中没有找到 freeRTOS和BLE结合的工程呢?
是一起用不了,还是没有做这个例程呢?
RT-Thread已经移植好了,就差freeRTOS+BLE的例子做参考,组合起来用呢


527757056 发表于 2023-12-4 13:35 | 显示全部楼层
这里有个你可以参考看看

rtdss_FreeRTOS-v1.3.zip

65.22 KB, 下载次数: 104

评论

这里用到了RESERVED_IRQHandler,请教一下,这个中断是在哪里触发的?  发表于 2024-5-15 18:29
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, 系统运行正常时候就识别不到蓝牙
  1. #include "main.h"
  2. #include "n32wb452_ble_api.h"
  3. #include "interface.h"
  4. #include "eif_iom.h"
  5. #include "ke_event.h"
  6. #include "app.h"
  7. #include "app_task.h"
  8. #include "user.h"
  9. #include "log.h"
  10. #include "ble_monitor.h"

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

  13. static TX_THREAD APP1_TCB_LED;                                                                                /*线程控制块*/
  14. static uint8_t APP1_STK_LED[THREAD1_STK_SIZE];                /*线程堆栈*/

  15. static TX_THREAD APP_TCB_BLE;                                                                                /*线程控制块*/
  16. static uint8_t APP_STK_BLE[THREAD1_STK_SIZE];                /*线程堆栈*/


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


  20.     printf("hello\n");

  21.     while(1)
  22.     {
  23.         GPIO_WriteBit(GPIOA,GPIO_PIN_9, b);
  24.         b = !b;
  25.         tx_thread_sleep(1000);
  26.     }
  27. }

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

  35. #elif  defined(N32WB452XL_EVB)
  36. const char ble_addr[] = "33:22:33:db:30:A0";
  37. #ifdef WCHAR16
  38. const char ble_name[] = "WB452EH33";
  39. #else
  40. const char ble_name[] = "WB452EW33";
  41. #endif

  42. #else
  43. const char ble_addr[] = "55:22:33:db:30:A0";
  44. #ifdef WCHAR16
  45. const char ble_name[] = "WB452SH55";
  46. #else
  47. const char ble_name[] = "WB452SW55";
  48. #endif
  49. #endif

  50. bt_attr_param bt_init = {0};
  51. uint8_t bt_packet_buf[256];
  52. uint8_t bt_data_buf[1024];
  53. uint8_t flag_bt_enter_sleep     = 0;
  54. uint32_t system_10s_cnt         = 0;
  55. uint16_t bt_connect_flag = 0;
  56. uint16_t bt_data_rxlen= 0;
  57. uint8_t bt_total_rxlen = 0;
  58. uint16_t bt_data_finish_flag= 0;
  59. __IO uint8_t flag_bt_irq = 0;

  60. TX_EVENT_FLAGS_GROUP  ble_EventGroup;


  61. /**
  62. * [url=home.php?mod=space&uid=247401]@brief[/url]  Inserts a delay time.
  63. * @param count specifies the delay time length.
  64. */
  65. void EXTI15_10_IRQHandler(void)
  66. {
  67.     if (EXTI_GetITStatus(EXTI_LINE14) != RESET)
  68.     {
  69. #if 1
  70.         //MCU在STOP2模式时
  71.         if (flag_bt_enter_sleep == 1)
  72.         {
  73.             flag_bt_irq = 1;
  74.         }
  75.         else
  76.             bt_handler();
  77. #endif
  78.    //     tx_event_flags_set(&ble_EventGroup, BIT_1, TX_OR);
  79.     }

  80.     EXTI_ClrITPendBit(EXTI_LINE14);
  81. }

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

  90.     switch (event)
  91.     {
  92.     case BT_EVENT_VERSION:
  93.         log_debug("ble version:\r\n");
  94.         break;

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

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

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

  114.         if (length)
  115.         {
  116.             if(bt_total_rxlen == 0)
  117.             {
  118.                 bt_data_rxlen = 0;
  119.                 bt_total_rxlen = bt_packet_buf[0] + (bt_packet_buf[1]<<8) + 2;
  120.             }
  121.             memcpy(bt_data_buf+bt_data_rxlen, bt_packet_buf, length);
  122.             bt_data_rxlen += length;
  123.             if(bt_data_rxlen >= bt_total_rxlen)
  124.             {
  125.                 bt_data_finish_flag = 1;
  126.             }
  127.         }
  128.         else
  129.         {
  130.             log_debug("rcv data err,\r\n");
  131.         }
  132.         break;

  133.     default:
  134.         break;
  135.     }
  136. }

  137. void ble_start(void)
  138. {
  139.     int ret;

  140.     uint8_t ver[10];

  141.     ulog_init(921600);


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

  144.     bt_init.service[0].svc_uuid                = SERVICE_UUID;
  145.     bt_init.service[0].character[0].uuid       = USER_IDX_WRITE_NOTIFY_CHAR;
  146.     bt_init.service[0].character[0].permission = BT_WRITE_PERM | BT_NTF_PERM;

  147.     ret = bt_ware_init(&bt_init, (bt_event_callback_handler_t)bt_event_callback_func);
  148.     if (ret != BT_RET_SUCCESS)
  149.     {
  150.         log_debug("bt init failed.\r\n");
  151.     }
  152.     else
  153.     {
  154.         log_debug("bt init ok.\r\n");
  155.     }

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

  158.     TIM6_init();

  159.     hlt_rtc_init();
  160. }


  161. void APP_BLE(ULONG thread_input)
  162. {
  163.     UINT status;
  164.     ULONG actual_events;
  165.     LED_Initialize(GPIOB, GPIO_PIN_7);
  166.    
  167.     tx_event_flags_create(&ble_EventGroup, "EventGroupName");   

  168.     while (1)
  169.     {
  170.         bt_run_thread();

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

  176.         if(status == TX_SUCCESS)
  177.         {
  178.             switch (actual_events)
  179.             {
  180.             case BIT_1:
  181.                 break;
  182.             default:
  183.                 break;
  184.             }
  185.         }
  186. #if 0
  187.         if (wakeup_flag == 1)
  188.         {
  189.             wakeup_flag = 0;
  190.             ble_status_monitor();
  191. //            ble_monitor_wait(SystemCoreClock/100);
  192.         }

  193.         flag_bt_enter_sleep = 1;
  194.         if((stop2_flag == 1) && (ke_state_get(TASK_APP) != APPM_CONNECTED))
  195.         {
  196.             stop2_flag = 0;
  197.             if(mainboard_enter_stop2())
  198.             {
  199.                 if(wakeup_flag == 1)
  200.                 {
  201.                     stop2_flag = 1;
  202.                 }

  203.             }

  204.             mainboard_exit_stop2();
  205.         }
  206.         else
  207.         {
  208.             ble_monitor_wait(SystemCoreClock/100);
  209.         }


  210.         if(flag_bt_irq)
  211.         {
  212.             flag_bt_irq = 0;
  213.             bt_handler();
  214.         }

  215.         flag_bt_enter_sleep = 0;

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

  225.         LED3_BLINK();
  226. #endif
  227.     }
  228. }

  229. void  tx_application_define(void *first_unused_memory)
  230. {

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

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



latera 发表于 2025-6-7 11:04 | 显示全部楼层
好像真没有
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部