在 linux 上开发 stm8

更多分享内容可访问我的个人博客

https://www.niuiic.top/

本文介绍如何在 linux(Gentoo)上开发 stm8。

硬件

  1. stm8 开发板,比如 stm8s105k4 最小系统板。

  2. stlink,USB 的那种总是连不上电脑,建议选择白色 20 针的那种。

  3. 连接所需杜邦线。

接线时注意 stlink 上单独的 4 针是给 stm8 使用的,但是上面的电源引脚输出电平不对,将线插到 20 针部分的 VCC 引脚上。

软件

sdcc

使用 sdcc 作为编译器。直接搜索如何安装即可。

stm8-gdb

使用 stm8-gdb 作为调试器。按其官网的介绍下载源文件。

编译之前先安装好 python3.6。如果是 python3.7 及以上版本则无法正常编译。原因是 gdb8.1 使用的一个 python 函数在 python3.7 中被修改。

configure_binutils.sh文件中最后一行改为./configure --host=$_HOST --target=stm8-none-elf32 $_PREFIX --program-prefix=stm8- --with-python=python3.6

最新版本的源码中该问题已经修复,不需要再加–with-python=python3.6。

然后按照 README 中的提示进行编译即可。

openocd

使用 openocd 驱动仿真器。

编辑器

编辑器随意,建议 vim 或者 emacs。如果使用 vscode,可以尝试用其 stm8 debugger 插件(似乎是 windows only,没用过,可试一下)。

资源

库文件

由于权限限制,sdcc 并没有集成 stm8 的库,可以去 st 官网下载。

下载Library

解压后,在解压出来的目录下执行以下命令。

wget https://raw.githubusercontent.com/gicking/STM8-SPL_SDCC_patch/master/STM8S_StdPeriph_Lib_V2.3.1_sdcc.patch
patch -p0 < STM8S_StdPeriph_Lib_V2.3.1_sdcc.patch

然后自己看着用吧。

github 上有一个 stm8s 系列的头文件库,这个比前面的简单点。

手册

去 st 官网下载参考手册和数据手册即可,另外从卖家那里要个原理图。

开发流程

这里不使用库文件,直接用寄存器编程。

首先在数据手册中找到各寄存器对应的内存地址,然后在main.c中定义。

#define CLK_CKDIVR *(volatile unsigned char *)0x50C6
#define PD_ODR *(volatile unsigned char *)0x500F
#define PD_IDR *(volatile unsigned char *)0x5010
#define PD_DDR *(volatile unsigned char *)0x5011
#define PD_CR1 *(volatile unsigned char *)0x5012
#define PD_CR2 *(volatile unsigned char *)0x5013

sdcc 有自己特殊的定义方式,但是一般 lsp 识别不出来,会误报错,因此就不介绍了。

下面给出完整的main.c

// main.c

#include <stdint.h>

#define setbit(x, n) ((x) |= (1 << (n)));
#define rstbit(x, n) ((x) &= ~(1 << (n)));

#define CLK_CKDIVR *(volatile unsigned char *)0x50C6
#define PD_ODR *(volatile unsigned char *)0x500F
#define PD_IDR *(volatile unsigned char *)0x5010
#define PD_DDR *(volatile unsigned char *)0x5011
#define PD_CR1 *(volatile unsigned char *)0x5012
#define PD_CR2 *(volatile unsigned char *)0x5013

void delay(unsigned long count) {
  while (count--) {
    __asm__("nop");
  }
}

void main() {
  CLK_CKDIVR = 0;
  setbit(PD_DDR, 7);
  setbit(PD_CR1, 7);
  while (1) {
    setbit(PD_ODR, 7);
    delay(100000L);
    rstbit(PD_ODR, 7);
    delay(300000L);
  }
}

接下来使用 cmake 来管理项目(简单地写个 makefile 也足够了,这里是为了方便生成compile_commands.json给 lsp 使用)。

# CMakeLists.txt

cmake_minimum_required(VERSION 3.20)

set(CMAKE_C_COMPILER sdcc)
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_C_OUTPUT_EXTENSION ".rel")

# Prevent default configuration
set(CMAKE_C_FLAGS_INIT "")
set(CMAKE_EXE_LINKER_FLAGS_INIT "")

# Disable C++
project(Test C)

set(CMAKE_C_FLAGS "-mstm8 --std-sdcc11 --debug --out-fmt-elf")
add_executable(main main.c)

CMAKE_C_FLAGS设置的参数会影响到调试,不要轻易修改。

接下来编译调试项目。

mkdir build
cd build
cmake .. -G Ninja -DCMAKE_EXPORT_COMPILE_COMMANDS=on
ninja

用 make 替代 ninja 也可以。

sudo openocd -f interface/stlink-dap.cfg -f target/stm8s105.cfg

另开一个终端,再次进入到 build 目录下。

stm8-gdb
target extended-remote :3333
monitor reset halt
file main.ihx
load

建议把每次必用的 gdb 命令写入debug.gdb

target extended-remote :3333
monitor reset halt
file main.ihx
load

然后使用stm8-gdb -q -x debug.gdb

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
开发STM32是使用Linux和VSCode的常见做法。在Linux上进行STM32的开发具有许多优点,比如可定制性高、稳定性好、免费使用等。而VSCode是一款轻量级的代码编辑器,它具有丰富的扩展功能,可以满足各种开发需求。 在Linux上安装VSCode非常简单。首先,我们需要下载并安装VSCode的Linux版本。可以从官方网站上下载对应的安装包,然后解压缩并运行安装文件。安装完成后,我们可以在应用程序列表中找到VSCode并启动它。 接下来,我们需要配置VSCode以支持STM32的开发。其中,最关键的是安装C/C++扩展和STM32相关插件。C/C++扩展可以提供代码的自动补全、调试功能等,而STM32插件可以简化STM32项目的创建、编译和下载。 配置好环境后,我们可以在VSCode中创建新的STM32项目,并编写相应的代码。VSCode的代码编辑器提供了丰富的功能,如代码高亮、代码折叠、智能提示等,可以大大提高开发效率。在写完代码之后,我们可以使用VSCode的编译和调试功能进行代码的编译和调试。 另外,VSCode还支持Git版本控制,这使得多人协同开发更加便利。我们可以将代码提交到Git仓库中,并与团队成员进行代码的合并和管理。 总之,使用Linux和VSCode开发STM32是一种非常有效和方便的方式。Linux提供了一个稳定而灵活的开发环境,而VSCode则为我们提供了强大的代码编辑和调试功能。这样的组合使得开发STM32项目更加高效和便捷。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值