- 2024-09-15
-
发表了主题帖:
CMake构建实战读书笔记02-简单构建与CMake基础语法
本篇来学习《CMake构建实践 项目开发卷》的第1~3章中的一些知识点。
# 1 简单构建
## 1.1 构建静态库
按照书中内容,编写测试代码:
a.c
```c
#include
void a()
{
printf("a\n");
}
```
b.c
```c
#include
void b()
{
printf("b\n");
}
```
libab.h
```c
void a();
void b();
```
main.c
```c
#include "libab.h"
#include
int main()
{
a();
b();
return 0;
}
```
然后编写Makefile来进行编译
```makefile
main: main.o libab.a
gcc main.o -o main -L. -lab #链接静态库并生成主程序
main.o: main.c
gcc -c main.c -o main.o #c文件生成目标文件
libab.a: a.o b.o
ar rcs libab.a a.o b.o #归档,将a.o和b.o打包为静态库
a.o: a.c
gcc -c a.c -o a.o #c文件生成目标文件
b.o: b.c
gcc -c b.c -o b.o #c文件生成目标文件
clean:
rm *.o *.a main || true
```
编译运行的结果如下:
## 1.2 构建动态库
动态库的测试代码可以直接使用刚才静态库的测试代码
只需要修改Makefile
```makefile
main: main.o libab.so
gcc main.o -o main -L. '-Wl,-R$$ORIGIN' -lab #链接静态库并生成主程序
main.o: main.c
gcc -c main.c -o main.o #c文件生成目标文件
libab.so: a.o b.o
gcc -shared a.o b.o -o libab.so #生成动态库
a.o: a.c
gcc -fPIC -c a.c -o a.o #c文件生成目标文件
b.o: b.c
gcc -fPIC -c b.c -o b.o #c文件生成目标文件
clean:
rm *.o *.so main || true
```
编译运行的结果如下:
# 2 安装CMake
本篇的测试环境的Ubuntu20.04,默认是没有CMake的
可以使用如下指令来安装CMake
```sh
sudo apt-get install cmake
```
安装完成之后,可以写一个cmake文件进行简单测试:
# 3 CMake基础语法
## 3.1 CMake程序种类
CMake程序根据文件名,分为两类:
- 名为CMakeLists.txt的文件:用于组织构建项目源程序的目录结构
- 扩展名为.cmake的程序:又可分为脚本程序和模块程序两种
## 3.2 CMake注释
CMake注释可分为单行注释嗯和多行注释两种
```cmake
# 单行注释
#[[ 多行注释 可以换行]]
```
## 3.3 命令调用
CMake的命令调用类似于C语言中的函数调用。
先书写命令名称,后面括号里的命令参数
```cmake
message(a b c) # 输出 “abc”
```
## 3.4 命令参数
### 3.4.1 引号参数
用引号包裹在内的参数
```cmake
message("hello
cmake!")
```
### 3.4.2 非引号参数
未被引号包裹的参数,这种参数不能包含任何空白字符,也不能包含圆括号,#符号,双引号或反斜杠
```cmake
message("x;y;z") # 引号参数
message(x y z) # 多个非引号参数
message(x;y;z) # 非引号参数
```
### 3.4.3 括号参数
```cmake
message([===[
abc
def
]===])
```
## 3.5 变量
### 3.5.1 普通变量
通过set方式进行变量的定义。
示例代码:
```cmake
function(f)
set(a "我是修改后的a")
set(b "我是b")
set(c "我是c" PARENT_SCOPE)
endfunction()
set (a "我是a")
f()
message("a: ${a}")
message("b: ${b}")
message("c: ${c}")
```
运行结果
分析运行结果:
- 第一行是输出变量a的值,即全局中set的a的值
- 第二行是输出变量b的值,b在全局中没有定义,输出为空
- 第三行是输出变量c的值,c虽然在全局中没有定义,但在函数中,c通过PARENT_SCOPE将其定义到父级的作用域中
### 3.5.2 缓存变量
缓存变量比普通变量多了CACHE和FORCE参数,缓存变量具有全局的作用域,因此不需要PARENT_SCOPE参数。
示例代码:
```cmake
cmake_minimum_required(VERSION 3.16)
project(MatchOrder)
set(a 缓存变量 CACHE STRING "")
set(a 普通变量)
message("\${a}: ${a}")
message("\$CACHE{a}: $CACHE{a}")
```
运行结果:
### 3.5.3 环境变量
环境变量具有全局的作用域,不支持使用参数列表来定义值。
main.cmake
```makefile
message("main \$ENV{PATH}: $ENV{PATH}")
set(ENV{PATH} "path")
message("main \$ENV{PATH}: $ENV{PATH}")
execute_process(
COMMAND ${CMAKE_COMMAND} -P setenv.cmake
OUTPUT_VARIABLE out
)
message("${out}")
message("main \$ENV{PATH}: $ENV{PATH}")
```
这里将PATH环境变量设置为“path”,查看PATH的值,然后再调用setenv.cmake程序后,查看PATH的值
setenv.cmake的内容如下,就是清空了PATH的值
```makefile
message("before setenv \$ENV{PATH}: $ENV{PATH}")
set(ENV{PATH}) #清空
message("after setenv \$ENV{PATH}: $ENV{PATH}")
```
运行结果如下:
分析运行结果:
- PATH默认我Linux系统的环境变量
- 在main.cmake中修改之后,变为了path
- 在setenv.cmake子进程中的PATH,使用的是父进程的PATH,因此也是path
- 在setenv.cmake中将PATH清空
- 再回到主进程查看PATH,仍为主进程修改的“path”
这是因为,CMake的set命令仅对当前CMake进程有些,因此setenv.cmake中将PATH清空,不会影响setenv.cmake中PATH的值。
## 3.6 列表
列表,即用分号隔开的字符串,
## 3.7 控制结构
类似于C语言中的if、while、for语句
### 3.7.1 if条件分支
if条件分支的语法
```cmake
if()
...
elseif()
...
else()
...
endif()
```
### 3.7.2 while判断分支
while判断分支的语法
```cmake
while()
...
...break()
...
...continue()
...
endwhile()
```
### 3.7.3 foreach遍历循环
foreach遍历循环的语法
```cmake
foreach( )
...
endforeach()
```
例子
```cmake
foreach(x A;B;C D E F)
message("x: ${x}")
endforeach()
message("---")
set(list X;Y;Z)
foreach(x ${list})
message("x: ${x}")
endforeach()
```
运行结果如下:
## 3.8 条件语法
条件语法,即判断某个条件为真或假
### 3.8.1 常量、变量和字符串条件
常量条件,CMake中支持的真和假的常量定义如下
| 常量类型 | 常量值 | 条件结果 |
| -------- | ------------------------------------------------ | -------- |
| 真值常量 | 1、ON、YES、TRUE、Y,或非零数值 | 真 |
| 假值常量 | 0、OFF、NO、FALSE、Y、IGNORE、空字符串、NOTFOUND | 假 |
### 3.8.2 逻辑运算
三种逻辑运算:
- 与:AND
- 或:OR
- 非:NOT
### 3.8.3 单条件参数
根据单个参数进行判断的条件,例如
```cmake
set(a 1)
if(DEFINED a)
meaasge("DEFINED a为真")
endif()
```
这里if中的a是一个参数
### 3.8.4 双条件参数
通过两个参数的取值来判断的条件,例如
```cmake
set(a 1)
if(2 GREATER a)
meaasge("2 GREATER a为真")
endif()
```
这里if中的2和a是两个参数
### 3.8.5 括号和优先级
CMake中条件语法求值的优先级从高到低:
- 当前最内层括号中的条件
- 单参数条件
- 双参数条件
- 逻辑运算条件NOT
- 逻辑运算条件AND
- 逻辑运算条件OR
## 3.9 命令定义
可以自定义一些宏,以及函数
### 3.9.1 宏定义
宏定义的语法,可以传参数
```cmake
macro( [...])
...
endmacro()
```
### 3.9.2 函数定义
函数定义的语法,可以传参数
```cmake
function( [...])
...
endfunction()
```
### 3.9.3 参数的访问
- ${ARGC}:表示参数的个数
- ${ARGV}:表示完整的实参列表
- ${ARGN}:表示无对应形式参数的实际参数列表
- ${ARGV0}:表示第1个参数,依此类推
实例代码:
```cmake
macro(my_macro p)
message("ARGC: ${ARGC}")
message("ARGV: ${ARGV}")
message("ARGN: ${ARGN}")
message("ARGV0: ${ARGV0}, ARGV1: ${ARGV1}")
endmacro()
function(my_func p)
message("ARGC: ${ARGC}")
message("ARGV: ${ARGV}")
message("ARGN: ${ARGN}")
message("ARGV0: ${ARGV0}, ARGV1: ${ARGV1}")
endfunction()
my_macro(x y z)
my_func(x y z)
```
运行结果如下:
宏与函数的运行结果类似,这里开分析宏的运行结果:
- ARGC表示接收到的参数个,有3个参数
- ARGV表示完整的实参,为x;y;z
- ARGN表示无对应形式参数的实参,这里的宏在定义的时候,仅定义了一个参数p,实际传入的是x;y;z,因此x对应p,无对应的实参为y;z
- ARGV0和ARG1为传入的前两个参数
# 4 总结
本篇介绍了前3章的内容,先是使用gcc与makefile学习简单构建,并在Linux中安装CMake工具,然后开始学CMake的一些基础语法,并进行实际测试。
- 2024-09-08
-
发表了主题帖:
CMake构建实战读书笔记01-全书内容概览
收到《CMake构建实践 项目开发卷》了,感谢EE。
1 纸质书实物
看下书的正面
反面
随便翻开一页
2 全书内容概览
2.1 章节介绍
全书分为11章
2.2 第1~3章
第1~3章属于基础,第1章还未涉及到CMake
2.2 第4~6章
第4~6章也属于基础,第4章是常用命令,第5章是一个简单的实践,第6章是CMake构建初探
2.2 第7~9章
第7~9章应该属于CMake的一些进阶知识
2.2 第10~11章
第10章是CMake的策略与兼容介绍,第11章是一个综合性的CMake实践
- 2024-08-31
-
回复了主题帖:
读书入围名单: 《CMake构建实战:项目开发卷》
个人信息无误,确认可以完成阅读分享计划
- 2024-05-18
-
发表了主题帖:
【2023 DigiKey大赛参与奖】开箱帖 舵机云台+RGB8x8+RP2040板子
参与奖换了3样: 舵机云台x2,RGB8x8,RP2040板子
这个是舵机云台,散件,需要自己组装,有说明书
这个是RGB8x8点阵,需要搭配树莓派使用
这个是RP2040主控的一个板子
舵机云台组装好之后的样子
点阵屏和树莓派组装到一起的样子
以后有时间再玩
- 2024-01-31
-
回复了主题帖:
【年终总结颁奖】2024,让我们保持热爱,奔赴下一场山海!
已确认个人信息无误
- 2024-01-19
-
回复了主题帖:
EEWorld 社区 2023年度人物颁奖
个人信息无误。感谢EE论坛。
- 2024-01-14
-
回复了主题帖:
“年终总结” 我会是个努力奔跑的人
lugl4313820 发表于 2024-1-14 20:51
大佬什么时候再来一个满分试用项目呀,你的帖子那真是太优秀了。
谢谢,有机会再参与
-
发表了主题帖:
“年终总结” 我会是个努力奔跑的人
时间如白驹过隙,转眼已到了2024,抽出时间,总结下2023。
**2015**年加入EE大家庭
23年总共发表了**25**篇帖子
**2023年个人总结**:
①**完成了多少的目标?**
2023没有专门制订详细目标,只在运动健康APP上设置了一个跑步目标,超额完成。
2024打算简单罗列一下生活学习上的目标,看看会不会有什么神奇的效果。
②**学到了哪些新的知识?**
学习了UML与状态机的一些知识(如帖子分享)。
学习使用了RSIC-V架构的Linux嵌入式系统的应用开发(如帖子分享)。
学习使用了STM32MP157系列运行Linux的开发使用(如帖子分享)。
③**工作和生活有了什么样的变化?**
工作上,仍然正常进行,项目有序推进。
生活上,来杭漂泊已多年,整体上一如既往;2023终于不再受疫情影响,自由出行回归正常,很好。
④**谁给了我帮助,有谁鼓励了我,有谁给我留下了深刻的印象?**
这里表扬下敬业的EEworld的管理员,本年能参与两个论坛活动,都是EE管理员单独发消息通知。
**2024整装出发**:
①**给自己设立的目标是什么?**
目标就是尽量实现2024设置的目标,具体的目标暂不展开描述,总体上,在工作、学习、生活上还要努力奔跑。
2024,除了专业知识的学习,可能更多会偏向于提高自身的其它技能,如社交。
②**对自己的工作、生活有哪些规划?**
工作:提高专业技能,做好产品。
生活:而立之年,期遇良缘。
2024,一起加油~
-
回复了主题帖:
基于STM32MP157D-DK1的智慧家居控制器
作品源码显示已审核,但还是点不开,管理员帮忙看下什么情况哈 @lightxixi
资源名称:基于STM32MP157D-DK1的智慧家居控制器-项目源码
链接:https://download.eeworld.com.cn/detail/DDZZ669/630690
这里没有显示在审核:
点击进入又显示审核中:
消息通知中显示已审核:
“点击此处查看详情”是这个界面:
- 2024-01-09
-
回复了主题帖:
基于STM32MP157D-DK1的智慧家居控制器
qiao--- 发表于 2024-1-9 21:35
大佬 资源链接无效,麻烦大佬更新一下
显示还在审核中,审核完链接应该会自动生效
- 2024-01-08
-
回复了主题帖:
基于STM32MP157D-DK1的智慧家居控制器
秦天qintian0303 发表于 2024-1-8 17:29
杭州没有暖气,这屋内只有16度,这的多么冷啊
还好,还好
- 2024-01-07
-
发表了主题帖:
基于STM32MP157D-DK1的智慧家居控制器
本帖最后由 DDZZ669 于 2024-1-7 23:09 编辑
基于STM32MP157D-DK1的智慧家居控制器
作者:码农爱学习(DDZZ669)
一、作品简介
本项目为基于STM32MP157D-DK1的智慧家居控制器,用到的板卡为ST的STM32MP157D-DK1开发板,其芯片为STM32MP157,具有2个A7内核和1个M4内核。作品的实物照片如下:
图 1 作品照片
智慧家居控制器的界面拟采用Qt设置,外接HDMI显示器作为交互屏幕,再外接温湿度传感器(或通过无线节点接收温湿度数据)、摄像头等外设,实现如网络天气展示、室内温湿度展示、家中电器控制、安防监控、音乐视频播放娱乐等功能。
二、系统框图
本项目的系统结构如下:
图 2 系统结构图
主控为STM32MP157,内含两个A7核和一个M1核。A7核运行Linux系统,实现Qt界面程序的运行,摄像头数据的采集等,与无线节点进行TCP通信灯;M4核运行裸机系统或RTOS系统,可用于外接传感器以及外接家中电器的控制开关;A7核与M4核采用OpenAMP通信框架实现异核通信。
此外,STM32MP15D-DK1板块通过插入网线可连接互联网,实现互联网信息(网络天气、网络时间等)的获取;通过家中的路由器,又可与其它无线节点进行通信,例如与温湿度节点通信,可获取温湿度数据,与灯、风扇灯无线节点通信,可控制其开关。
三、各部分功能说明
本项目的功能,主要通过屏幕上的操作界面来呈现,目前可展示的功能包括:
网络天气信息的展示(展示当前城市当天的天气、未来7天的天气等)
家中温湿度的展示(当前温度湿度、历史数据曲线图)
家中电器的控制(灯的控制、风扇的控制)
RGB氛围灯的颜色调节控制
摄像头监控(USB摄像头)
音乐播放(播放本地音乐、歌词展示灯)
视频播放(播放本地视频)
时间显示(时钟形式)
图 3 主操作界面
3.1城市天气显示
STM32MP157D-DK1插入网线,可以连接互联网来实现对网络天气信息的获取。
通过http协议获取指定城市的天气数据,包括今天的天气类型,最高最低温度,以及最近7天的天气等。原始数据是json格式的,需要从json数据中解析出天气、温度等信息,然后将这些信息显示到屏幕中。
最终的Qt天气界面如下,点击主界面的天气图标即可进入到如下的天气界面。
上半部分为今天的天气,下半部分为近7天的天气(通过左右滑动可查看后面的天气),通过左上角的返回按钮可回到主界面。
图 4 天气信息界面
3.2室内温湿度显示
除了显示不同城市的天气数据,家庭环境中的温湿度也值得我们关注,考虑有两种方案实现温湿度数据的采集:
方案一:M4核通过IIC接口外接DHT11温湿度传感器采集数据,再通过OpenAMP通信机制将数据发给A7核,最终在Qt界面展示温湿度数据。
方案二:通过无线节点(如ESP8266)外接DHT11温湿度传感器,将数据通过无线TCP直接发送给A7核,最终在Qt界面展示温湿度数据。
由于开发时间紧张,OpenAMP通信机制还在学习中,而方案二的无线方式也更新灵活,本项目目前采用方案二的无线通信方式。
温湿度数据展示的Qt界面如下,STM32MP157D在连接到ESP8266无线节点获取到实时的温湿度数据后,可以显示实时的温度和湿度,如下:
图 5 温湿度信息界面
另外,温湿度的历史数据,可以通过曲线图展示变化趋势,这是温度曲线:
图 6 实时温度曲线图
这是湿度曲线(人为触摸温湿度传感器制造变化数据):
图 7 实时湿度曲线图
3.3家居电器控制
家居电器的控制界面设计如下,目前设计了灯的控制和风扇的控制:
图 8 家中电器控制界面
家中电器的控制,与刚才介绍的温度度传感器类似,也可以考虑两种方案:
方案一:家中电器的控制开关与STM32MP157的M核所控制的引脚相连,A核上运行的Qt操作指令通过异核通信将执行发给M核来控制电器开关。
方案二:家中电器与无线节点(如ESP8266)相连接,Qt操作指令通过无线通信将指令发给无线节点来控制电器开关。
除了简单的开关控制,家中可能还会有RGB氛围灯需要控制,这里也设置了颜色调节操作界面,如下:
图 9 RGB氛围灯颜色调节界面
3.4视频监控
智能家居系统中,视频监控的功能也是必不可少的,本项目通过外接USB摄像头,实现视频监控功能,可以实时查看摄像头的画面。
设计的Qt显示界面和实际的演示效果如下:
图 10 视频监控界面
3.5音乐&视频娱乐
设计了音乐播放器和视频播放器,用于智慧家居中的娱乐功能。音乐播放器的界面如下,具有基础的音乐播放、上一首下一首切换、歌词展示等。
图 11 音乐播放器界面
右下角可展开音乐列表子界面:
图 12 音乐列表
下面是设计的视频播放器的界面:
图 13 视频播放器界面
3.6时钟
设计了一个钟表形状的时钟,通过获取Linux系统实际,可展示当前的时间:
图 14 时钟界面
四、作品源码
源码已上传EEWord下载中心,资源名称:
链接:https://download.eeworld.com.cn/detail/DDZZ669/630690
源码结构
主体代码采用Qt编程,运行在STM32MP157的A7核的Linux系统中,源码位于01-stm32mp157_qt目录中。
该Qt程序内含多个功能,通过子文件夹分类存放:
App/QtUi/Skin/MyApp.pro:主体框架部分
Weather:网络天气功能代码
DHT11:温湿度功能代码
LEDFan:电器控制功能代码
RGBLed:RGB氛围灯代码
USBCamera:USB摄像头代码
MusicPlayer:音乐播放器代码
VideoPlayer:视频播放器代码
Clock:时钟代码
ESP8266作为无线节点,外接DHT11温湿度传感器采集数据,通过TCP发送给STM32MP157。
ESP8266采用Arduino编程,源码位于02-dth11tcp目录中。
五、作品功能演示视频
演示视频:基于STM32MP157D-DK1的智慧家居控制器
视频链接1:https://training.eeworld.com.cn/video/38948
视频链接2:https://www.bilibili.com/video/BV1V94y1u7EK
六、项目总结
本项目为基于STM32MP157D-DK1的智慧家居控制器,通过外接HDMI显示器作为操作屏幕,通过编写Qt程序实现智能家居的整体界面,外接摄像头、传感器、与无线节点通信等,实现具体的数据获取与各种控制功能、信息服务功能等。
在整个项目开发中,学习了STM32MP157这款芯片的使用。STM32MP157D-DK1具有ARM A7和Cortex M4双核架构,A7的开发过程中,首先学习了固件烧录,为了进行Qt开发,重新编译了具有Qt功能的系统源码和SDK,从而继续实现Qt程序的开发。M4核的开发过程中,学习了STM32CubeIDE的使用与基础的点灯程序编写,关于A7核与M4核的通信还在学习中。
在开发学习中,将一些开发经验通过文章的形式分享,链接如下:
【DigiKey创意大赛】STM32MP157D-DK1开箱
【DigiKey创意大赛】STM32MP157D固件烧录
【DigiKey创意大赛】STM32MP157D构建Qt镜像
【DigiKey创意大赛】STM32MP157D Qt程序编译运行
【DigiKey创意大赛】STM32MP157D M核程序开发
七、其他
文档下载:
-
加入了学习《基于STM32MP157D-DK1的智慧家居控制器》,观看 基于STM32MP157D-DK1的智慧家居控制器
-
上传了资料:
基于STM32MP157D-DK1的智慧家居控制器-项目源码
-
发表了主题帖:
【DigiKey创意大赛】STM32MP157D M核程序开发
之前的文章,都是在A核上进行Linux开发,本篇介绍M核程序的开发。
# 1 新建工程
文件,新建,STM32工程
在搜索框输入STM32MP157D后,选STM32MP157DAC1:
点Next之后,设置工程的名称,例如01_LED:
然后来到这个界面:
# 2 配置引脚
使用板子上的LD7来测试,其对应的是PH7引脚:
将PH7引脚设置为Output模式,并右键设置Pin Reserved,选择Cortex-M4 FW
点击左边的System Core,再点到GPIO,可以进行GPIO配置,如上下拉、速率等:
然后时钟可以不用再配置。
项目管理这里,注意勾选如下两项:
最后Ctrl+S保存,会提示要生成代码,点Yes即可。
# 3 修改代码并编译
在main.cpp中,添加控制LED亮灭逻辑代码:
```c
HAL_GPIO_WritePin(LD7_GPIO_Port,LD7_Pin,GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(LD7_GPIO_Port,LD7_Pin,GPIO_PIN_RESET);
HAL_Delay(500);
```
点击小锤子图标编译。
# 4 烧录程序
将开发板的BOOT配置BOOT0=OFF,BOOT1=ON。
然后板子的ST-LINK接口连接板子到电脑,配置ST-Link
菜单中Run中选择Debug Configurations...
切换到调试器窗口,选择thru JTAG/SWD link:
然后点击 Aply,Debug 开始调试。
全速运行后,可以看到LD7的橘色灯会循环亮灭:
- 2024-01-01
-
回复了主题帖:
【DigiKey创意大赛】STM32MP157D Qt程序编译运行
Jacktang 发表于 2023-12-30 22:21
执行成功后,会生成sdk目录,怎么判断是成功呢
sdk目录会出现一些文件,最后编译qt程序时也能正常编译
- 2023-12-30
-
发表了主题帖:
【DigiKey创意大赛】STM32MP157D Qt程序编译运行
本帖最后由 DDZZ669 于 2023-12-30 20:50 编辑
# 1 编译安装SDK
编译SDK,在Ubuntu中执行如下指令:
```sh
bitbake st-example-image-qtwayland -c populate_sdk
```
执行成功后,会生成sdk目录,如下:
执行sdk中的脚本,来安装SDK到指定目录:
```sh
./tmp-glibc/deploy/sdk/st-example-image-qtwayland-openstlinux-weston-stm32mp1-x86_64-toolchain-4.2.1-snapshot.sh -y -d /home/xxpcb/myTest/STM32MP157/STM32MPU-Ecosystem-v5.0.0/Developer-Package/SDK
```
# 2 交叉编译Qt
例如编译examples例程中的analogclock程序:
```sh
cd ~/myTest/STM32MP157/STM32MPU-Ecosystem-v5.0.0/Developer-Package/SDK/sysroots/cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi/usr/share/examples/gui
. ~/myTest/STM32MP157/STM32MPU-Ecosystem-v5.0.0/Developer-Package/SDK/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
qmake && make
```
最后编译生成analogclock文件
# 3 在板子中运行Qt
将analogclock文件拷贝到板子中运行,效果如下:
- 2023-12-24
-
发表了主题帖:
【DigiKey创意大赛】STM32MP157D构建Qt镜像
本篇来介绍Qt环境配置,需要重新编译带有Qt环境的镜像
# 1 Distribution包的构建
## 1.1 repo初始化
```sh
cd ~/myTest/STM32MP157/STM32MPU-Ecosystem-v5.0.0/Distribution-Package
#repo init
python3 ~/bin/repo init -u https://github.com/STMicroelectronics/oe-manifest.git -b refs/tags/openstlinux-6.1-yocto-mickledore-mp1-v23.06.21
#使用国内镜像源
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'
#repo sync
python3 ~/bin/repo sync
```
初始化完成后,会有一个layers文件夹
## 1.2 构建系统初始化
首先初始化OpenEmbedded构建环境
```sh
DISTRO=openstlinux-weston MACHINE=stm32mp1 source layers/meta-st/scripts/envsetup.sh
```
可能需要安装一些依赖:
```sh
sudo apt-get update
sudo apt-get install build-essential chrpath diffstat gawk gcc-multilib libegl1-mesa libmpc-dev libsdl1.2-dev libssl-dev pylint python3-git python3-jinja2 python3-pip socat texinfo xterm zstd
```
然后再执行bitbake构建系统
```sh
bitbake st-example-image-qtwayland
```
构建成功后,可以在deploy/image/stm32mp1目录下看到生成的镜像和相关文件
# 2 烧录
使用这个FlashLayout_sdcard_stm32mp157d-dk1-optee.tsv烧录脚本
与上一篇介绍的烧录方式一样,进行烧录到SD卡。
烧录完成后,搜索板子里qt相关文件。
可以看到搜出需要qt相关的文件,说明是支持qt的系统。
- 2023-12-10
-
回复了主题帖:
【DigiKey创意大赛】STM32MP157D-DK1开箱
秦天qintian0303 发表于 2023-12-10 09:20
需要一个屏
可以接HDMI显示屏
-
发表了主题帖:
【DigiKey创意大赛】STM32MP157D固件烧录
本篇介绍STM32MP157D-DK1开发板如何烧录官方固件。
# 1 烧录准备工作
## 1.1 安装STM32CubeProgrammer
需要安装在Ubuntu虚拟机中。
先下载STM32CubeProgrammer软件:https://www.st.com/en/development-tools/stm32cubeprog.html#get-software
解压安装,安装时会有界面形式的安装提示:
```sh
unzip en.stm32cubeprg-lin-v2-15-0.zip
ls
./SetupSTM32CubeProgrammer-2.15.0.linux
```
安装完成后,设置环境变量
```sh
export PATH=/home/xxpcb/myTest/STM32MP157/tool/cubeprog/bin:$PATH
```
## 1.2 安装USB serial link for flashing
安装命令:
```sh
sudo apt-get install libusb-1.0-0
```
然后将一些文件拷贝到/etc/udev/rules.d中:
```sh
cd ~/myTest/STM32MP157/tool/cubeprog/Drivers/rules
sudo cp *.* /etc/udev/rules.d/
```
## 1.3 下载镜像
下载STM32MP1 Starter Package镜像,地址https://www.st.com/en/embedded-software/stm32mp1starter.html#get-software
然后拷贝到Ubuntu中并解压:
```sh
cd /home/xxpcb/myTest/STM32MP157/STM32MPU-Ecosystem-v5.0.0/Starter-Package
tar xvf en.flash-stm32mp1-openstlinux-6.1-yocto-mickledore-mp1-v23.06.21.tar.gz
```
二进制文件和 Flash 布局文件位于stm32mp1目录中:
# 2 烧录
## 2.1 连接板子与电脑
板子插入SD卡,BOOT拨码开关都拨到0,连接电源线,连接Type-C数据线,按下复位键,Type-C数据线是烧录线,连接Ubintu虚拟机,选DFU这个:
## 2.2 命令行烧录
进入到下载的固件目录
```sh
cd ~/myTest/STM32MP157/STM32MPU-Ecosystem-v5.0.0/Starter-Package/stm32mp1-openstlinux-6.1-yocto-mickledore-mp1-v23.06.21/images/stm32mp1
```
查看烧录工具的版本和板子连接信息:
```sh
STM32_Programmer_CLI --h
STM32_Programmer_CLI -l usb
```
使用如下命令进行烧录:
```sh
STM32_Programmer_CLI -c port=usb1 -w flashlayout_st-image-weston/optee/FlashLayout_sdcard_stm32mp157d-dk1-optee.tsv
```
烧录成功后的打印信息如下:
BOOT拨码恢复到之前的从SD卡启动的状态,连接HMDI显示器查看效果:
# 3 总结
本篇介绍了STM32MP157D-DK1开发板烧录官方固件的详细过程,并演示烧录后的效果。