2026/7/22小于 1 分钟
以具体代码为例:
案例1
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; \
2026/5/20大约 9 分钟
安装 Docker 并配置权限
sudo apt update
sudo apt install docker.io
sudo usermod -aG docker $USER
newgrp docker # 刷新用户组,或者直接注销重新登录终端
2026/5/20小于 1 分钟
微机原理
堆栈指针SP(Stack Pointer)
“大家想象一下,单片机在运行代码,就像是你在读一本极厚的小说(这本小说就是 Flash 存储器)。
你的眼睛不可能一次性看完一整页,你必须一行一行地读。为了防止读串行,你会用一根食指指着当前正在读的那一行字。读完一行,手指就往下挪一行。
这根用来指路的食指,就是 PC(程序计数器)!
PC 里面存的永远是一个地址,也就是告诉你:‘CPU 老大,下一句该执行哪一行代码了?’
如果突然来了一个电话(中断),你该怎么办?你会把这根手指当前指的位置,写在一张纸条上(保存现场),然后跑去接电话。接完电话回来,看一眼纸条,手指重新指回刚才那行,继续往下读!如果你强行把这根手指掰到一个全是乱码的空白页(比如指到了 0x00000000),你就会瞬间懵逼死机,这就是 HardFault!”
总结:PC寄存器的值就是下一条要执行的代码的位置,非常重要!!
2026/5/20大约 11 分钟
基础信息
stm32f103c8t6的flash大小64kb,sram大小为20kb
新建一个APP
配置Debug
配置时钟
配置LED
其他
代码
写好后直接烧录,看看能不能正常运行: 每秒闪一次led, 同时向串口1发送app is running,正常运行后下一步
代码并没有写完,要看到最后!!!
2026/5/20大约 2 分钟
规划
stm32f103c8t6的flash大小64kb,sram大小为20kb
0kb - 16kb, 前16个KB为bootloader的位置
16kb- 20Kb, 中间4个KB为为参数区
20kb- 64KB, 后面所有为APP区
设计思路
2026/5/20小于 1 分钟
test
2026/5/20小于 1 分钟
test
2026/5/20小于 1 分钟
test
2026/5/20小于 1 分钟
test
2026/5/20小于 1 分钟