一、下载JLink驱动

下载地址:https://www.segger.com/downloads/jlink/,linux,64-bit DEB Installer(不翻墙下载不了)

链接:https://pan.baidu.com/s/1a5lfXL_wiJICMnQLKvRhRg
提取码:bc1w

sudo dpkg -i xx.deb安装

二、烧录程序

JLinkExe进入 jlink 界面,在使用之前,确保安装了 libusb 驱动。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
qzwjer@abcd:test$ JLinkExe
SEGGER J-Link Commander V7.54c (Compiled Sep 20 2021 13:59:37)
DLL version V7.54c, compiled Sep 20 2021 13:59:21

Connecting to J-Link via USB...O.K.
Firmware: J-Link V9 compiled May 7 2021 16:26:12
Hardware version: V9.20
S/N: -1
License(s): RDI, FlashBP, FlashDL, JFlash, GDB
VTref=3.330V


Type "connect" to establish a target connection, '?' for help

J-Link> connect /
Please specify device / core. <Default>: STM32F103C8
Type '?' for selection dialog
Device> STM32F103C8
Please specify target interface:
J) JTAG (Default)
S) SWD
T) cJTAG
TIF> S
Specify target interface speed [kHz]. <Default>: 4000 kHz
Speed> 2 mHz
Device "STM32F103C8" selected.

Connecting to target via SWD
InitTarget() start
InitTarget() end
Found SW-DP with ID 0x1BA01477
DPIDR: 0x1BA01477
Scanning AP map to find all available APs
AP[1]: Stopped AP scan as end of AP map has been reached
AP[0]: AHB-AP (IDR: 0x14770011)
Iterating through AP map to find AHB-AP to use
AP[0]: Core found
AP[0]: AHB-AP ROM base: 0xE00FF000
CPUID register: 0x411FC231. Implementer code: 0x41 (ARM)
Found Cortex-M3 r1p1, Little endian.
FPUnit: 6 code (BP) slots and 2 literal slots
CoreSight components:
ROMTbl[0] @ E00FF000
[0][0]: E000E000 CID B105E00D PID 001BB000 SCS
[0][1]: E0001000 CID B105E00D PID 001BB002 DWT
[0][2]: E0002000 CID B105E00D PID 000BB003 FPB
[0][3]: E0000000 CID B105E00D PID 001BB001 ITM
[0][4]: E0040000 CID B105900D PID 001BB923 TPIU-Lite
Cortex-M3 identified.
J-Link> /xxx/xxx/xxx/xxx/dfs.bin,0x8000000 #全路径,起始地址

三、JLink常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
usb			连接目标板  
r 重启目标板
halt 停止cpu运行的程序
loadbin 加载可执行的二进制文件
g 跳到代码段地址执行
s 单步执行(调试用)
setpc 设置pc寄存器的值(调试用)
setbp 设置断点
Regs 读寄存器组织,该命令会把所有的寄存器显示出来
wreg 写寄存器
mem 读内存
w4 写内存
power off mmu 关闭mmu,这个对于裸板调试很重要
w4 cpsr,0x0000001f 切换到系统模式
speed 设置jtag的传输速率
rce 0,c0,c0,0 设置cp15寄存器的第1个寄存器为0
q Quit(退出)
qc Close JLink connection andquit(关闭jlink连接,并退出)
r Reset target(重启目标)

四、编译工程

1.安装arm编译工具链

下载 gcc-arm-none-eabi-10.3-2021.07-x86_64-linux.tar.bz2 ,解压,设置环境变量

2.建立工程

参考链接:https://mculover666.blog.csdn.net/article/details/84888539

一个裸机工程,建立工程文件夹,包含三个文件:

  • startup_stm32f10x_hd.s:从固件库中拷贝,注意不是arm文件夹下的,因为truestudio使用的是gcc编译器,所以我们选择truestudio文件夹下的启动文件;
  • stm32f10x.h:空文件;
  • main.c:主程序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include "stm32f10x.h"

int main()
{
/* 开启GPIOB时钟 */
*(unsigned int*)(0x40021000+0x18) |= 1<<3;

/* 配置PB0为推挽输出 */
*(unsigned int*)(0x40010c00+0x00) |= 1<<(4*0);

/* PB0输出低电平,点亮绿色LED */
*(unsigned int*)(0x40010c00+0x0c) &= ~(1<<0);

while(1);
}
void SystemInit(void) //startup_stm32f10x_hd.s文件会调用
{

}

makefile示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
TARGET=test
CC=arm-none-eabi-gcc
OBJCOPY=arm-none-eabi-objcopy
RM=rm -f
CORE=3
CPUFLAGS=-mthumb -mcpu=cortex-m$(CORE)
LDFLAGS = -T stm32_flash.ld -Wl,-cref,-u,Reset_Handler -Wl,-Map=$(TARGET).map -Wl,--gc-sections -Wl,--defsym=malloc_getpagesize_P=0x80 -Wl,--start-group -lc -lm -Wl,--end-group
CFLAGS=-g -o

$(TARGET):startup_stm32f10x_md.o main.o
$(CC) $^ $(CPUFLAGS) $(LDFLAGS) $(CFLAGS) $(TARGET).elf

startup_stm32f10x_md.o:startup_stm32f10x_md.s
$(CC) -c $^ $(CPUFLAGS) $(CFLAGS) $@

main.o:main.c
$(CC) -c $^ $(CPUFLAGS) $(CFLAGS) $@

bin:
$(OBJCOPY) $(TARGET).elf $(TARGET).bin

hex:
$(OBJCOPY) $(TARGET).elf -Oihex $(TARGET).hex

clean:
$(RM) *.o $(TARGET).*