杰瑞科技汇

STM8 IAR教程从哪开始学?

本教程适用于 STM8S 系列(如 STM8S103,这是 Discovery 开发板上常用的芯片),但核心步骤和概念同样适用于其他 STM8 系列(如 STM8A, STM8L)。


目录

  1. 准备工作:安装所需软件
  2. 创建第一个项目:新建工作区和项目
  3. 配置项目:设置选项和编译器
  4. 编写代码:点亮第一个 LED
  5. 下载和调试:连接硬件并运行
  6. 进阶技巧:常用外设库和资源
  7. 总结与常见问题

准备工作:安装所需软件

在开始之前,你需要准备好以下工具:

a) IAR Embedded Workbench for STM8

这是核心的开发环境(IDE),你需要从 IAR 官网下载并安装。

  • 下载地址: IAR Systems 官网
  • 版本: 建议使用最新的 Kickstart (免费但有代码大小限制,32KB) 或 完整版 (付费),对于初学,Kickstart 版本完全足够。
  • 安装: 按照向导完成安装即可。

b) STM8 ST-LINK 驱动和工具

STM8 开发板通常使用 ST-LINK 作为调试器和下载器。

  • 下载地址: ST 官网 - STM8 ST-LINK 驱动
    • ST-LINK 驱动: 让你的电脑能识别到 ST-LINK 调试器。
    • ST-LINK Utility: 一个独立的工具,用于固件更新和简单的烧录。
  • 安装: 安装驱动即可,ST-LINK Utility 可以选择性安装。

c) STM8 标准外设库 (SPL)

这是一个非常重要的库,它为 STM8 的所有外设(GPIO, UART, TIM, ADC 等)提供了易于使用的 C 函数封装,让你不必直接操作复杂的寄存器。

  • 下载地址: ST 官网 - STM8S 标准外设库 (以 STM8S 为例,请根据你的芯片型号下载对应的库)
  • 一个压缩包,解压后包含 Libraries 文件夹,里面有 STM8S_StdPeriph_Driver

创建第一个项目:新建工作区和项目

我们以创建一个能让 STM8S-Discovery 开发板上的 LED 闪烁的项目为例。

步骤 1: 创建工作区

  1. 打开 IAR EWSTM8。
  2. 选择 File -> New -> Workspace...
  3. 选择一个位置,保存你的工作区文件(MyFirstProject.eww)。

步骤 2: 创建项目

  1. 在左侧的 Workspace 窗口中,右键点击 Workspace 'MyFirstProject.eww'
  2. 选择 Add -> New Project...
  3. 在弹出的窗口中,选择 C/C++ Application
  4. 给项目命名,Blink_LED
  5. 选择项目保存位置,点击 OK

步骤 3: 添加源文件

  1. Workspace 窗口中,右键点击新创建的 Blink_LED 项目。

  2. 选择 Add -> New Group...,创建一个名为 Src 的文件夹,用于存放源代码。

  3. 再次右键点击 Src 文件夹,选择 Add -> New Item...

  4. 选择 C File,命名为 main.c

  5. 点击 OK,现在你的项目结构看起来应该像这样:

    - MyFirstProject.eww
      - Blink_LED
        - Src
          - main.c

配置项目:设置选项和编译器

这是最关键的一步,确保项目能正确编译和下载。

步骤 1: 设置目标芯片

  1. 右键点击 Blink_LED 项目,选择 Options...
  2. 在左侧菜单中,选择 General Options -> Target
  3. Device 下拉菜单中,选择你的具体芯片型号,STM8S103F3P6 (STM8S-Discovery 板载芯片)。
  4. 点击 OK

步骤 2: 设置包含路径

为了让编译器能找到 STM8S 标准外设库的头文件(.h 文件),我们需要添加其路径。

  1. 再次打开项目选项 (Options...)。
  2. 在左侧菜单中,选择 C/C++ Compiler -> Preprocessor
  3. Additional include directories 字段中,点击 "..." 按钮,添加 STM8S SPL 库的头文件路径。
    • 如果你将 SPL 解压在 D:\STM8S_StdPeriph_Driver,那么路径就是: D:\STM8S_StdPeriph_Driver\Libraries\STM8S_StdPeriph_Driver\inc
  4. 点击 OK

步骤 3: 设置链接器

链接器需要知道芯片的启动文件和内存布局。

  1. 打开项目选项 (Options...)。
  2. 在左侧菜单中,选择 Linker -> Config
  3. Linker configuration file 下拉菜单中,选择对应的启动文件。
    • 对于 STM8S 系列,通常是 stm8s103f3_p.icf (文件名可能略有不同,但前缀是 stm8s...),这个文件在 IAR 安装目录下,C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.3\stm8\config\
  4. 点击 OK

