Keil
让其显示的更舒服
之前经常使用还有移植LVGL到单片机上,但是始终没有系统学习过,目前仍属于皮毛状态,所以打算系统学习一下LVGL,但也没有那么系统,怎么说呢,看我学吧,你也能学会。
之前使用开发板学习LVGL,但是学习体验有点难受,编译时间太长,不好看效果,不同硬件学习时需要考虑适配,比如stm32h7系列有LTDC和DMA2D,可以驱动RGB屏幕,但是有些单片机就没有,不同硬件的适配以及最佳开发方式不同,后面单开一个系列。
所以我使用LVGL模拟器,需要下载Visual Studio 2026,使用git clone --recurse-submodules https://github.com/lvgl/lv_port_pc_visual_studio.git获取LVGL官方适配的LVGL模拟器。在此处可以查看模拟器使用的LVGL版本:
还是打算呢先使用高版本的,高版本的在性能差的帧率较低,但是考虑到后面会在linux相关开发板使用,还是学习最新的LVGL。
双击或者通过Visual Studio打开这个LVGL.sin文件,sin文件是Visual Studio的项目文件,通过这个文件进入项目。
将第三个设为工作项目,后面点击调试或者运行,执行就是第三个。
打算基于正点原子的教程学习lwIP,开发板用的正点原子stm32f407zgt6最小系统板加LAN8720A来实现网络通信
开发IDE使用的是CLion,用的开源的嵌入式编译器:arm-gnu-toolchain-15.3.rel1-mingw-w64-i686-arm-none-eabi
参考书籍:《lwIP开发指南_V1.7.pdf》
结合这张图,数据从单片机连接的网线到单片机内部去处理,整体逻辑是这样的:
数据以差分信号的形式在网线中传递,直到传递到RJ45网口(外部PHY),然后LAN8720A将其转换成01二进制数据,通过它的RMII接口传递给stm32的mac内核,mac有发送和接收的缓冲区,各一个,每个2KB,(IEEE规定每个帧最大1520B左右,2kB完全够用了),mac内核获取一帧数据后,告诉单片机的DMA,将该帧转移到指定的内存区域,这样的内存区域有多个,每个内存区域由一个DMA描述符(结构体)来控制访问。
以具体代码为例:
ifneq ($(MKENV_INCLUDED),1)
include mkenv.mk
endif
subdirs-y :=
include apps.mk
.PHONY: all clean distclean
all: $(subdirs-y)
@echo "Make Applications done."
ifneq ($(strip $(subdirs-y)),)
.PHONY: $(subdirs-y)
$(subdirs-y):
@echo "[BUILD] applications $@"
@$(MAKE) -C $@ all || exit $?;
endif
clean:
@if [ -n "$(subdirs-y)" ]; then \
for dir in $(subdirs-y); do \
echo "[CLEAN] applications $$dir"; \
$(MAKE) -C $$dir clean || exit $?; \
done; \
fi
distclean: clean
@if [ -n "$(subdirs-y)" ]; then \
for dir in $(subdirs-y); do \
echo "[DISTCLEAN] applications $$dir"; \
$(MAKE) -C $$dir distclean || exit $?; \
done; \
fi
.PHONY: gen_kconfig
gen_kconfig:
@echo "# Dynamic generate by Makefile, DO NOT Modify it.\n" > $(SDK_BUILD_DIR)/Kconfig.app; \
for dir in $(shell find $(SDK_APPS_SRC_DIR) -maxdepth 1 -mindepth 1 -type d); do \
echo "source \"$$dir/Kconfig\"" >> $(SDK_BUILD_DIR)/Kconfig.app; \
done; \
sudo apt update
sudo apt install docker.io
sudo usermod -aG docker $USER
newgrp docker # 刷新用户组,或者直接注销重新登录终端
“大家想象一下,单片机在运行代码,就像是你在读一本极厚的小说(这本小说就是 Flash 存储器)。
你的眼睛不可能一次性看完一整页,你必须一行一行地读。为了防止读串行,你会用一根食指指着当前正在读的那一行字。读完一行,手指就往下挪一行。
这根用来指路的食指,就是 PC(程序计数器)!
PC 里面存的永远是一个地址,也就是告诉你:‘CPU 老大,下一句该执行哪一行代码了?’
如果突然来了一个电话(中断),你该怎么办?你会把这根手指当前指的位置,写在一张纸条上(保存现场),然后跑去接电话。接完电话回来,看一眼纸条,手指重新指回刚才那行,继续往下读!如果你强行把这根手指掰到一个全是乱码的空白页(比如指到了 0x00000000),你就会瞬间懵逼死机,这就是 HardFault!”
总结:PC寄存器的值就是下一条要执行的代码的位置,非常重要!!
stm32f103c8t6的flash大小64kb,sram大小为20kb
写好后直接烧录,看看能不能正常运行: 每秒闪一次led, 同时向串口1发送app is running,正常运行后下一步
代码并没有写完,要看到最后!!!
stm32f103c8t6的flash大小64kb,sram大小为20kb
0kb - 16kb, 前16个KB为bootloader的位置
16kb- 20Kb, 中间4个KB为为参数区
20kb- 64KB, 后面所有为APP区