linux 下调试stm32
JLink安装
网址:https://www.segger.com/downloads/jlink/
选择一个版本下载,对于我这个淘宝买的10多元钱的jlink-ob必须要选择低版本的,目前选用的是V6.0。可以选择.deb或.rpm安装。
STM32CubeMx生成一个Makefile项目
stm32cubemx使用
开发环境选makefile就是了
程序下载
- 之前写过一个怎么用命令行,一步一步的选择方式,速度,芯片,烧写。在这里
- 这种方法比较麻烦,每次烧写都要选择各种选项。遇然发现一个新的方法,可以一个命令搞定,方便快捷:
# 新建一个文件名字叫flash,下面列出了flash文件内容
$ cat flash
si 1
speed 4000
device stm32f103ZET6
r
h
erase
loadfile target.hex 0x8000000
q
# 第一行选连接方式swd,jta。第三行选芯片。erase是擦除。后面就是写入hex文件。
# 保存好文件后运行以下命令写入芯片
JLinkExe flash
- 用以上方法可以烧录,将flash伪命令加入makefile,就可以实现编绎,烧录全部make命令搞定了。
# makefile中加入以下伪命令
#######################################
# flash
#######################################
flash:
sed 's/target/$(BUILD_DIR)\/$(TARGET)/g' flash_src > flash_use; \
JLinkExe flash_use; \
if [ -z $? ]; then echo "烧写成功"; else echo "烧写失败";fi
# makefile中加入flash伪命令后,使用make flash就可以实现烧录到芯片的功能了
# 这里说明一下$(BUILD_DIR)\/$(TARGET)是/build/编绎生成的项目目标文件,这里的Makefile可以使用STM32CubeMx生成。flash_src里面的内容就是上面第二步中提到的flash文件内容,第一行是为了把target.hex替换成build/项目名称.hex,第二行进行烧录,最后是判断是否烧写成功。如果烧录成功会显示如下界面
Downloading file [build/Gpio_test.hex]...
**************************
WARNING: CPU is running at low speed (8061 kHz).
**************************
Comparing flash [100%] Done.
Erasing flash [100%] Done.
Programming flash [100%] Done.
Verifying flash [100%] Done.
J-Link: Flash download: Flash programming performed for 1 range (2048 bytes)
J-Link: Flash download: Total time needed: 0.207s (Prepare: 0.104s, Compare: 0.003s, Erase: 0.000s, Program: 0.065s, Verify: 0.000s, Restore: 0.033s)
O.K.
Script processing completed.
烧写成功
程序调试
烧录都能一个命令搞定了,调试也必需要想办法。直接在Makefile中加入debug伪命令
#######################################
# debug
#######################################
debug:
JLinkGDBServer -if SWD -device stm32f103zet6 &\
echo "Please use:arm-none-eabi-gdb build/[Project_name].elf"
# 输入make debug开启远程调试服务器
# 第一行是开启GDB远程服务器,-if指定连线方式,-device指定芯片型号
# 第二行提示用什么命令连接远程服务器
# 因为服务器要一直运行,因此加入&符号表示后台运行,但因为JLinkGDBServer会有一些提示,界面显示会有点乱,但不用管它,只要显示以下内容就表示可以连接进行调试了
Listening on TCP/IP port 2331
Connecting to target...Connected to target
Waiting for GDB connection...
# 服务器开启后,使用命令`arm-none-eabi-gdb build/[Project_name].elf`开始调试
# 开始调试后还有3个动作要做
# 首先连接本地2331端口服务
target remote localhost:2331
# 重置芯片
monitor reset
# 挂起芯片
monitor halt
# 一般芯片会从StartUp文件开始运行,而不是main,因此在main处打一个断点
b main
# 运行命令是c,不是gdb的r
c
# 至此就可以用gdb方式进行调试了
# 调试完成后要用fg %1使GDBServer前台运行,按Ctrl+z退出GDBServer程序,不然会一直在后台运行