步骤 4: 设置调试器

配置如何通过 ST-LINK 连接到硬件。

  1. 打开项目选项 (Options...)。
  2. 在左侧菜单中,选择 Debugger
  3. Driver 下拉菜单中,选择 ST-LINK
  4. 确保 Interface 设置为 SWD
  5. Download 选项卡中,勾选 Erase flash before programmingVerify flash after programming
  6. 点击 OK

编写代码:点亮第一个 LED

我们编写代码来让 STM8S-Discovery 板上的 LED 闪烁。

  1. 双击 main.c 文件,打开它。
  2. 删除默认内容,粘贴以下代码:
#include "stm8s.h"
// 函数声明
void Delay(uint32_t count);
void main(void)
{
    // 1. 使能 GPIOC 端口的时钟
    // STM8 的外设在使用前必须先开启其时钟
    CLK->PCKENR2 |= (1 << 3); // 使能 GPIOC 时钟 (Bit 3)
    // 2. 配置 PC5 引脚为推挽输出模式
    // STM8S-Discovery 板上的 LED 连接在 PC5 引脚
    GPIOC->DDR |= (1 << 5);   // 设置 PC5 为输出模式 (Data Direction Register)
    GPIOC->CR1 |= (1 << 5);   // 设置 PC5 为推挽输出模式 (Control Register 1)
    GPIOC->CR2 &= ~(1 << 5);  // 设置 PC5 为低速输出 (Control Register 2)
    // 3. 主循环
    while (1)
    {
        // 点亮 LED (STM8 是低电平点亮,高电平熄灭)
        // 所以我们给 PC5 写 0 来点亮
        GPIOC->ODR &= ~(1 << 5); // ODR: Output Data Register
        Delay(50000);            // 延时
        // 熄灭 LED
        GPIOC->ODR |= (1 << 5);  // 给 PC5 写 1 来熄灭
        Delay(50000);            // 延时
    }
}
/**
 * @brief  简单的软件延时函数
 * @param  count: 延时参数,值越大,延时越长
 * @retval None
 */
void Delay(uint32_t count)
{
    for (uint32_t i = 0; i < count; i++)
    {
        // 空循环,起延时作用
        // 在实际产品中,建议使用硬件定时器实现精确延时
        __NOP(); // 这是一个空指令,可以防止编译器优化掉循环
    }
}

代码解释:

  • #include "stm8s.h": 包含了 STM8S 的寄存器定义头文件。
  • CLK->PCKENR2 |= (1 << 3): 这是 STM8 的一个特点,所有外设(如 GPIO, UART, TIM)都有一个独立的时钟使能寄存器,必须先开启 GPIOC 的时钟,才能操作它的引脚。
  • GPIOC->DDR |= (1 << 5): 设置 GPIOC 端口的 Data Direction Register (数据方向寄存器),将第 5 位 (PC5) 设置为输出 (1)。
  • GPIOC->CR1 |= (1 << 5): 设置 Control Register 1,选择输出模式为推挽输出。
  • GPIOC->CR2 &= ~(1 << 5): 设置 Control Register 2,选择输出速度为低速。
  • GPIOC->ODR: Output Data Register,输出数据寄存器,对某一位写 1 输出高电平,写 0 输出低电平。
  • Delay(): 一个简单的软件延时函数。
  • 注意: STM8S-Discovery 板上的 LED 是 低电平点亮 的,所以点亮时我们给 PC5 写 0

下载和调试:连接硬件并运行

步骤 1: 连接硬件

  1. 用 USB 线将 STM8S-Discovery 开发板连接到你的电脑。
  2. 确保开发板上的 ST-LINK 调试器已通过跳线或开关选择为调试模式(通常默认就是)。

步骤 2: 编译和下载

  1. 点击工具栏上的 Make 按钮(一个绿色的对勾)或按 F7,如果没有错误,编译器会生成 .hex 文件。
  2. 点击工具栏上的 Download and Debug 按钮(一个向下箭头+虫子图标)或按 Ctrl + D
  3. IAR 会自动连接 ST-LINK,擦除芯片,下载编译好的程序,然后进入调试模式。

步骤 3: 运行和观察

  1. 如果一切顺利,你应该能看到 STM8S-Discovery 板上的 LED 开始闪烁!
  2. 在调试模式下,你可以使用工具栏上的按钮来控制程序:
    • Go (F5): 全速运行。
    • Stop (Shift + F5): 停止调试。
    • Step Over (F10): 单步跳过函数。
    • Step Into (F11): 单步进入函数。
  3. 你还可以在 main.c 中,在 GPIOC->ODR &= ~(1 << 5); 这一行设置断点,然后按 F5 运行,程序会停在这里,方便你观察变量和寄存器的状态。

