陆陆续续做了这么多期STM32N6的过程记录,本期博主来理一理如何上手STM32N6这个系列以及学习这个系列需要有哪些注意的地方。
首先对于STM32N6的开发使用在对比过H系列、F系列、W系列中,N6是我认为开发难度最高的,无论是互联网上的经验贴分享、还是官方的示例资料都相对比较匮乏,尤其是在使用中难免遇到一系列奇奇怪怪的问题,在遇到这些问题如何快速定位和迅速解决这需要很深厚的嵌入式功底。
因此本系列仅作参考,欢迎通过主页联系方式交流开发心得和经验。
1、系统烧录和程序启动
首先最开始的还是从流水灯开始,STM32N6570-DK开发板上总共有两颗流水灯:PG10和PO1。第一个阶段的目标是点亮开发板上的流水灯为目标:
在这个阶段我们需要搞明白:STM32N6的三种启动方式:FSBL直接启动、FSBL+XIP、FSBL+Load&RUN。
在这个阶段我推荐学会FSBL+XIP的工作模式,学会两个部分的工程代码编写和签名(这个很重要)以及烧录方式。
可以参考本系列:
STM32N6的开发日记(1):上手难度拉满的N6有哪些不同?
STM32N6的开发日记(2):配置、签名、烧录,配置外部Flash实现LED灯闪烁
这里需要注意的踩坑点是:签名代码在CubeProgram2.22版本和2.22版本之前是有区别的。2.22版本需要加上-align指令来做对其否则烧录进去也无法运行。
其次要学会配置XSPI,正常使用外部Flash和外部RAM,例如在使用中发现,XSPI的时钟虽然在时钟树中支持200MHZ,但是发现100MHZ以上系统就无法工作了,这个现象可以去ST官方论坛有讨论贴。
这里我更推荐是使用50MHZ-100MHZ,官方说要使用200MHZ要配置OPT设置,但是好像一不小心板子就会变砖。
2、LTDC显示
在点亮系统的LED灯之后,就可以去尝试点亮STM32N6的LCD显示屏,通过LTDC配置可以方便的操控LCD显示屏。
这里需要查看屏幕的参考手册,配置垂直显示参数和水平显示参数不要出错。
可以参考本系列:
STM32N6的开发日记(4):快速上手LTDC显示图片-让屏幕刷新丝滑流畅
这里面踩坑较多的点是RIF没有配置导致LTDC内存访问异常,曾经这个配置困扰了我很久,在STM32N6使用的过程中一定要注意RIF配置,给外设足够的权限去访问内存。
还有就是学会把图像缓存区放到外部RAM,但是需要注意的是如果屏幕出现了撕裂的现象,那么大概率是图像在外部RAM的吞吐速率赶不上刷新速率。所以要合理的规划一下图像缓存位置。
3、DCMIPP和ISP
DCMIPP和ISP包括CSI相机的配置,CSI的配置包括I2C一起使用官方推荐的摄像头:IMX335。
DCMIPP用于读取CSI相机的输出画面, 这里要清楚DCMIPP的三个管道作用,学会画面的获取、缩放。同时这里也要注意DCMIPP的RIF权限问题,没有足够的权限也会在访问内存的时候异常。
使用ISP需要了解官方的ISP调试工具,这里我更推荐直接使用官方调试好的库和API接口。
具体可以参考:
STM32N6的开发日记(5):数字摄像头接口像素流水线DCMIPP让MCU拥有高性能摄像头资源
STM32N6的开发日记(6):用ISP中间件点亮IMX335相机的专业画质
4、神经网络的应用和部署
在学会了如何使用DCMIPP获得摄像头图像以及LTDC显示的时候,我们就开始尝试去使用CubeAI中间件去部署神经网络模型。
在最开始是推荐官方提供的一系列神经网络模型用于联手。
官方的AI Model库提供了一个Yolov8n的单目标检测人体识别模型,这个模型接收320*320*3的uint8原始数据输入,输出1*2100*5的float32类型输出。
在学习这个项目的时候要学会:DMCIPP获取摄像头图像后缩放到合适的尺寸(320*320)送入神经网络输入缓存区;获取神经网络输出缓存区地址,拿到计算结果对计算结果进行后处理。
进行后处理并成功绘图之后,就以及初步的掌握了在STM32N6中部署模型的基础。
具体可以参考本系列:
STM32N6的开发日记(7):摄像头+NPU联动,完成 YOLO 实时目标检测与显示
STM32N6的开发日记(10):从训练到部署一个火焰识别模型
这里面的坑点很多很多,例如内存冲突、时钟休眠冲突、神经网络后处理的问题等等。
5、自训练模型
如果成功部署了一边官方提供的模型之后,我们就可以开始尝试自己去训练模型和部署,这里需要大家有着比较深厚的神经网络基础,如果是使用Yolo模型的话,不建议使用Yolo10及以上的模型会遇到算子冲突的问题,需要自己去修改yolo模型的底层。
yolo8及以下的模型需要掌握模型量化的方法,Yolo官方所提供的量化方法比较简单,但是不支持改成uint8类型输入,需要自己去魔改。
使用Tensorflow也可以把yolo训练出来的.pt格式模型先转为onnx格式,再转为tflite格式,可以实现uint8类型输入,不过非常非常的繁琐,为了方便还是推荐转成int8输入int8输出的,不必要追求省略预处理的过程。
还有就是利用Tensorflow来自己训练模型,但是比较蛋疼的是Tensorflow在Windows前几年就已经不支持了,要么使用CPU进行训练,要么就要花费很多时间和精力去改CUDA版本,nnCuda配置去让最晚的那个Tensorflow可以在Windows上跑GPU的版本成功的运行起来。
这一系列的操作都需要使用者对模型训练、部署有着非常清晰的认识。
如果解决了上述一系列问题,那么对于模型的构建无非就是输入不同、输出不同的问题了,对于不同的模型只是预处理不同和后处理的区别罢了:
具体可以参考:
STM32N6的开发日记(11):从头构建一个SSD目标检测并部署
这里稍稍埋一个大坑,大家可以在评论区讨论一下使用STM32N6遇到的难点和部署神经网络遇到的困难等等。
117