STM32MP157开发记录

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运行或调试即可。支持自动编译、上传,设置断点等功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值