- static int32_t init_sensor(void)
 
- {
 
-     if (cyhal_spi_init(&spi_obj,
 
-                        PIN_XENSIV_BGT60TRXX_SPI_MOSI,
 
-                        PIN_XENSIV_BGT60TRXX_SPI_MISO,
 
-                        PIN_XENSIV_BGT60TRXX_SPI_SCLK,
 
-                        NC,
 
-                        NULL,
 
-                        8,
 
-                        CYHAL_SPI_MODE_00_MSB,
 
-                        false) != CY_RSLT_SUCCESS)
 
-     {
 
-         printf("[MSG] ERROR: cyhal_spi_init failed\n");
 
-         return -1;
 
-     }
 
 
-     /* Reduce drive strength to improve EMI */
 
-     Cy_GPIO_SetSlewRate(CYHAL_GET_PORTADDR(PIN_XENSIV_BGT60TRXX_SPI_MOSI), CYHAL_GET_PIN(PIN_XENSIV_BGT60TRXX_SPI_MOSI), CY_GPIO_SLEW_FAST);
 
-     Cy_GPIO_SetDriveSel(CYHAL_GET_PORTADDR(PIN_XENSIV_BGT60TRXX_SPI_MOSI), CYHAL_GET_PIN(PIN_XENSIV_BGT60TRXX_SPI_MOSI), CY_GPIO_DRIVE_1_8);
 
-     Cy_GPIO_SetSlewRate(CYHAL_GET_PORTADDR(PIN_XENSIV_BGT60TRXX_SPI_SCLK), CYHAL_GET_PIN(PIN_XENSIV_BGT60TRXX_SPI_SCLK), CY_GPIO_SLEW_FAST);
 
-     Cy_GPIO_SetDriveSel(CYHAL_GET_PORTADDR(PIN_XENSIV_BGT60TRXX_SPI_SCLK), CYHAL_GET_PIN(PIN_XENSIV_BGT60TRXX_SPI_SCLK), CY_GPIO_DRIVE_1_8);
 
 
-     /* Set the data rate to 25 Mbps */
 
-     if (cyhal_spi_set_frequency(&spi_obj, XENSIV_BGT60TRXX_SPI_FREQUENCY) != CY_RSLT_SUCCESS)
 
-     {
 
-         printf("[MSG] ERROR: cyhal_spi_set_frequency failed\n");
 
-         return -1;
 
-     }
 
 
- #if defined (TARGET_APP_CYSBSYSKIT_DEV_01) || (TARGET_APP_KIT_BGT60TR13C_EMBEDD)
 
-     /* Enable LDO */
 
-     if (cyhal_gpio_init(PIN_XENSIV_BGT60TRXX_LDO_EN,
 
-                         CYHAL_GPIO_DIR_OUTPUT,
 
-                         CYHAL_GPIO_DRIVE_STRONG,
 
-                         true) != CY_RSLT_SUCCESS)
 
-     {
 
-         printf("[MSG] ERROR: LDO_EN cyhal_gpio_init failed\n");
 
-         return -1;
 
-     }
 
- #endif
 
 
-     /* Wait LDO stable */
 
-     (void)cyhal_system_delay_ms(5);
 
 
-     if (xensiv_bgt60trxx_mtb_init(&bgt60_obj, 
 
-                                   &spi_obj, 
 
-                                   PIN_XENSIV_BGT60TRXX_SPI_CSN, 
 
-                                   PIN_XENSIV_BGT60TRXX_RSTN, 
 
-                                   register_list_micro_only, // default config with macro settings
 
-                                   XENSIV_BGT60TRXX_CONF_NUM_REGS_MACRO) != CY_RSLT_SUCCESS)
 
-     {
 
-         printf("[MSG] ERROR: xensiv_bgt60trxx_mtb_init failed\n");
 
-         return -1;
 
-     }
 
 
-     if (xensiv_bgt60trxx_mtb_interrupt_init(&bgt60_obj,
 
-                                             NUM_SAMPLES_PER_FRAME*2,
 
-                                             PIN_XENSIV_BGT60TRXX_IRQ,
 
-                                             GPIO_INTERRUPT_PRIORITY,
 
-                                             xensiv_bgt60trxx_interrupt_handler,
 
-                                             NULL) != CY_RSLT_SUCCESS)
 
-     {
 
-         printf("[MSG] ERROR: xensiv_bgt60trxx_mtb_interrupt_init failed\n");
 
-         return -1;
 
-     }
 
 
-     return 0;
 
- }
程序主要在main task中进行处理,其主要包括:
* 1。创建一个定时器来切换用户LED
* 2。创建处理RTOS任务
* 3。初始化传感器和led的硬件接口
* 4。初始化雷达设备
* 5。在无限循环中
* -等待来自雷达设备的中断,表明数据可用性
* -读取数据,将其转换为浮点数并通知处理任务
代码如下:
- static __NO_RETURN void main_task(void *pvParameters)
 
