【我的stm32开发之路-实践篇-嵌入式的hello-world】原创

我的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灯点亮。因为嵌入式开发都是针对特定的物理设备,如果你的硬件设备与本人不同,且也想只使用命令行进行开发,也是可以参考本文中涉及的方法的,相信会有一定的帮助。

下面是本文的开发配置:

  1. 硬件: 野火stm32f103霸道v2开发板 + fileDAP(CMSIS-DAP设备)
  2. 操作系统: ubuntu24.04
  3. 初始工具: bash + vim
  4. 基础项目: 野火【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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值