打印
[STM32N6]

【STM32N6测评】 N6牛啊 先点的灯

[复制链接]
242|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主


    参加ST官方活动,有幸拿到一块STM32N6 Nucleo board,先马上跟大家分享一下:
上图:






  STM32N6 Nucleo board开发板基于STM32N657X0H3Q Arm®Cortex®‑M55的微控制器,配备ST Neural-ART 神经加速器H264编码器、Neo Chrom 2.5D GPU和4.2 MB连续SRAM,采用VFBGA264封装
•USB Type-C®DRP,带USB 2.0高速接口,双功能电源(DRP)
•512 Mbit Octo-SPI闪存
•三个用户LED
•重置和用户按钮
•48 MHz和32.768 kHz晶体振荡器
•板连接器:
–USB Type-C®
–以太网RJ45
–摄像头模块
–带有跟踪信号的MIPI20兼容连接器
–ARDUINO®Uno V3连接器
–ST morpho扩展引脚头,可完全访问大多数STM32 I/O
•灵活的电源选项:ST-LINK USB VBUS、USB连接器或外部电源
•带USB重新枚举功能的板载STLINK-V3EC调试器/编程器:大容量存储、虚拟
COM端口和调试端口
•STM32CubeN6 MCU包提供全面的免费软件库和示例
•支持多种集成开发环境(IDE),包括IAR嵌入式
Workbench®、MDK-ARM和STM32CubeIDE
•由STM32CubeMonitor UCPD(STM32CubeMonUCPD)软件工具处理

开发板硬件框架:



  STM32N6系列:历史上迄今为止最强大STM3单片机,采用了先进的 16nm FinFET 工艺,基于高性能Arm® Cortex®-M55内核,运行频率最高可达800MHz。Cortex®-M55核心采用Arm® Helium™矢量处理技术,除标准微控制器任务外,还能实现高效的数字信号处理。该核心配备浮点单元(FPU),支持单精度和半精度(符合IEEE 754标准)数据处理。Cortex®-M55集成32KB指令缓存(ICACHE)、32KB数据缓存(DCACHE),以及128KB带ECC校验的紧密耦合内存(TCM RAM),确保关键实时任务的可靠性。
   STM32N6是首款内嵌意法半导体自主研发的神经处理单元 (NPU)——ST Neural-ART accelerator™的STM32 MCU,专为节能型边缘AI应用而设计。其时钟频率高达1 GHz,可为计算机视觉和音频应用提供实时神经网络推理能力。其内置的意法半导体自研 Neural - ART 专用 NPU 堪称一大亮点。在运行频率方面有着卓越的表现,能提供高达 600 GOPS 的 AI 算力。与以往的高端 STM32 MCU 相比,算力提升了数倍之多。这意味着它在处理人工智能相关任务时,如机器学习算法、图像识别、语音处理等,速度更快、准确性更高,为智能设备赋予了更敏锐的 “感知” 和 “思考” 能力。
   STM32N6x7xx设备搭载ST Neural-ART加速器,最高运行频率1GHz,通过优化硬件单元提供600Gops算力,专为深度神经网络(DNN)推理功能设计,优化能效表现。内置专用流式引擎,优化数据流并最小化内部缓冲使用与功耗。加速器支持实时权重解压及数据加密/解密。Neo-Chrom图形加速器提供高效的2.5D图形处理,硬件加速功能包括高质量插值缩放、自由旋转、透明度混合、纹理映射及透视变换。针对摄像头应用,提供并行CSI接口及集成硬件图像处理单元(ISP)。ISP支持同一输入流的三个并行处理通道,算法涵盖坏点校正、抽选、黑电平调整、曝光控制、去马赛克、列转换、对比度调整、裁剪、降采样、感兴趣区域(ROI)隔离、伽马校正、YUV转换及像素打包。ISP输出可通过DMA直接馈送至神经网络处理器(NPU)。
    微控制器支持TrustZone®安全分区,配备内存保护单元(MPU)以增强应用安全性。安全启动ROM支持从外部接口进行安全启动。设备内置4.2MB连续SRAM(分多个存储体)、8KB备份SRAM(VBAT模式下可用),以及灵活的外部存储器控制器(FMC),支持静态存储器及XSPI 8/16位配置。设备可选配硬件H.264编码模块,支持基线/主/高配置等级1至5.2,1080p分辨率下帧率最高可达30fps。专用硬件加速器支持快速的JPEG及运动JPEG压缩/解压。
    提供丰富的增强型I/O及外设,工作温度范围-40°C至+125°C,支持1.71V至3.6V供电。全面的低功耗模式(睡眠、停止、待机)支持低功耗应用设计。封装形式为6种VFBGA,引脚数142至264不等。

  图像信号处理器ISP是作为一个独立组件来配合MCU,而STM32N6将ISP嵌入到MCU中,这一创新设计将大幅简化计算机视觉用例,应对MCU上计算机视觉的大部分挑战。那么,将ISP嵌入MCU有哪些优势呢?


  • 用户能够更灵活地更换或升级图像传感 (ISP一次性调优,无需频繁调整参数),能随时间和跨不同产品版本更换图像传感器,无需重复经历完整的画质调整过程;

  • 显著降低CPU在多任务应用场景中的工作负载,降低功耗,并在操作中提供完全的灵活性;

  • 节约图像传感器成本,不必为集成ISP的昂贵图像传感器付费;

  • STM32N6支持MIPI CSI-2接口,内置的ISP可以与其他传感器共用该接口。STM32N6 ISP专为计算机视觉用例设计,与智能手机中的高性能ISP不同。计算机视觉主要关注场景的清晰度和观察对象的相关性。因此,STM32N6的ISP比用于智能手机的先进视觉处理要求低,但非常适合以合理的成本在MCU上处理常用的计算机视觉应用。



