From ae079c1fc5d990ba55714d4b3a51b19f96edaec4 Mon Sep 17 00:00:00 2001
From: WXK <287788329@qq.com>
Date: 星期四, 24 四月 2025 16:01:43 +0800
Subject: [PATCH] 改为中断来低电平触发发送当前扫描数据,3s内扫描不到的会退出,串口来55 AA 75 70 64 61 74 65,进入升级模式

---
 01_SDK/nimble/samples/bluetooth/ble_central_periph_ota/src/app_ble.c |  154 ++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 140 insertions(+), 14 deletions(-)

diff --git a/01_SDK/nimble/samples/bluetooth/ble_central_periph_ota/src/app_ble.c b/01_SDK/nimble/samples/bluetooth/ble_central_periph_ota/src/app_ble.c
index e56710d..e388883 100644
--- a/01_SDK/nimble/samples/bluetooth/ble_central_periph_ota/src/app_ble.c
+++ b/01_SDK/nimble/samples/bluetooth/ble_central_periph_ota/src/app_ble.c
@@ -14,7 +14,7 @@
 #include "pan_ble.h"
 #include "app.h"
 #include "app_log.h"
-
+#include "soc_api.h"
 static void app_ble_set_mac_addr(void)
 {
     /** set public address*/
@@ -38,7 +38,7 @@
 {
 #if CONFIG_BT_MAX_NUM_OF_PERIPHERAL
 	/* Adv */
-	app_ble_adv_start();
+//	app_ble_adv_start();
 #endif
 
 #if CONFIG_BT_MAX_NUM_OF_CENTRAL 
@@ -55,6 +55,7 @@
  */
 TimerHandle_t xTimerUser; 
 uint16_t timer;
+uint8_t shengji_flag;
 extern struct queue //结构体类型
 {
 uint8_t totalnum;//基站总数
@@ -67,6 +68,9 @@
 uint16_t u16id[anchor_max_num]; /*u16ID*/    
 }blequeue;
 uint8_t slave_send_buf[100];
+uint16_t shengji_time;
+uint8_t only_one;
+uint8_t send_flag;
 void Spi_Zubao_Send(void)
 {   
     if(blequeue.totalnum>10)
@@ -74,26 +78,116 @@
     memset(slave_send_buf,0,sizeof(slave_send_buf));
     slave_send_buf[0]=0X55;
     slave_send_buf[1]=0XAA;
-    slave_send_buf[2]=blequeue.totalnum*4+2;
-    slave_send_buf[3]=blequeue.totalnum;
-    memcpy(&slave_send_buf[4],blequeue.id,2*blequeue.totalnum);
-    memcpy(&slave_send_buf[4+2*blequeue.totalnum],blequeue.rssi,2*blequeue.totalnum);
-    slave_send_buf[4+4*blequeue.totalnum]=0x66;
-    slave_send_buf[5+4*blequeue.totalnum]=0xBB;
-    HAL_UART_SendData(&UART0_OBJ, slave_send_buf,blequeue.totalnum*4+6,1000);
-    blequeue.totalnum=0;
+    slave_send_buf[2]=0X41;
+    
+    slave_send_buf[3]=blequeue.totalnum*4+2;
+    slave_send_buf[4]=blequeue.totalnum;
+    memcpy(&slave_send_buf[5],blequeue.id,2*blequeue.totalnum);
+    memcpy(&slave_send_buf[5+2*blequeue.totalnum],blequeue.rssi,2*blequeue.totalnum);
+    slave_send_buf[5+4*blequeue.totalnum]=0x66;
+    slave_send_buf[6+4*blequeue.totalnum]=0xBB;
+//    HAL_UART_SendData(&UART0_OBJ, slave_send_buf,blequeue.totalnum*4+7,1000);
+    HAL_UART_SendData_DMA(&UART0_OBJ, slave_send_buf,blequeue.totalnum*4+7);
+//    blequeue.totalnum=0;
 
-    memset(blequeue.id,0,sizeof(blequeue.id));
-    memset(blequeue.u16id,0,sizeof(blequeue.u16id));
-    memset(blequeue.rssi,0,sizeof(blequeue.rssi));
+//    memset(blequeue.id,0,sizeof(blequeue.id));
+//    memset(blequeue.u16id,0,sizeof(blequeue.u16id));
+//    memset(blequeue.rssi,0,sizeof(blequeue.rssi));
 }
 void vTimerCallback( TimerHandle_t xTimer )
 {	
+    uint16_t aa,bb;
 timer++;
-    Spi_Zubao_Send();
+//    Spi_Zubao_Send();
+    if (shengji_flag==1) 
+    {
+    shengji_time++;
+        if(shengji_time>600)
+        {
+        NVIC_SystemReset();
+        }
+    }
+    for(aa=0;aa<blequeue.totalnum;aa++)
+    {
+    blequeue.time[aa]++;
+        if(blequeue.time[aa]>3)
+        {
+           for(bb=aa;bb<blequeue.totalnum;bb++)
+            {
+                blequeue.id[bb]=blequeue.id[bb+1];
+                blequeue.rssi[bb]=blequeue.rssi[bb+1];
+                blequeue.time[bb]=blequeue.time[bb+1];
+            }
+        }
+    }
+}
+static TaskHandle_t xTaskToNotify = NULL;
+static void gpio_p02_input_callback(HAL_GPIO_IntMode intMode)
+{
+    BaseType_t xHigherPriorityTaskWoken = pdTRUE;
+
+    /* Notify the task that KEY1 is pressed (P06 falling edge detected). */
+//    vTaskNotifyGiveFromISR(xTaskToNotify, &xHigherPriorityTaskWoken);
+    if (shengji_flag==0) 
+        {
+            if (HAL_GPIO_ReadPin(P0_2) == HAL_GPIO_LEVEL_LOW) 
+                {
+//                APP_LOG_INFO("==== HAL_GPIO_LEVEL_LOW ,进入升级模式====\n");
+                } 
+                else 
+                {
+//                APP_LOG_INFO("==== HAL_GPIO_LEVEL_HIGH ,进入升级模式====\n");
+                }
+//                shengji_flag=1;
+//                only_one=1;
+                #if CONFIG_BT_MAX_NUM_OF_PERIPHERAL
+                	/* Adv */
+//                	app_ble_adv_start();
+//                shengji_start();
+                #endif
+                send_flag=1;
+                
+        }
+}
+static void gpio_init(void)
+{
+    /* Set pinmux of P06 to GPIO (default) */
+    SYS_SET_MFP(P0, 2, GPIO);
+
+    /* Init GPIO P06 to digital input mode */
+    HAL_GPIO_InitTypeDef GPIO_InitStruct = {
+        .mode   = HAL_GPIO_MODE_INPUT_DIGITAL,
+        .pull   = HAL_GPIO_PULL_UP,
+    };
+    HAL_GPIO_Init(P0_2, &GPIO_InitStruct);
+
+    /* Wait a while for internal pull-up resistor stable to avoid later interrupt false triggering */
+    soc_busy_wait(10000);
+
+    /* Enable input interrupt of GPIO P06 */
+    HAL_GPIO_IntInitTypeDef GPIO_IntInitStruct = {
+        .intMode        = HAL_GPIO_INT_FALLING,  // Change this option to see different interrupt behaviors
+        .callbackFunc   = gpio_p02_input_callback,
+        .debounce       = ENABLE,
+    };
+    HAL_GPIO_InterruptInit(P0_2, &GPIO_IntInitStruct);
+
+    /* Enable NVIC GPIO0 IRQn */
+    NVIC_EnableIRQ(GPIO0_IRQn);
 }
 void app_ble_pre_init_cb(void)
 {
+     /*
+     * Configure clock of GPIO interrupt debouce
+     * NOTE:
+     * - This configuration affects all GPIOs with debounce enabled
+     * - This API should only be called once at app init flow for safe
+     */
+    GPIO_SetDebounceTime(GPIO_DBCTL_DBCLKSRC_RCL, GPIO_DBCTL_DBCLKSEL_32);    // Set debounce time to 32 cycles of 32K Clock (about 1ms)
+
+    /* Init P06 to digital input mode with interrupt and debounce enabled */
+    gpio_init();
+    
 	/* Set MAC address. */
     app_ble_set_mac_addr();
 
@@ -109,6 +203,7 @@
 	img_mgmt_module_init();
 	smp_ble_pkg_init();
     
+    app_ble_thread_init();
     xTimerUser = xTimerCreate("Timer's name",pdMS_TO_TICKS(900),pdTRUE,( void * ) 0,vTimerCallback);                 
     if( xTimerUser != NULL ) {
     xTimerStart( xTimerUser, 0 );
@@ -121,4 +216,35 @@
 	pan_ble_stack_init(app_ble_pre_init_cb, app_ble_enabled_cb);
 }
 
+void POLL(void)
+{
+    if(shengji_flag&&only_one)
+    {
+        app_ble_adv_start();
+        only_one=0;
+    }
+    if(send_flag)
+    {
+    Spi_Zubao_Send();
+    send_flag=0;    
+    }
 
+}
+#define MYNEWT_VAL_APP_BLE_THREAD_STACK_SIZE        128
+static TaskHandle_t app_ble_task_h;
+void app_ble_thread_entry(void *parameter)
+{
+		while(1)
+		{
+            POLL();
+            vTaskDelay((pdMS_TO_TICKS(1000)));
+		}
+vTaskDelete(NULL);
+
+}
+void app_ble_thread_init(void)
+{
+	xTaskCreate(app_ble_thread_entry, "app", MYNEWT_VAL(APP_BLE_THREAD_STACK_SIZE),
+		    NULL, configMAX_PRIORITIES - 3, &app_ble_task_h);
+
+}
\ No newline at end of file

--
Gitblit v1.9.3