工程模板问题排查之前发现生成的工程文件无法正确进入执行阶段,参考上文【STM32H7S78-DK评测】开发板初识与工程模板创建 - STM32团队 ST意法半导体中文论坛 (stmicroelectronics.cn)。对比Template_XIP的文件夹ioc数据发现,新工程与官方工程的Project,对于库文件的拷贝策略存在差异,这里查找到对应的参数设置是“Project Manager.LibraryCopy”,但是尝试将对应设置参数修改为1后,没有完全生效,依旧是暗显状态。Ioc文件设置的库文件拷贝目前存在一定的差异,不过这个差异应该不影响最终程序的执行。该选项的解释,如图3,在使用一个库时,会拷贝这个库的全部内容,但是这个弹出的灰色消息并不是这个选项不能选中的原因。 图 1 ioc显示界面库复制选项,第一个选型不可选择 图 2 ioc文件内部脚本信息,设定库文件拷贝选项的参数 图 3 鼠标停留在选项一上,显示的提示 转换思路,由于程序可以正常编译与下载,这个就比较方便了,通过进入Boot进行Debug,查看具体卡在哪一步,发现存在以下问题。JumpToApp是一个指针函数,这个函数指向的位置就是外部储存的程序地址,在给指针函数赋值时,发现程序卡住不执行了。最终程序停止的位置是地址“0x7000166e”位置,这个地址是外部FLASH的地址,由于还处于Boot工程下,没有加载Appli工程的符号文件,这里显示的是地址信息。通过这个地址信息,查找编译生成的.map文件,发现该地址存储的函数是“HardFault_Handler”。顾名思义,MCU这时候发生了硬错误。一般导致硬错误的原因有错误配置信息,或者空指针之类的情况。这里发生这个错误,多半在是内存管理上存在一些错误设置,内存的地址是对的,但是这个地址对于当前的程序来说不可以读写,从而造成判断为空指针的情况,但是这里直接跳转的HarFault处理函数,应该也是启动文件中关联的地址信息,实际上依旧停留在给JumpToApp这个指针函数赋值的语句中。 图 4 Boot程序执行到这个位置,存在错误提示 图 5 跳转的相关地址信息,从内容上看,是正确的外部内存位置 图 6 查看生成的map信息文件,可以看到最终跳转的0x7000166e的程序内容 查看建立好的工程ioc文件MPU部分,MPU就是内存保护单元,涉及到对各个部分存储的管理,之前使用的是推荐的默认设置,现在发现这部分内容已经变成灰色,这个不可更改的原因到底是什么原因导致的,我百思不得其解,尝试了很多方式,比如直接修改ioc文件的原文内容,始终是灰色的。这里有遇到过相同经历的同学,也欢迎一起讨论。根据我的分析这个情况出现的原因大概率是在保存环节出现了错误,STM32CubeMX没有对ioc文件进行二次校验,导致文件缺少了某个隐藏的设置信息,在读取时候,没有读取到该隐藏信息,从而导致这个部分的设置出于灰色不可设置的状态,这个隐藏信息很有可能就是对这个功能词条是否激活开启的设置。这个情况比较特殊,我这面也是第一次遇到,测试了一下自己的猜测。 图 7 ioc的mpu部分显示不可更改 通过创建test0on.ioc与test1off.ioc文件进行对比发现,在对MPU的设置中,主要分为两个部分,一个是MPU的基本条件设置,一个是对各个部分内存的详细设置。通过对比不能设置MPU的ioc文件设置,发现多出了“Enable_S-Cortex_Memory_Protection_Unit_Region1_Settings_S”等一系列设置,这部分S-Cortex_Memory_Protection_Unit到底是哪方面的设置,查找了相关参考手册,网上,arm官方网站,st官方网站,都没有查找到相关内容。在ioc文件这部分,不得已,选择重新创建新的ioc文件,来解决这个问题。 图 8 开启MPU与不开启MPU,ioc文件设置对比 图 9 开启MPU与不开启MPU,ioc文件设置其他参数比对 图 10 开启MPU与不开启MPU,ioc文件设置其他参数比对 图 11 不可修改MPU设置的ioc文件内容 修改MPU部分,需要对各部分地址的功能及作用有所了解,这里主要是对外部的内存和FLASH存储进行设置,地址信息分别是0x70000000和0x90000000。其他地址的设置,参考下图详细的地址位置。 图 12 STM32H7S7L8存储地址与外设地址 图 13 开发板晶振原理图 图 14 说明书中关于晶振的描述
图 15 LSE 原理图 在创建ioc文件过程中,对于晶振的设置,这里特别主要到24MHz的HSE是ocillator,32.768kHz的LSE是crystal,原理图上也可以看出两者存在差别,使用的引脚数量不同。STM32CubeIDE中提供了三个选项:BYPASS Clock Source 旁路时钟,DIGBYPASS Clock Source 数字时钟(数字信号提供时钟)以及Crystal/Ceramic Resonator 晶体/陶瓷谐振器。参考其他官方模板文件(STM32CubeMX选择Board,选择STM32H7S78-DK开发板的默认配置ioc文件),这里的高速时钟HSE应该选择第二个选项,低速时钟LSE依旧选择晶振选项。官方的ioc文件在EXTMEM_LOADER和EXTMEM_MANAGER选项中并没有进行设置,在设置环节,发现部分选项又是存在不可选择的问题,有些引脚被强制锁定不可做任何的更改,所以对于这个模板,主要还是参考的意义大于使用意义,部分需要使用的外设和功能设置可以参考这个官方给的开发板的模板文件设置。 图 16 官方的模板也有一些设置无法更改,存在错误,使用cubeMX直接编辑的形式 在生成的工程中,修改调试配置,在Appli的调试设置中增加Boot工程内容,需要特别注意的是最后一个选项,是否加载符号,如果选中加载符号,在调试过程中会从Boot工程中开始,相当于是整个板子正常启动的过程,如果不选中,则会从Appli工程中开始,也就是要调试的工程进行。 图 17 调整配置信息部分 由于之前的曲折经历,这次在设置ioc文件时,每一步都进行保存,生成代码,编译测试是否可用。同时时刻观察MPU这部分设置是否被重置为不可修改状态。在对Boot工程的MPU进行设置时,发现使用MPU默认设置,同时增加对外部RAM及FLASH的MPU设置后,在生成的第一个对4GB空间的设置存在问题,进入程序后,会进入“MemManage_Handle“函数中,也就是说产生了错误,需要将这个选项关闭才行。但是在Appli工程中,开启这个默认的4GB的空间地址设置,并没有影响程序的运行,具体原因有待分析。 图 18 全配置的话产生内存错误 在模板创建过程中,对显示屏的相关接口设置中,发现不能对I2C1进行设置,就像图片中显示的这样,选中I2C1,但是功能选项依旧是出于关闭状态。这时候先不要着急,因为之前可以配置,现在不能配置,肯定是有原因的。鼠标停留在I2C1这个选项上,会弹出特别提示,需要对FLASH进行配置之后,才能够对I2C1进行配置,后来发现I3C也是需要这样,但是I2C2和I2C3接口则不需要这样,可以直接激活进行配置。不过显示的说明信息也并没有解释个所以然,查询数据手册I2C部分,里面没有提到这部分的原因,查看参考手册,依旧也没有提到I2C与FLASH的关联性,测试了一下其他STM32H7S7以及STM32H7S3系列的芯片,在对I2C1进行设置时,都需要先对FLASH IP进行设置。 图 19 LTDC部分存在严重问题,无法对i2C进行配置,使用cubeMX直接编辑 图 20 鼠标停留产生的说明信息 这里点开FLASH设置页面,发现其中用户配置2中,有这么一个设置,SRAM的ECC校验,这部分内容与I2C与I3C有密切关联,这部分的设置应该是影响到了I2C1以及I3C1的具体工作模式,从而在想直接对I2C1进行设置时,需要先对FLASH进行设置。FLASH_OBW2SRP,FLASH的选项状态寄存器,状态中有I2C_NI3C的比特位。这部分应该是涉及电路部分相关设置,详细细节需要查看这个版本的FLASH部分相关介绍,这个具体内容,待后面看到之后再分享出来,这部分不单单是FLASH,还涉及到ECC的部分。 图 21 FLASH IP设置页面 在接下来设置SD卡接口过程中,还会存在错误,这里是初始化环节,在获取时钟频率时,错误,返回0,最终进入Error_handle,产生这部分错误的原因,尚未得知,这部分内容待后续做视频部分再进行测试查找,应该是那处配置设置错误导致的。 图 22 SD卡初始话环节出错 图 23 时钟信号未成功获取 图 24 最终调试测试JumpToApp这部分可以正常运行 经过测试验证,可以正常进入程序 新的工程模板,这里就不作过多展开,参考project文件夹下内容。 运动部分自由度设计整个太阳能电池板姿态主要是倾斜角度与姿态变化,两个自由度,一个旋转,一个倾斜,已经可以适应大多数情况,这里出于实验目的,采用3个自由度的来控制整个电池板的姿态。采用步进电机控制的方式,步进电机比较易于控制,控制简单,而且成本低廉,更加适合测试与实验。当然,后续也会在实验的过程中,针对需要高精度控制需求的地方进行加装编码器,实现更高精度控制。 图 25姿态,方向与角度图 在编写程序过程中,需要养成的习惯是系统生成的文件中,做修改内容需要写在图中注释之间,这样在使用STM32CubeIDE重新生成时,会保留注释之间的代码,不会因为新生成的的原因直接删除。这类注释内容基本上提示USER CODE BEGIN XXXXX ,XXXXX表示开始位置,USER CODE END XXXXX 表示结束位置。 图 26 在使用STM32CubeIDE需要注意的点 将Appli工程转换为C++模式,调整主程序初始化部分代码,接下来对引脚部分进行调整,首先根据原理图设计哪些引脚可以用来控制步进电机。 图 27 STMod+接口原理图 STmod+涉及的引脚包含的具体功能,这里通过列表的方式显示。
这里STMod+给出的引脚如上面列表,步进电机控制主要是三根线,分别是使能,脉冲,方向,其中脉冲一般要求高电平持续时间要达到1微秒以上。查询数据手册,以下引脚属性都是FT_h属性,即支持5V的耐受电压,支持低电压状态高速输入输出。这里面有一部分引脚配置为通信引脚,还有一部分配置为定时器输入捕获引脚。 图 28 引脚配置详细信息 控制步进电机基本逻辑,检测到需要控制步进电机运动时,计算脉冲总数以及脉冲方向。手边有的步进电机,转一圈需要的脉冲总数是25000,旋转一度需要的脉冲数是69.4左右,这里需要确认的是每次上电启动阶段,初始化步进电机的初始位置。因为电机是增量控制,不确定初始位置,会导致电机撞击到周围物体。这里程序部分工作原理主要是参考3D打印中的控制系统Marlin的运动控制环节,简化了一部分用不到的代码部分,这里简化为两个主要的处理文件。Motion主要用来控制运动轨迹,stepper主要用来控制步进电机脉冲生成等。 由于时间有限,目前步进电机的控制程序部分没有完全完成,后续周末期间,针对程序部分进行一些简单介绍以及对于神经网络部分内容的相关介绍与一些必要的组件安装,涉及到python的一些库文件下载,网络不稳定的地区可能特别耗费时间,下载失败,需要重复不断的重试,直到成功为止,否则一些模型训练无法进行。 图 29 尚未完成的步进电机控制部分程序 源码地址 |
【STM32H7S78-DK】汽车仪表系统
【Hot!】STM32全系列开发板都支持Arduino开发,你知道吗?
【STM32H7S78-DK】基于 rtthread 适配 lcd 驱动移植 lvgl
【NUCLEO-WB09KE评测】BLE创建服务和写特征控制LED
【STM32H7S78-DK评测】TouchGFX (QR Code)二维码生成器
【STM32H7S78-DK】rtthread 增加 psram 内存管理
【STM32H7S78-DK】开箱与rtthread工程初体验
【STM32H7S78-DK评测】-5 LVGL&DMA2D DEMO测试
【STM32H7S78-DK评测】-4 LTDC&DMA2D 基本测试
【STM32H7S78-DK评测】CoreMark移植和优化--兼记printf重定向实现方法及常见问题
感谢分享