进阶技巧:常用外设库和资源

直接操作寄存器虽然有助于理解底层,但在实际开发中非常繁琐,强烈建议使用 STM8 标准外设库

如何使用 SPL 重写上面的代码

SPL 提供了 GPIO_Init 等函数,可以让代码更简洁、可读性更高。

  1. 确保你已经正确设置了包含路径 (第 3 步)。
  2. 修改 main.c 代码如下:
#include "stm8s.h"
// 函数声明
void Delay(uint32_t count);
void main(void)
{
    // 使用库函数初始化 GPIO
    // GPIO_InitTypeDef 结构体在 stm8s_gpio.h 中定义
    GPIO_InitTypeDef GPIO_InitStructure;
    // 使能 GPIOC 时钟
    CLK->PCKENR2 |= (1 << 3);
    // 配置 PC5
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Low;  // 低速
    GPIO_Init(GPIOC, &GPIO_InitStructure);         // 调用库函数进行初始化
    while (1)
    {
        // 点亮 LED
        GPIO_ResetBits(GPIOC, GPIO_Pin_5);
        Delay(50000);
        // 熄灭 LED
        GPIO_SetBits(GPIOC, GPIO_Pin_5);
        Delay(50000);
    }
}
// 延时函数保持不变
void Delay(uint32_t count)
{
    for (uint32_t i = 0; i < count; i++)
    {
        __NOP();
    }
}

SPL 代码解释:

  • GPIO_InitTypeDef: 一个结构体,用于存放 GPIO 的所有配置参数(引脚、模式、速度等)。
  • GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;: 指定我们要配置的是 PC5 引脚。
  • GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;: 指定模式为推挽输出。
  • GPIO_Init(GPIOC, &GPIO_InitStructure);: 调用库函数,一次性完成所有配置。
  • GPIO_ResetBits(GPIOC, GPIO_Pin_5);: 库函数,将指定引脚置为低电平(点亮 LED)。
  • GPIO_SetBits(GPIOC, GPIO_Pin_5);: 库函数,将指定引脚置为高电平(熄灭 LED)。

可以看到,使用 SPL 后,代码的可读性和可维护性大大提高。

其他资源

  • ST 官方文档: 一定要仔细阅读你所用芯片的 Datasheet(数据手册)和 Reference Manual(参考手册),这是最权威的资料。
  • 例程: ST 官网提供的 STM8S SPL 包里,有大量针对各个外设的完整例程,是学习的好材料。
  • 社区: ST 官方社区、CSDN、博客园等平台有大量关于 STM8 开发的教程和讨论。

总结与常见问题

通过本教程,你已经掌握了在 IAR EWSTM8 下进行 STM8 开发的完整流程:

  1. 安装软件 (IAR, ST-LINK Driver, SPL)。
  2. 创建项目 (Workspace, Project, Source File)。
  3. 配置项目 (Target, Include Path, Linker, Debugger)。
  4. 编写代码 (寄存器操作 或 SPL 库函数)。
  5. 编译下载 (Make, Download and Debug)。

常见问题

  • Q: 编译时出现 "Error[Pe018]: undefined identifier 'GPIO_Init'" 或类似错误。

    • A: 99% 的原因是忘记设置 包含路径,请回到第 3 步,检查 C/C++ Compiler -> Preprocessor 中的 Additional include directories 是否正确指向了 SPL 的 inc 文件夹。
  • Q: 点击 Download and Debug 时,提示 "Failed to connect to the target"。

    • A:
      1. 检查 USB 线是否连接好。
      2. 检查开发板上的 ST-LINK 跳线是否正确。
      3. 检查 Debugger 选项中,Driver 是否选择了 ST-LINK
      4. 打开 ST-LINK Utility 软件,看是否能检测到设备,如果检测不到,可能是驱动问题或硬件损坏。
  • Q: LED 不闪烁。

    • A:
      1. 引脚号错误: 确认你的 LED 连接的是不是 PC5,查看开发板原理图。
      2. 电平逻辑错误: STM8S-Discovery 的 LED 是低电平点亮,如果你的代码是高电平点亮,它就永远不会亮。
      3. 时钟未使能: 确认 CLK->PCKENR2 |= (1 << 3); 这一行是否存在。
      4. 延时太短: 如果延时函数的参数太小,人眼可能看不出闪烁效果,会感觉 LED 一直亮着或一直灭着,可以尝试增大延时参数。

希望这份详细的教程能帮助你顺利入门 STM8 开发!祝你编程愉快!

分享:
扫描分享到社交APP
上一篇
下一篇