- #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[THREAD1_STK_SIZE]; /*线程堆栈*/
- static TX_THREAD APP_TCB_BLE; /*线程控制块*/
- static uint8_t APP_STK_BLE[THREAD1_STK_SIZE]; /*线程堆栈*/
- 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
- #elif defined(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[256];
- uint8_t bt_data_buf[1024];
- 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_GROUP ble_EventGroup;
- /**
- * [url=home.php?mod=space&uid=247401]@brief[/url] Inserts 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[0] + (bt_packet_buf[1]<<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[10];
- 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[0].svc_uuid = SERVICE_UUID;
- bt_init.service[0].character[0].uuid = USER_IDX_WRITE_NOTIFY_CHAR;
- bt_init.service[0].character[0].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
- }
- }
- void tx_application_define(void *first_unused_memory)
- {
- tx_thread_create(&APP1_TCB_LED, /*线程控制块*/
- "APP1_LED", /*线程名*/
- APP1_LED, /*启动线程函数地址*/
- 0, /*传递给线程的参数*/
- &APP1_STK_LED[0], /*堆栈基地址*/
- 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[0], /*堆栈基地址*/
- THREAD1_STK_SIZE, /*堆栈大小*/
- THREAD1_PRIO, /*线程优先级*/
- 3, /*线程抢占阀值*/
- TX_NO_TIME_SLICE, /*不开启时间片*/
- TX_AUTO_START); /*任务创建后立即启动*/
- }