开发板硬件:
官方开发板四层办就可以搞定,我噻,可以自己做一个板子了。

软件测评:
时钟树:
GPIO代码:

#include "main.h"


void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ICACHE_Init(void);

int main(void)
{

  HAL_Init();


  SystemClock_Config();

  MX_GPIO_Init();
  MX_ICACHE_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Initialize leds */
  BSP_LED_Init(LED_BLUE);

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {

          BSP_LED_Toggle(LED1);
          BSP_LED_Toggle(LED2);
          BSP_LED_Toggle(LED3);
          HAL_Delay(500);
  }

}

void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Configure the System Power Supply
  */
  if (HAL_PWREx_ConfigSupply(PWR_EXTERNAL_SOURCE_SUPPLY) != HAL_OK)
  {
    Error_Handler();
  }

  /* Enable HSI */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.PLL1.PLLState = RCC_PLL_NONE;
  RCC_OscInitStruct.PLL2.PLLState = RCC_PLL_NONE;
  RCC_OscInitStruct.PLL3.PLLState = RCC_PLL_NONE;
  RCC_OscInitStruct.PLL4.PLLState = RCC_PLL_NONE;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** Get current CPU/System buses clocks configuration and if necessary switch
to intermediate HSI clock to ensure target clock can be set
  */
  HAL_RCC_GetClockConfig(&RCC_ClkInitStruct);
  if ((RCC_ClkInitStruct.CPUCLKSource == RCC_CPUCLKSOURCE_IC1) ||
     (RCC_ClkInitStruct.SYSCLKSource == RCC_SYSCLKSOURCE_IC2_IC6_IC11))
  {
    RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_CPUCLK | RCC_CLOCKTYPE_SYSCLK);
    RCC_ClkInitStruct.CPUCLKSource = RCC_CPUCLKSOURCE_HSI;
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct) != HAL_OK)
    {
      /* Initialization Error */
      Error_Handler();
    }
  }

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_NONE;
  RCC_OscInitStruct.PLL1.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL1.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL1.PLLM = 1;
  RCC_OscInitStruct.PLL1.PLLN = 25;
  RCC_OscInitStruct.PLL1.PLLFractional = 0;
  RCC_OscInitStruct.PLL1.PLLP1 = 1;
  RCC_OscInitStruct.PLL1.PLLP2 = 1;
  RCC_OscInitStruct.PLL2.PLLState = RCC_PLL_NONE;
  RCC_OscInitStruct.PLL3.PLLState = RCC_PLL_NONE;
  RCC_OscInitStruct.PLL4.PLLState = RCC_PLL_NONE;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_CPUCLK|RCC_CLOCKTYPE_HCLK
                              |RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1
                              |RCC_CLOCKTYPE_PCLK2|RCC_CLOCKTYPE_PCLK5
                              |RCC_CLOCKTYPE_PCLK4;
  RCC_ClkInitStruct.CPUCLKSource = RCC_CPUCLKSOURCE_IC1;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_IC2_IC6_IC11;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV1;
  RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV1;
  RCC_ClkInitStruct.APB5CLKDivider = RCC_APB5_DIV1;
  RCC_ClkInitStruct.IC1Selection.ClockSelection = RCC_ICCLKSOURCE_PLL1;
  RCC_ClkInitStruct.IC1Selection.ClockDivider = 2;
  RCC_ClkInitStruct.IC2Selection.ClockSelection = RCC_ICCLKSOURCE_PLL1;
  RCC_ClkInitStruct.IC2Selection.ClockDivider = 4;
  RCC_ClkInitStruct.IC6Selection.ClockSelection = RCC_ICCLKSOURCE_PLL1;
  RCC_ClkInitStruct.IC6Selection.ClockDivider = 4;
  RCC_ClkInitStruct.IC11Selection.ClockSelection = RCC_ICCLKSOURCE_PLL1;
  RCC_ClkInitStruct.IC11Selection.ClockDivider = 8;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
}