- {
 
-     (void)pvParameters;
 
-     uint32_t sz;
 
-     uint16_t *data_buff = NULL;
 
-     cy_rslt_t result;
 
-     XENSIV_RADAR_PRESENCE_TIMESTAMP last_timestamp = 0;
 
 
-     timer_handler = xTimerCreate("timer", pdMS_TO_TICKS(1000), pdTRUE, NULL, timer_callbak);    
 
-     if (timer_handler == NULL)
 
-     {
 
-         CY_ASSERT(0);
 
-     }
 
 
-     if (xTimerStart(timer_handler, 0) != pdPASS)
 
-     {
 
-         CY_ASSERT(0);
 
-     }
 
 
-     if (xTaskCreate(processing_task, PROCESSING_TASK_NAME, PROCESSING_TASK_STACK_SIZE, NULL, PROCESSING_TASK_PRIORITY, &processing_task_handler) != pdPASS)
 
-     {
 
-         CY_ASSERT(0);
 
-     }
 
 
-     if (init_sensor() != 0)
 
-     {
 
-         CY_ASSERT(0);
 
-     }
 
 
-     xensiv_bgt60trxx_device_t device_type = xensiv_bgt60trxx_get_device(&bgt60_obj.dev);
 
 
-     print_welcome_message(device_type);
 
 
-     if (init_leds () != 0)
 
-     {
 
-         CY_ASSERT(0);
 
-     }
 
 
-     mgr.subscribe(main_task_handler);
 
 
-     /* Initialize the initial state of ce_app_state */
 
-     ce_app_state.last_reported_event.state = XENSIV_RADAR_PRESENCE_STATE_ABSENCE;
 
-     ce_app_state.last_reported_event.range_bin = 0;
 
-     ce_app_state.last_reported_event.timestamp = 0;
 
 
-     if (xensiv_bgt60trxx_start_frame(&bgt60_obj.dev, true) != XENSIV_BGT60TRXX_STATUS_OK)
 
-     {
 
-         CY_ASSERT(0);
 
-     }
 
 
-     for(;;)
 
-     {
 
-         /* Wait for the GPIO interrupt to indicate that another slice is available */
 
-         ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
 
-         mgr.read_from_buffer(1, &data_buff, &sz);
 
 
-         /* Data preprocessing */
 
-         uint16_t *bgt60_buffer_ptr = data_buff;
 
-         float32_t *frame_ptr = &frame[0];
 
-         for (int32_t sample = 0; sample < NUM_SAMPLES_PER_FRAME * 2; ++sample)
 
-         {
 
-             *frame_ptr++ = ((float32_t)(*bgt60_buffer_ptr++) / 4096.0F);
 
-         }
 
 
-         mgr.ack_data_read(1);
 
 
-         /* calculate the average of the chirps first */
 
-         arm_fill_f32(0, avg_chirp, NUM_SAMPLES_PER_CHIRP);
 
 
-         for (int chirp = 0; chirp < NUM_CHIRPS_PER_FRAME * 2; chirp++)
 
-         {
 
-             arm_add_f32(avg_chirp, &frame[NUM_SAMPLES_PER_CHIRP * chirp], avg_chirp, NUM_SAMPLES_PER_CHIRP);
 
-         }
 
 
-         arm_scale_f32(avg_chirp, 1.0f / NUM_CHIRPS_PER_FRAME, avg_chirp, NUM_SAMPLES_PER_CHIRP);
 
 
-         if(ce_app_state.last_reported_event.timestamp != last_timestamp)
 
-         {
 
-             last_timestamp = ce_app_state.last_reported_event.timestamp; // save latest timestamp
 
-             result = radar_config_optimize(ce_app_state.last_reported_event.state);
 
-             if(result != ESTATUS_SUCCESS)
 
-             {
 
-                 printf("[MSG] ERROR: radar_config_optimize failed with error %" PRIi32 "\n", result);
 
-                 CY_ASSERT(0);
 
-             }
 
-         }
 
 
-         /* Tell processing task to take over */
 
-         xTaskNotifyGive(processing_task_handler);
 
 
-     }
 
- }
-     /* Create the RTOS task */
 
-     if (xTaskCreate(main_task, MAIN_TASK_NAME, MAIN_TASK_STACK_SIZE, NULL, MAIN_TASK_PRIORITY, &main_task_handler) != pdPASS)
 
-     {
 
-         CY_ASSERT(0);
 
-     }
 
 
-     /* Start the FreeRTOS scheduler. */
 
-     vTaskStartScheduler();
烧录后,从远处靠近开发板,可以看到串口输出:
- current presence: 0, current setting: 10 Hz
 
- new setting: micro
 
- [INFO] macro presence 5 139112
 
- current presence: 0, current setting: 200 Hz
 
- new setting: macro
 
- [INFO] micro presence 5 144492
 
- current presence: 1, current setting: 10 Hz
 
- [INFO] micro presence 3 144692
 
- current presence: 1, current setting: 10 Hz