N32WB031 FreeRTOS+BLE例程
SDK包中没有找到 freeRTOS和BLE结合的工程呢?是一起用不了,还是没有做这个例程呢?
RT-Thread已经移植好了,就差freeRTOS+BLE的例子做参考,组合起来用呢
这里有个你可以参考看看
请问可以分享一下RT-Thread+BLE的例程吗 FreeRTOS 和 BLE 是可以一起使用的,它们是两种不同的功能,FreeRTOS 提供实时操作系统功能,而 BLE 提供无线通信功能。 可依照以下其他家的自己移植 freeRTOS和BLE结合的工程呢 就很牛X 目前也用到这个需求,有这个吗?我现在用的是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); /*任务创建后立即启动*/
}
好像真没有
页:
[1]