/**
  * [url=home.php?mod=space&uid=247401]@brief[/url] ICACHE Initialization Function
  * @param None
  * @retval None
  */
static void MX_ICACHE_Init(void)
{

  /* USER CODE BEGIN ICACHE_Init 0 */

  /* USER CODE END ICACHE_Init 0 */

  /* USER CODE BEGIN ICACHE_Init 1 */

  /* USER CODE END ICACHE_Init 1 */

  /** Enable instruction cache in 1-way (direct mapped cache)
  */
  if (HAL_ICACHE_ConfigAssociativityMode(ICACHE_1WAY) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_ICACHE_Enable() != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN ICACHE_Init 2 */

  /* USER CODE END ICACHE_Init 2 */

}

/**
  * @brief GPIO Initialization Function
  * @param None
  * @retval None
  */
static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
/* USER CODE BEGIN MX_GPIO_Init_1 */
/* USER CODE END MX_GPIO_Init_1 */

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOE_CLK_ENABLE();
  __HAL_RCC_GPIOH_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /*Configure GPIO pin : I2C1_SDA_Pin */
  GPIO_InitStruct.Pin = I2C1_SDA_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;
  HAL_GPIO_Init(I2C1_SDA_GPIO_Port, &GPIO_InitStruct);

  /*Configure GPIO pins : VCP_TX_Pin VCP_RX_Pin */
  GPIO_InitStruct.Pin = VCP_TX_Pin|VCP_RX_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  GPIO_InitStruct.Alternate = GPIO_AF3_LPUART1;
  HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

  /*Configure GPIO pin : I2CA_SCL_Pin */
  GPIO_InitStruct.Pin = I2CA_SCL_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;
  HAL_GPIO_Init(I2CA_SCL_GPIO_Port, &GPIO_InitStruct);

  /*Configure GPIO pins : I2C2_SDA_Pin I2C2_SCL_Pin */
  GPIO_InitStruct.Pin = I2C2_SDA_Pin|I2C2_SCL_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  GPIO_InitStruct.Alternate = GPIO_AF4_I2C2;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  /*Configure GPIO pins : PA10 UCPD1_VSENSE_Pin */
  GPIO_InitStruct.Pin = GPIO_PIN_10|UCPD1_VSENSE_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

/* USER CODE BEGIN MX_GPIO_Init_2 */
/* USER CODE END MX_GPIO_Init_2 */
}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  __disable_irq();
  while (1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */
  点灯OK


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:项目经理
简介:资深嵌入式开发工程师

85

主题

167

帖子

3

粉丝