我的stm32开发之路-实践篇-嵌入式的hello-world
- 我的stm32开发之路-实践篇-嵌入式的hello-world
-
- 前言
- 预备知识
-
- 术语
- 关键概念对比
- 开发环境搭建
-
- 安装工具链
- 物理连接(应有CMSIS-DAP设备)及检查DAP识别
- 项目组织
-
- 目录结构
- 配置OpenOCD支持DAP仿真器
- 创建Makefile
- 创建链接脚本stm32_flash.ld
- 其他重要代码
-
- main.c文件
- led/bsp_led.h文件
- led/bsp_led.c文件
- 编译及烧录
-
- 编译程序
- 在一个单独的终端启动OpenOCD以烧录及调试
- 烧录到flash
-
- 两种方法的对比
- 新开一个终端使用GDB烧录
- 总结
我的stm32开发之路-实践篇-嵌入式的hello-world
前言
俗话说,万事开头难,可能当一个想接触嵌入式的开发者实现了第一个"hello-world"时才是真正的接触到入门的门槛。本文的目标就是跨过这个开头难,配置一个基于命令行的构建系统(使用GCC ARM工具链)和openocd来编译、烧录和调试一个LED点亮的项目。
本文改造了野火开发板配套的资料(请自行到 野火官方网站 下载STM32F103ZE_霸道开发板的《野火【STM32F103开发板-霸道】资料》)的点亮LED的项目配置。本文最大特点是真正从0开始指导新手开发者不使用Keil MDK将开发板上的LED灯点亮。因为嵌入式开发都是针对特定的物理设备,如果你的硬件设备与本人不同,且也想只使用命令行进行开发,也是可以参考本文中涉及的方法的,相信会有一定的帮助。
下面是本文的开发配置:
- 硬件: 野火stm32f103霸道v2开发板 + fileDAP(CMSIS-DAP设备)
- 操作系统: ubuntu24.04
- 初始工具: bash + vim
- 基础项目: 野火【STM32F103开发板-霸道】资料/0-开机例程源码/开机测试例程_20211130/开机测试例程/GPIO输出—使用固件库点亮LED灯/12-GPIO输出—使用固件库点亮LED灯
预备知识
术语
以下的术语有的并不会在此文中涉及,可后面自行了解。
ARM=Advanced RISC Machines
gcc=GNU compiler collectiono
gdb=GNU debugger
eabi=Embedded Application Binary Interface
openocd=Open On-Chip Debugger
CMSIS=Cortex Microcontroller Software Interface Standard CMSIS是ARM公司制定的统一软件开发框架
DAP=Debug Access Port 是硬件调试接口的具体实现,通过USB提供标准化的调试通道,支持SWD和JTAG两种协议
NXP=Next Experience
SWD=Serial Wire Debug
JTAG=Joint Test Action Group
SWDIO=Serial Wire Data Input/Output 是数据线
SWCLK=Serial Wire Clock 是时钟线
tcl=tool command language
srst=Synchronous Reset
arst=Asynchronous Reset
TCK=Test Clock
TMS=Test Mode Select
TDI=Test Data In
TDO=Test Data Out
DP=Debug Port ARM架构的调试接口(如SWD接口)的根寄存器组,包含控制、状态和识别寄存器
IDR=Identification Register 位于DP中的寄存器,用于读取目标设备的调试接口标识(如厂商、版本号等)
BSP=Board Support Package
关键概念对比
术语 | 物理位置 | 功能描述 | 示例 |
---|---|---|---|
Debugger | 开发PC上 | 调试控制软件 | OpenOCD/GDB |
Probe | USB调试硬件 | 协议转换器 | CMSIS-DAP/J-Link |
On-Chip | 目标处理器内部 | 芯片级调试硬件单元 | ARM CoreSight, JTAG TAP |
开发环境搭建
安装工具链
# ARM交叉编译工具链及openocd
sudo apt install gcc-arm-none-eabi binutils-arm-none-eabi gdb-multiarch openocd
物理连接(应有CMSIS-DAP设备)及检查DAP识别
DAP使用排线连接开发板,DAP使用usb连接PC,连接PC后DAP的绿灯会常亮。
通过在PC上敲入如下命令检查设备:
lsusb | grep -i "CMSIS"
从上面的输出中可获得由冒号分开的vid:pid,即vendor id和product id,这里先记录在纸上,后面会用到。
项目组织
目录结构
目录结构请根据我如下展示的目录结构自行调整,注意注释说明,会涉及将原目录下的一些文件进行替换。注意后面的注释,非常重要。
├── Libraries # 此目录中的文件应全部在STM32的官方标准库STM32F10x_StdPeriph_Lib_V3.5.0中寻找并放到对应的路径下。
│ ├── CMSIS # 核心,提供系统级支持,具有通用性。STM32 开发的核心部分
│ │ ├── core_cm3.c # ARM Cortex-M3 内核的核心支持文件。注意此文件版本在项目中有处源码bug需修改,即__STREXB和__STREXH函数里面的"=r"要改成"=&r",否则make时会报错Error:registers may not be the same--`strexbr0,r0,[r1]'
│ │ ├── core_cm3.h
│ │ ├── startup # 包含针对不同STM32F10x型号的启动文件,注意我们的项目使用官方的startup/gcc_ride7目录而不是startup/arm目录,否则make时会报错Error: junk at end of line, first unrecognized character is `*‘等
│ │ │ ├── startup_stm32f10x_cl.s
│ │ │ ├── startup_stm32f10x_hd.s # 本应用使用此汇编代码文件来启动芯片
│ │ │ ├── startup_stm32f10x_hd_vl.s
│ │ │ ├── startup_stm32f10x_ld.s
│ │ │ ├── startup_stm32f10x_ld_vl.s
│ │ │ ├── startup_stm32f10x_md.s
│ │ │ ├── startup_stm32f10x_md_vl.s
│ │ │ └── startup_stm32f10x_xl.s
│ │ ├── stm32f10x.h # STM32F10x 系列微控制器的主头文件
│ │ ├── system_stm32f10x.c # 系统初始化文件,SystemInit()函数在此
│ │ └── system_stm32f10x.h
│ └── FWlib # 驱动,用于外设访问,具有通用性。S