iTOP-STM32MP157开发板采用ST推出的双核cortex-A7+单核cortex-M4异构处理器,既可用Linux、又可以用于STM32单片机开发。开发板采用核心板+底板结构,主频650M、1G内存、8G存储,核心板采用工业级板对板连接器,高可靠,牢固耐用,可满足高速信号环境下使用。共240PIN,CPU功能全部引出:底板扩展接口丰富底板板载4G接口(选配)、千兆以太网、WIFI蓝牙模块HDMI、CAN、RS485、LVDS接口、温湿度传感器(选配)光环境传感器、六轴传感器、2路USB OTG、3路串口,CAMERA接口、ADC电位器、SPDIF、SDIO接口等
第三十五章 A7 和 M4 联合调试
在前面的几个章节之中,我们一直所使用的都是通过仿真器,将程序下载到 SRAM中运行,开发板掉电后程序就会丢失,这种方式适合在 Cortex-M4 开发调试阶段,也叫工程模式(Engineering Mode)。而当我们在实际的使用过程中,这样明显是不可以的,而本章节将会讲解如何在 Linux 操作系统中使用 Cortex-A7 去加载、启动和停止运行Cortex-M4 的固件。
35.1 调试前的准备工作
首先最实现联合调试的基本要求:
- 必须使用yocto文件系统
- 连接串口线和otg线和对应的LINK调试器
Yocto文件系统的存放路径为“iTOP-STM32MP157开发板网盘资料汇总\03_文件系统源码和镜像\06_yocto文件系统\04_烧写镜像文件\image”,将该镜像烧写到TF卡或者EMMC中,烧写完成之后,将拨码开关设置为对应的启动模式,进入uboot倒计时之后,按下任意键,进入uboot命令行,如下图所示:
我们接下来输入以下命令
setenv bootsystem yocto
saveenv
设置启动系统为yocto并且将设置保存,然后输入reset命令重启系统,重启完成进入系统如下图所示:
该文件系统,会默认虚拟一个usb网卡,通过otg线连接到电脑上,我们使用命令“ifconfig”来查看开发板的网络设备列表,如下图所示:
然后打开Windows端的设备管理器,我们测试应该会有以下三个设备,分别为
1 ) CH340 开发板的打印串口设备
2 ) ST-Link 仿真器调试设备
3 ) remote NDIS USB虚拟网卡设备
如下图所示:
至此我们调试前的准备工作就完成了。
35.2 使用 STM32CubeIDE 进行调试
在这里,我们以按键工程来进行A7和M4联合调试的例子,打开工程之后如下图所示:
首先我们需要设置串行过滤器,因为默认情况下,STM32CubelDE是只将 STMicroelectronics 和 FTDI 设备作为首选的串行设备,其它设备无法识别,所以我们要关闭默认选项而选择我们需要的设备,点击Windows菜单栏下的preferences(偏好)选项,进入preferences界面,如下图所示:
然后我们选择STM32Cube进入MPU Serial菜单栏,勾选Remove filter 然后选择我们的CH340对应的端口,作者这里为COM3,选择完成之后点击右下角的Apply and Close,如下图所示:
应用之后,回到初始界面,我们点击爬虫debug旁的小三角,点击Debug Configurations,进入debug设置界面,如下图所示:
然后我们点击 KTY_CH4 DEBUG 进入该工程的配置界面,选择调试器窗口。Load mode 选择为thru Linux core,连接端口选择为我们的打印串口COM3(这里可能会找不到设备,原因为该版本的STM32Cubeide自身的bug问题,需要降低版本,低版本的存放路径为“iTOP-STM32MP157开发板网盘资料汇总\01_开发所需PC软件\12_STM32CubeIDE软件”下的st-stm32cubeide_1.4.0_7511_20200720_0928_x86_64.exe),Inet Address 已经默认为我们设置好了,不需要我们进行设置,然后我们点击debug按钮,如下图所示:
接下来会弹出以下界面,我们选择同意点击yse即可:
随后会出现load 进度条窗口,等待文件传输完成,如下图所示:
加载完成之后,回到我们的串口终端界面,会显示如下信息:
至此我们的KEY工程就加载完成了,此时,按下VOL-可以看到LED3状态反转,按下BACK按键可以看到BEEP蜂鸣器状态反转。如果我们想停止程序的运行,只需要回到STM32CubeIDE软件,点击红色方块结束程序的调试即可,如下图所示。
35.3 手动调试
在上面的两个小节中,我们使用了STM32CubeIDE软件进行调试,这样确实通过A7核来启动了M4核心的例程,但是这样操作也是不方便的,需要STLINK调试,还需要虚拟网卡将M4工程传递到开发板上,本小节所实现的是通过对应的脚本来实现M4核的应用开启和结束,而且不再局限于yocto系统,不再需要USB虚拟网卡。
首先我们要知道STLINK是如何进行调试的,来到STM32CubeIDE软件的项目列表,可以看到KEY_CM4工程下的RemoteProc目录下有一个 fw_cortex_m4.sh脚本文件,STM32CubeIDE软件正是通过该脚本来对程序进行调试。
打开该脚本之后,内容如下:
1 #!/bin/sh2 rproc_class_dir="/sys/class/remoteproc/remoteproc0"3 fmw_dir="/lib/firmware"4 fmw_name="KEY_CM4.elf"5 6 cd $(/usr/bin/dirname $(/usr/bin/readlink -f $0))7 8 if [ $1 == "start" ]9 then10 # Start the firmware11 if [ -f /lib/firmware/$fmw_name ]; then12 /bin/rm -f /lib/firmware/$fmw_name13 if [ $? -ne 0 ]; then14 exit 115 fi16 fi17 /bin/ln -s $PWD/lib/firmware/$fmw_name $fmw_dir18 if [ $? -ne 0 ]; then19 exit 120 fi21 /bin/echo -n "$fmw_name" > $rproc_class_dir/firmware22 /bin/echo -n start > $rproc_class_dir/state23 fi24 25 if [ $1 == "stop" ]26 then27 # Stop the firmware28 /bin/echo -n stop > $rproc_class_dir/state29 fi
下面将对该部分代码进行部分讲解。
首先2-4行定义了三个变量,分别为rproc_class_dir、fmw_dir、fmw_name,rproc_class_dir是加载、启动和停止固件的文件操作路径,fmw_dir是我们工程固件存放的路径,而fmw_name正是我们工程固件的名称信息。我么先来到工程固件存放的路径下也就是/lib/firmware目录下如下图所示:
可以看到我们在上一小节中通过STM32CubeIDE烧录进的KEY_CM4.elf固件。然后我们使用命令“ls -l”,查看文件的链接信息,如下图所示:
可以看到我们的KEY_CM4.elf固件是从/usr/local/projects/KEY_CM4/lib/firmware/路径下的KEY_CM4.elf文件链接来的。我们来到/usr/local/projects/KEY_CM4路径下,如下图所示,会发现该目录下会存在一个fw_cortex_m4.sh文件,查看文件信息之后会发现该文件正是我们正在解释的文件。
随后的第六行命令正是来到fw_cortex_m4.sh文件所在的目录下。
之后的内容就比较简单,分为了两种情况,分别为start和stop分别代表了固件的开启和结束。既然我们几经了解到了固件的启动和停止,那我们现在要解决的问题是,如何不通过STM32CubeIDE来调试固件,首先KEY_CM4.elf文件是我们一定要拷贝到开发板的,再上一章节中,我们是通过usb虚拟网卡来拷贝的,而本小节我们为了方便可以直接通过U盘或者TF卡来拷贝KEY_CM4.elf文件,固件存放的路径为每一个工程目录下的CM4/Debug文件夹下,如下图所示:
将该固件KEY_CM4.elf拷贝到开发板上,拷贝完成如下图所示:
然后我们在开发板的同一目录下,使用命令“vi fw_m4_itop.sh”建立fw_m4_itop.sh文件,然后仿照fw_cortex_m4.sh文件来改写一个适合我们当前状况的脚本文件,为了方便起见我们将该脚本存放在了“iTOP-STM32MP157开发板网盘资料汇总\06_Cortex-M4实验例程”路径下,内容如下:
#!/bin/shrproc_class_dir="/sys/class/remoteproc/remoteproc0"if [ $2 == "start" ]then/bin/echo -n $1 > $rproc_class_dir/firmware/bin/echo -n start > $rproc_class_dir/statefiif [ $2 == "stop" ]then/bin/echo -n stop > $rproc_class_dir/statefi
内容添加完成之后,保存退出,,然后使用命令“chmod 777 fw_m4_itop.sh”给予fw_m4_itop.sh权限,如下图所示:
然后我们使用命令
./fw_m4_itop.sh KEY_CM4.elf start
来运行KEY_CM4.elf固件,如下图所示:
此时,按下VOL-可以看到LED3状态反转,按下BACK按键可以看到BEEP蜂鸣器状态反转。如果我们想停止程序的运行,只需要再使用以下命令即可,如下图所示:
./fw_m4_itop.sh KEY_CM4.elf stop
此时该固件就会停止运行。该脚本的第一个参数为固件名称,第二个参数为对应的start运行和stop停止。
至此我们呢的A7和M4联合调试的内容就结束了。