参加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
|