0.主机环境
我的主机是wsl2, ubuntu20.04.2 LTS
1.MYZR开发板缺省IP
192.168.137.81
ifconfig eth0 192.168.137.66 netmask 255.255.255.0
2.CAN测试
ip link set can0 down
ip link set can0 type can tq 40 prop-seg 86 phase-seg1 86 phase-seg2 25 sjw 4
ip link set can0 up
cansend can0 123#000102030405060708
candump can0
3.串口测试
3.1 Shell操作
设置串口参数
stty -F /dev/ttySTM2 speed 9600 cs8 -parenb -cstopb
echo发送hex
echo -e -n "AT?\xd\xa">>/dev/ttyS4
3.2 minicom操作
minicom -s 参数设置
minicom Hex显示接收数据
minicom -H
4.开发环境配置
安装
运行meta-toolchain-qt5-openstlinux-eglfs-stm32mp1-x86_64-toolchain-3.1-snapshot.sh后,开发工具安装在 /opt/st/stm32mp1/3.1-snapshot
环境设置
source /opt/st/stm32mp1/3.1-snapshot/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
查看交叉编译环境
$CC -v
显示如下
Using built-in specs.
COLLECT_GCC=arm-ostl-linux-gnueabi-gcc
COLLECT_LTO_WRAPPER=/opt/st/stm32mp1/3.1-snapshot/sysroots/x86_64-ostl_sdk-linux/usr/libexec/arm-ostl-linux-gnueabi/gcc/arm-ostl-linux-gnueabi/9.3.0/lto-wrapper
Target: arm-ostl-linux-gnueabi
环境变量设置成功
测试
hello.c
#include <stdio.h>
void main()
{
printf("hello stm32mp157!\n");
}
$CC hello.c
生成a.out可执行文件
file a.out
a.out: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, BuildID[sha1]=8d80ab8fd22fff68fe34a5e6daaa7984a8901534, for GNU/Linux 3.2.0, with debug_info, not stripped
显示该文件为32位ARM执行文件,交叉编译成功
上传a.out到开发板执行
can_recv.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <linux/can.h>
#include <linux/can/raw.h>
int main()
{
int s, nbytes, i;
struct sockaddr_can addr;
struct ifreq ifr;
struct can_frame frame;
struct can_filter rfilter[1];
s = socket(PF_CAN, SOCK_RAW, CAN_RAW); //创建套接字
strcpy(ifr.ifr_name, "can0" );
ioctl(s, SIOCGIFINDEX, &ifr); //指定can0 设备
addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;
bind(s, (struct sockaddr *)&addr, sizeof(addr)); //将套接字与can0 绑定
//定义接收规则,只接收表示符等于0x11 的报文
rfilter[0].can_id = 0xb;
rfilter[0].can_mask = CAN_SFF_MASK;
//设置过滤规则
//setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, &rfilter, sizeof(rfilter));
while(1)
{
nbytes = read(s, &frame, sizeof(frame)); //接收报文
//显示报文
if(nbytes > 0)
{
printf("ID=0x%03X DLC=%d data=", frame.can_id,
frame.can_dlc);
for(i=0;i<frame.can_dlc;i++)
{
printf("%02X ",frame.data[i]);
}
printf("\n");
}
}
close(s);
return 0;
}
5.安装Qt
开发板Qt版本为Qt15.4.1, 在Index of /archive找到对应版本下载。
点击对应版本的Detail,会显示中国的镜像网址,找一个最快的进行下载qt-opensource-linux-x64-5.14.1.run
运行上述文件,进行安装。需要安装Qt本身和开发工具,选择用到的模块即可。安装之前关闭网络,这样可以跳过登录环节。
6.采用QtCreator开发ARM图形程序
启动QtCreator, /mnt/d/wsl_mounted/Qt5.14.1/Tools/QtCreator/bin/qtcreator
QT交叉编译Kits设置,新建kit,选择对应的编译器和make版本。这样就可以成功build项目。把生成的目标文件上传到目标板运行。(在线调试后面再研究)
运行前,先输入psplash-drm-quit 关闭splash。
如果是从SSH中启动Qt程序,需要先输入unset DISPLAY 解决SSH无法连接XServer问题!
root@stm32mp1:~/my_work# ./analogclock
qt.qpa.input: xkbcommon not available, not performing key mapping
Attribute Qt::AA_ShareOpenGLContexts must be set before QCoreApplication is created.
运行时提示错误,main.c中做如下修改。
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts);
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
如果提示错误,line 1: syntax error: unexpected ")"。说明运行的PC版本,不是ARM版本!
6.Qt开发进阶
STM32MP157自带GPU,最高支持1366*768分辨率。如果需要HDMI外接显示器,则需通过把LCD显示接口转换为HDMI。系统出厂设置为1280*720,因为有些显示器不支持1366*768。
6.1中文字体
出厂系统字体放在/usr/share/fonts,新建目录windows,复制字体文件到/usr/share/fonts.
运行 fc-cache -fv更新缓存,运行fc-list就可以看到新字体生效了
6.2 窗口缩放比例
ARM上运行时,发现显示字体比设计时偏小。但在主机运行时和设计时是一样的。控件的位置和大小是一样的。
解决办法
因为QT在ARM板上计算DPI值错误。
解决的方法就是设置好qt的dpi。
qt是根据显示器的物理长度或者宽度于分辨率的关系来计算dpi的。
export QT_QPA_PLATFORM=eglfs:size=1280x720:mmsize=128x72:offset=0x0
size指定屏幕分辨率,mmsize指定屏幕物理尺寸。offset指定偏移量。
这样qt在所有的平台上显示的字体都一样大了 就好了。
好象没用!
int main(int argc, char *argv[])
{
QApplication::setAttribute(Qt::AA_ShareOpenGLContexts);
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QApplication a(argc, argv);
const float DEFAULT_DPI = 96.0;
float dpiX = 596;
float fontSize = dpiX / DEFAULT_DPI;
QFont font = a.font();
font.setPointSize(font.pointSize()*fontSize);
a.setFont(font);
MainWindow w;
w.show();
return a.exec();
}
上述代码可以调整比例,但有个前提,Qt Widget的字体是系统缺省字体(这里是Sans serif 9), 改过之后就不起作用了!
7. gdb远程调试Qt程序
7.1 解决OpenSSH的Key报错问题
ssh报错“no matching host key type found. Their offer: ssh-rsa,ssh-dss“
原因:OpenSSH 7.0以后的版本不再支持ssh-dss (DSA)算法。
查看ssh版本:ssh -V
可以通过修改ssh全局配置解决该问题
vim ~/.ssh/config
Host *
HostkeyAlgorithms +ssh-rsa
PubkeyAcceptedAlgorithms +ssh-rsa
7.2 QtCreator项目配置
7.2.1 新建Device
创建一个新的Device,如下图
点击Test, 结果如下
设备连接成功,但提示不支持rsync,用SFTP替代。这个后面的设置中会用到
7.2.2 新建Debugger
在对应的Kits中选择刚刚建立的arm debugger.
7.2.3 自动上传配置
画线几个地方需要手动修改,其它用缺省配置即可
7.3 运行和调试
完成上述设置后,按照正常的Qt运行或调试即可。支持自动编译、上传,设置断点等功能。