80 #include "cmw_camera.h"
81 #include "stm32n6570_discovery_bus.h"
82 #include "stm32n6570_discovery_lcd.h"
83 #include "stm32n6570_discovery_xspi.h"
84 #include "stm32n6570_discovery.h"
85 #include "stm32_lcd.h"
86 #include "app_fuseprogramming.h"
87 #include "stm32_lcd_ex.h"
88 #include "app_postprocess.h"
89 #include "ll_aton_runtime.h"
99 #if POSTPROCESS_TYPE == POSTPROCESS_MPE_YOLO_V8_UF
101 #elif POSTPROCESS_TYPE == POSTPROCESS_SPE_MOVENET_UF
104 #error "PostProcessing type not supported"
108 #define MAX_NUMBER_OUTPUT 5
111 #define LCD_FG_WIDTH SCREEN_WIDTH
114 #define LCD_FG_HEIGHT SCREEN_HEIGHT
117 #define LCD_FG_FRAMEBUFFER_SIZE (LCD_FG_WIDTH * LCD_FG_HEIGHT * 2)
141 #if ASPECT_RATIO_MODE == ASPECT_RATIO_CROP || ASPECT_RATIO_MODE == ASPECT_RATIO_FIT
165 #if POSTPROCESS_TYPE == POSTPROCESS_MPE_YOLO_V8_UF
168 #elif POSTPROCESS_TYPE == POSTPROCESS_SPE_MOVENET_UF
192 #define ALIGN_TO_16(value) (((value) + 15) & ~15)
206 #if (NN_WIDTH * NN_BPP) != ALIGN_TO_16(NN_WIDTH * NN_BPP)
207 #define DCMIPP_OUT_NN_LEN (ALIGN_TO_16(NN_WIDTH * NN_BPP) * NN_HEIGHT)
208 #define DCMIPP_OUT_NN_BUFF_LEN (DCMIPP_OUT_NN_LEN + 32 - DCMIPP_OUT_NN_LEN%32)
223 uint8_t lcd_bg_buffer[800 * 480 * 2];
237 static
int lcd_fg_buffer_rd_idx;
251 int *number_output, int32_t nn_out_len[]);
303 uint32_t pitch_nn = 0;
304 uint32_t nn_in_len = 0;
305 int number_output = 0;
316 LL_ATON_DECLARE_NAMED_NN_INSTANCE_AND_INTERFACE(Default);
368 uint32_t ts[2] = { 0 };
384 SCB_CleanInvalidateDCache_by_Addr(
nn_in, nn_in_len);
388 ts[0] = HAL_GetTick();
404 LL_ATON_RT_Main(&NN_Instance_Default);
407 ts[1] = HAL_GetTick();
414 int32_t ret = app_postprocess_run((
void **) nn_out, number_output,
427 for (
int i = 0; i < number_output; i++)
429 float32_t *tmp = nn_out[i];
430 SCB_InvalidateDCache_by_Addr(tmp, nn_out_len[i]);
466 MEMSYSCTL->MSCR |= MEMSYSCTL_MSCR_ICACTIVE_Msk;
469 __HAL_RCC_CPUCLK_CONFIG(RCC_CPUCLKSOURCE_HSI);
470 __HAL_RCC_SYSCLK_CONFIG(RCC_SYSCLKSOURCE_HSI);
476 #if defined(USE_DCACHE)
478 MEMSYSCTL->MSCR |= MEMSYSCTL_MSCR_DCACTIVE_Msk;
488 BSP_XSPI_RAM_Init(0);
489 BSP_XSPI_RAM_EnableMemoryMappedMode(0);
491 BSP_XSPI_NOR_Init_t NOR_Init;
492 NOR_Init.InterfaceMode = BSP_XSPI_NOR_OPI_MODE;
493 NOR_Init.TransferRate = BSP_XSPI_NOR_DTR_TRANSFER;
494 BSP_XSPI_NOR_Init(0, &NOR_Init);
495 BSP_XSPI_NOR_EnableMemoryMappedMode(0);
532 int *number_output, int32_t nn_out_len[])
535 const LL_Buffer_InfoTypeDef *nn_in_info = LL_ATON_Input_Buffers_Info_Default();
536 const LL_Buffer_InfoTypeDef *nn_out_info = LL_ATON_Output_Buffers_Info_Default();
539 nn_in = (uint8_t *) LL_Buffer_addr_start(&nn_in_info[0]);
542 while (nn_out_info[*number_output].name != NULL)
549 for (
int i = 0; i < *number_output; i++)
551 nn_out[i] = (float32_t *) LL_Buffer_addr_start(&nn_out_info[i]);
552 nn_out_len[i] = LL_Buffer_len(&nn_out_info[i]);
555 *nnin_length = LL_Buffer_len(&nn_in_info[0]);
583 __HAL_RCC_NPU_CLK_ENABLE();
584 __HAL_RCC_NPU_FORCE_RESET();
585 __HAL_RCC_NPU_RELEASE_RESET();
588 __HAL_RCC_AXISRAM3_MEM_CLK_ENABLE();
589 __HAL_RCC_AXISRAM4_MEM_CLK_ENABLE();
590 __HAL_RCC_AXISRAM5_MEM_CLK_ENABLE();
591 __HAL_RCC_AXISRAM6_MEM_CLK_ENABLE();
592 __HAL_RCC_RAMCFG_CLK_ENABLE();
594 RAMCFG_HandleTypeDef hramcfg = {0};
595 hramcfg.Instance = RAMCFG_SRAM3_AXI; HAL_RAMCFG_EnableAXISRAM(&hramcfg);
596 hramcfg.Instance = RAMCFG_SRAM4_AXI; HAL_RAMCFG_EnableAXISRAM(&hramcfg);
597 hramcfg.Instance = RAMCFG_SRAM5_AXI; HAL_RAMCFG_EnableAXISRAM(&hramcfg);
598 hramcfg.Instance = RAMCFG_SRAM6_AXI; HAL_RAMCFG_EnableAXISRAM(&hramcfg);
631 __HAL_RCC_XSPI1_CLK_SLEEP_ENABLE();
632 __HAL_RCC_XSPI2_CLK_SLEEP_ENABLE();
633 __HAL_RCC_NPU_CLK_SLEEP_ENABLE();
634 __HAL_RCC_CACHEAXI_CLK_SLEEP_ENABLE();
635 __HAL_RCC_LTDC_CLK_SLEEP_ENABLE();
636 __HAL_RCC_DMA2D_CLK_SLEEP_ENABLE();
637 __HAL_RCC_DCMIPP_CLK_SLEEP_ENABLE();
638 __HAL_RCC_CSI_CLK_SLEEP_ENABLE();
639 __HAL_RCC_FLEXRAM_MEM_CLK_SLEEP_ENABLE();
640 __HAL_RCC_AXISRAM1_MEM_CLK_SLEEP_ENABLE();
641 __HAL_RCC_AXISRAM2_MEM_CLK_SLEEP_ENABLE();
642 __HAL_RCC_AXISRAM3_MEM_CLK_SLEEP_ENABLE();
643 __HAL_RCC_AXISRAM4_MEM_CLK_SLEEP_ENABLE();
644 __HAL_RCC_AXISRAM5_MEM_CLK_SLEEP_ENABLE();
645 __HAL_RCC_AXISRAM6_MEM_CLK_SLEEP_ENABLE();
686 __HAL_RCC_RIFSC_CLK_ENABLE();
687 RIMC_MasterConfig_t RIMC_master = {0};
688 RIMC_master.MasterCID = RIF_CID_1;
689 RIMC_master.SecPriv = RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV;
690 HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_NPU, &RIMC_master);
691 HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_DMA2D, &RIMC_master);
692 HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_DCMIPP, &RIMC_master);
693 HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_LTDC1, &RIMC_master);
694 HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_LTDC2, &RIMC_master);
695 HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_NPU, RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);
696 HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_DMA2D, RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);
697 HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_CSI, RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);
698 HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_DCMIPP, RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);
699 HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_LTDC, RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);
700 HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_LTDCL1, RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);
701 HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_LTDCL2, RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);
717 __HAL_RCC_IAC_CLK_ENABLE();
718 __HAL_RCC_IAC_FORCE_RESET();
719 __HAL_RCC_IAC_RELEASE_RESET();
753 int xi = *x, yi = *y;
758 return (xi != *x) || (yi != *y);
816 UTIL_LCD_DrawLine(x0, y0, x1, y1, color);
845 #if POSTPROCESS_TYPE == POSTPROCESS_MPE_YOLO_V8_UF
846 mpe_pp_outBuffer_t *rois = ((mpe_pp_out_t *) p_postprocess)->pOutBuff;
847 uint32_t nb_rois = ((mpe_pp_out_t *) p_postprocess)->nb_detect;
848 #elif POSTPROCESS_TYPE == POSTPROCESS_SPE_MOVENET_UF
849 spe_pp_outBuffer_t *roi = ((spe_pp_out_t *) p_postprocess)->pOutBuff;
854 ret = HAL_LTDC_SetAddress_NoReload(&hlcd_ltdc,
855 (uint32_t) lcd_fg_buffer[lcd_fg_buffer_rd_idx], LTDC_LAYER_2);
856 assert(ret == HAL_OK);
862 #if POSTPROCESS_TYPE == POSTPROCESS_MPE_YOLO_V8_UF
864 for (
int i = 0; i < nb_rois; i++)
866 UTIL_LCDEx_PrintfAt(0, LINE(2), CENTER_MODE,
"Objects %u", nb_rois);
867 #elif POSTPROCESS_TYPE == POSTPROCESS_SPE_MOVENET_UF
873 UTIL_LCD_SetBackColor(0x40000000);
874 UTIL_LCDEx_PrintfAt(0, LINE(20), CENTER_MODE,
"Inference: %ums", inference_ms);
875 UTIL_LCD_SetBackColor(0);
880 SCB_CleanDCache_by_Addr(lcd_fg_buffer[lcd_fg_buffer_rd_idx],
884 ret = HAL_LTDC_ReloadLayer(&hlcd_ltdc, LTDC_RELOAD_VERTICAL_BLANKING, LTDC_LAYER_2);
885 assert(ret == HAL_OK);
888 lcd_fg_buffer_rd_idx = 1 - lcd_fg_buffer_rd_idx;
916 BSP_LCD_Init(0, LCD_ORIENTATION_LANDSCAPE);
925 BSP_LCD_ConfigLayer(0, LTDC_LAYER_1, &
LayerConfig);
932 LayerConfig.PixelFormat = LCD_PIXEL_FORMAT_ARGB4444;
934 BSP_LCD_ConfigLayer(0, LTDC_LAYER_2, &
LayerConfig);
936 UTIL_LCD_SetFuncDriver(&LCD_Driver);
937 UTIL_LCD_SetLayer(LTDC_LAYER_2);
938 UTIL_LCD_Clear(0x00000000);
939 UTIL_LCD_SetFont(&Font20);
940 UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_WHITE);
943 #if POSTPROCESS_TYPE == POSTPROCESS_MPE_YOLO_V8_UF
946 #elif POSTPROCESS_TYPE == POSTPROCESS_SPE_MOVENET_UF
965 static uint32_t t0 = 0;
966 if (t0 == 0) t0 = HAL_GetTick();
968 if (HAL_GetTick() - t0 < 4000)
970 UTIL_LCD_FillRGBRect(300, 100, (uint8_t *) stlogo, 200, 107);
971 UTIL_LCD_SetBackColor(0x40000000);
972 UTIL_LCDEx_PrintfAt(0, LINE(16), CENTER_MODE,
"Pose estimation");
973 UTIL_LCDEx_PrintfAt(0, LINE(17), CENTER_MODE,
WELCOME_MSG_1);
974 UTIL_LCDEx_PrintfAt(0, LINE(18), CENTER_MODE,
WELCOME_MSG_2);
975 UTIL_LCD_SetBackColor(0);
992 RCC_PeriphCLKInitTypeDef RCC_PeriphCLKInitStruct = {0};
993 HAL_StatusTypeDef ret = HAL_OK;
995 RCC_PeriphCLKInitStruct.PeriphClockSelection = RCC_PERIPHCLK_DCMIPP;
996 RCC_PeriphCLKInitStruct.DcmippClockSelection = RCC_DCMIPPCLKSOURCE_IC17;
997 RCC_PeriphCLKInitStruct.ICSelection[RCC_IC17].ClockSelection = RCC_ICCLKSOURCE_PLL2;
998 RCC_PeriphCLKInitStruct.ICSelection[RCC_IC17].ClockDivider = 3;
999 ret = HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInitStruct);
1000 if (ret)
return ret;
1002 RCC_PeriphCLKInitStruct.PeriphClockSelection = RCC_PERIPHCLK_CSI;
1003 RCC_PeriphCLKInitStruct.ICSelection[RCC_IC18].ClockSelection = RCC_ICCLKSOURCE_PLL1;
1004 RCC_PeriphCLKInitStruct.ICSelection[RCC_IC18].ClockDivider = 40;
1005 ret = HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInitStruct);
1035 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
1036 RCC_OscInitTypeDef RCC_OscInitStruct = {0};
1037 RCC_PeriphCLKInitTypeDef RCC_PeriphCLKInitStruct = {0};
1039 BSP_SMPS_Init(SMPS_VOLTAGE_OVERDRIVE);
1041 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_NONE;
1044 RCC_OscInitStruct.PLL1.PLLState = RCC_PLL_ON;
1045 RCC_OscInitStruct.PLL1.PLLSource = RCC_PLLSOURCE_HSI;
1046 RCC_OscInitStruct.PLL1.PLLM = 2; RCC_OscInitStruct.PLL1.PLLN = 25;
1047 RCC_OscInitStruct.PLL1.PLLFractional = 0;
1048 RCC_OscInitStruct.PLL1.PLLP1 = 1; RCC_OscInitStruct.PLL1.PLLP2 = 1;
1051 RCC_OscInitStruct.PLL2.PLLState = RCC_PLL_ON;
1052 RCC_OscInitStruct.PLL2.PLLSource = RCC_PLLSOURCE_HSI;
1053 RCC_OscInitStruct.PLL2.PLLM = 8; RCC_OscInitStruct.PLL2.PLLN = 125;
1054 RCC_OscInitStruct.PLL2.PLLFractional = 0;
1055 RCC_OscInitStruct.PLL2.PLLP1 = 1; RCC_OscInitStruct.PLL2.PLLP2 = 1;
1058 RCC_OscInitStruct.PLL3.PLLState = RCC_PLL_ON;
1059 RCC_OscInitStruct.PLL3.PLLSource = RCC_PLLSOURCE_HSI;
1060 RCC_OscInitStruct.PLL3.PLLM = 8; RCC_OscInitStruct.PLL3.PLLN = 225;
1061 RCC_OscInitStruct.PLL3.PLLFractional = 0;
1062 RCC_OscInitStruct.PLL3.PLLP1 = 1; RCC_OscInitStruct.PLL3.PLLP2 = 2;
1065 RCC_OscInitStruct.PLL4.PLLState = RCC_PLL_ON;
1066 RCC_OscInitStruct.PLL4.PLLSource = RCC_PLLSOURCE_HSI;
1067 RCC_OscInitStruct.PLL4.PLLM = 8; RCC_OscInitStruct.PLL4.PLLN = 225;
1068 RCC_OscInitStruct.PLL4.PLLFractional = 0;
1069 RCC_OscInitStruct.PLL4.PLLP1 = 6; RCC_OscInitStruct.PLL4.PLLP2 = 6;
1071 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
while(1);
1073 RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_CPUCLK | RCC_CLOCKTYPE_SYSCLK |
1074 RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 |
1075 RCC_CLOCKTYPE_PCLK2 | RCC_CLOCKTYPE_PCLK4 |
1076 RCC_CLOCKTYPE_PCLK5);
1078 RCC_ClkInitStruct.CPUCLKSource = RCC_CPUCLKSOURCE_IC1;
1079 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_IC2_IC6_IC11;
1080 RCC_ClkInitStruct.IC1Selection.ClockSelection = RCC_ICCLKSOURCE_PLL1; RCC_ClkInitStruct.IC1Selection.ClockDivider = 1;
1081 RCC_ClkInitStruct.IC2Selection.ClockSelection = RCC_ICCLKSOURCE_PLL1; RCC_ClkInitStruct.IC2Selection.ClockDivider = 2;
1082 RCC_ClkInitStruct.IC6Selection.ClockSelection = RCC_ICCLKSOURCE_PLL2; RCC_ClkInitStruct.IC6Selection.ClockDivider = 1;
1083 RCC_ClkInitStruct.IC11Selection.ClockSelection = RCC_ICCLKSOURCE_PLL3; RCC_ClkInitStruct.IC11Selection.ClockDivider = 1;
1084 RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
1085 RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV1;
1086 RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV1;
1087 RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV1;
1088 RCC_ClkInitStruct.APB5CLKDivider = RCC_APB5_DIV1;
1090 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct) != HAL_OK)
while(1);
1092 RCC_PeriphCLKInitStruct.PeriphClockSelection = RCC_PERIPHCLK_XSPI1 | RCC_PERIPHCLK_XSPI2;
1093 RCC_PeriphCLKInitStruct.Xspi1ClockSelection = RCC_XSPI1CLKSOURCE_HCLK;
1094 RCC_PeriphCLKInitStruct.Xspi2ClockSelection = RCC_XSPI2CLKSOURCE_HCLK;
1095 if (HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInitStruct) != HAL_OK)
while(1);
void CameraPipeline_Init(uint32_t *lcd_bg_width, uint32_t *lcd_bg_height, uint32_t *pitch_nn)
Init the camera and the 2 DCMIPP pipes.
void CameraPipeline_NNPipe_Start(uint8_t *nn_pipe_dst, uint32_t cam_mode)
void CameraPipeline_IspUpdate(void)
void CameraPipeline_DisplayPipe_Start(uint8_t *display_pipe_dst, uint32_t cam_mode)
Central configuration header for the STM32N6570-DK pose estimation firmware application.
void img_crop(uint8_t *src_image, uint8_t *dst_img, const uint32_t src_stride, const uint16_t dst_width, const uint16_t height, const uint16_t dst_bpp)
void Display_mpe_Detection(mpe_pp_outBuffer_t *detect)
void Display_mpe_InitFunctions(int clamp_point_init(int *x, int *y), void convert_length_init(float32_t wi, float32_t hi, int *wo, int *ho), void convert_point_init(float32_t xi, float32_t yi, int *xo, int *yo), void Display_binding_line_init(int x0, int y0, int x1, int y1, uint32_t color))
void Display_spe_InitFunctions(int clamp_point_init(int *x, int *y), void convert_length_init(float32_t wi, float32_t hi, int *wo, int *ho), void convert_point_init(float32_t xi, float32_t yi, int *xo, int *yo), void Display_binding_line_init(int x0, int y0, int x1, int y1, uint32_t color))
void Display_spe_Detection(spe_pp_outBuffer_t *detect)
#define NN_BPP
Bytes per pixel of the NN input tensor.
#define WELCOME_MSG_1
Welcome screen line 1 — active model filename.
#define NN_HEIGHT
Neural network input image height in pixels.
#define WELCOME_MSG_2
Welcome screen line 2 — memory configuration note.
#define NN_WIDTH
Neural network input image width in pixels.
#define LCD_FG_WIDTH
LCD foreground layer width = full screen width (800 pixels)
#define MAX_NUMBER_OUTPUT
Conditional postprocessing include based on POSTPROCESS_TYPE in app_config.h.
static void convert_length(float32_t wi, float32_t hi, int *wo, int *ho)
Convert normalized [0,1] dimensions to LCD pixel dimensions.
static void Hardware_init(void)
Initialize all hardware peripherals required for the application.
void IAC_IRQHandler(void)
IAC interrupt handler — traps illegal memory access violations.
static void Display_binding_line(int x0, int y0, int x1, int y1, uint32_t color)
Draw a skeleton connection line between two keypoints on the LCD.
static void LCD_init(void)
Initialize the LCD display with dual-layer configuration.
#define LCD_FG_FRAMEBUFFER_SIZE
Foreground framebuffer size in bytes (RGB565 = 2 bytes/pixel)
static void convert_point(float32_t xi, float32_t yi, int *xo, int *yo)
Convert normalized [0,1] coordinates to LCD pixel coordinates.
BSP_LCD_LayerConfig_t LayerConfig
LTDC layer configuration structure.
static void set_clk_sleep_mode(void)
Configure peripheral clocks to remain active during CPU sleep.
uint8_t * nn_in
Pointer to the NPU input buffer in AXISRAM (set by NeuralNetwork_init)
static int clamp_point(int *x, int *y)
Clamp a point to the LCD background area boundaries.
#define LCD_FG_HEIGHT
LCD foreground layer height = full screen height (480 pixels)
HAL_StatusTypeDef MX_DCMIPP_ClockConfig(DCMIPP_HandleTypeDef *hdcmipp)
Configure DCMIPP pixel clock (IC17) and CSI clock (IC18).
Rectangle_TypeDef lcd_bg_area
LCD background area — camera preview region.
__attribute__((section(".psram_bss")))
LCD background framebuffer — camera preview.
mpe_yolov8_pp_static_param_t pp_params
Postprocessing parameters — statically allocated, model-specific.
static void Display_WelcomeScreen(void)
Display the welcome screen for the first 4 seconds after boot.
static void IAC_Config(void)
Configure the Illegal Access Controller (IAC).
uint8_t * dcmipp_out_nn
DCMIPP intermediate buffer for non-16-aligned NN inputs.
static void NeuralNetwork_init(uint32_t *nnin_length, float32_t *nn_out[], int *number_output, int32_t nn_out_len[])
Initialize the Neural Network input/output buffer pointers.
static void NPUCache_config(void)
Initialize and enable the NPU AXI cache.
static void Display_NetworkOutput(void *p_postprocess, uint32_t inference_ms)
Render inference results on the LCD foreground overlay layer.
static void SystemClock_Config(void)
Configure the system clock tree using four PLLs.
Rectangle_TypeDef lcd_fg_area
LCD foreground area — full-screen overlay for inference results.
static void Security_Config(void)
Configure TrustZone security attributes for hardware peripherals.
static void NPURam_enable(void)
Enable the NPU clock and all four NPU SRAM banks.
volatile int32_t cameraFrameReceived
Camera frame ready flag.
None main(DictConfig cfg)
Rectangle descriptor for LCD layer positioning.