本教程适用于 STM8S 系列(如 STM8S103,这是 Discovery 开发板上常用的芯片),但核心步骤和概念同样适用于其他 STM8 系列(如 STM8A, STM8L)。
目录
- 准备工作:安装所需软件
- 创建第一个项目:新建工作区和项目
- 配置项目:设置选项和编译器
- 编写代码:点亮第一个 LED
- 下载和调试:连接硬件并运行
- 进阶技巧:常用外设库和资源
- 总结与常见问题
准备工作:安装所需软件
在开始之前,你需要准备好以下工具:
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: 创建工作区
- 打开 IAR EWSTM8。
- 选择
File -> New -> Workspace...。 - 选择一个位置,保存你的工作区文件(
MyFirstProject.eww)。
步骤 2: 创建项目
- 在左侧的
Workspace窗口中,右键点击Workspace 'MyFirstProject.eww'。 - 选择
Add -> New Project...。 - 在弹出的窗口中,选择
C/C++ Application。 - 给项目命名,
Blink_LED。 - 选择项目保存位置,点击
OK。
步骤 3: 添加源文件
-
在
Workspace窗口中,右键点击新创建的Blink_LED项目。 -
选择
Add -> New Group...,创建一个名为Src的文件夹,用于存放源代码。 -
再次右键点击
Src文件夹,选择Add -> New Item...。 -
选择
C File,命名为main.c。 -
点击
OK,现在你的项目结构看起来应该像这样:- MyFirstProject.eww - Blink_LED - Src - main.c
配置项目:设置选项和编译器
这是最关键的一步,确保项目能正确编译和下载。
步骤 1: 设置目标芯片
- 右键点击
Blink_LED项目,选择Options...。 - 在左侧菜单中,选择
General Options -> Target。 - 在
Device下拉菜单中,选择你的具体芯片型号,STM8S103F3P6(STM8S-Discovery 板载芯片)。 - 点击
OK。
步骤 2: 设置包含路径
为了让编译器能找到 STM8S 标准外设库的头文件(.h 文件),我们需要添加其路径。
- 再次打开项目选项 (
Options...)。 - 在左侧菜单中,选择
C/C++ Compiler -> Preprocessor。 - 在
Additional include directories字段中,点击 "..." 按钮,添加 STM8S SPL 库的头文件路径。- 如果你将 SPL 解压在
D:\STM8S_StdPeriph_Driver,那么路径就是:D:\STM8S_StdPeriph_Driver\Libraries\STM8S_StdPeriph_Driver\inc
- 如果你将 SPL 解压在
- 点击
OK。
步骤 3: 设置链接器
链接器需要知道芯片的启动文件和内存布局。
- 打开项目选项 (
Options...)。 - 在左侧菜单中,选择
Linker -> Config。 - 在
Linker configuration file下拉菜单中,选择对应的启动文件。- 对于 STM8S 系列,通常是
stm8s103f3_p.icf(文件名可能略有不同,但前缀是stm8s...),这个文件在 IAR 安装目录下,C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.3\stm8\config\。
- 对于 STM8S 系列,通常是
- 点击
OK。
步骤 4: 设置调试器
配置如何通过 ST-LINK 连接到硬件。
- 打开项目选项 (
Options...)。 - 在左侧菜单中,选择
Debugger。 - 在
Driver下拉菜单中,选择ST-LINK。 - 确保
Interface设置为SWD。 - 在
Download选项卡中,勾选Erase flash before programming和Verify flash after programming。 - 点击
OK。
编写代码:点亮第一个 LED
我们编写代码来让 STM8S-Discovery 板上的 LED 闪烁。
- 双击
main.c文件,打开它。 - 删除默认内容,粘贴以下代码:
#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: 连接硬件
- 用 USB 线将 STM8S-Discovery 开发板连接到你的电脑。
- 确保开发板上的 ST-LINK 调试器已通过跳线或开关选择为调试模式(通常默认就是)。
步骤 2: 编译和下载
- 点击工具栏上的 Make 按钮(一个绿色的对勾)或按
F7,如果没有错误,编译器会生成.hex文件。 - 点击工具栏上的 Download and Debug 按钮(一个向下箭头+虫子图标)或按
Ctrl + D。 - IAR 会自动连接 ST-LINK,擦除芯片,下载编译好的程序,然后进入调试模式。
步骤 3: 运行和观察
- 如果一切顺利,你应该能看到 STM8S-Discovery 板上的 LED 开始闪烁!
- 在调试模式下,你可以使用工具栏上的按钮来控制程序:
- Go (F5): 全速运行。
- Stop (Shift + F5): 停止调试。
- Step Over (F10): 单步跳过函数。
- Step Into (F11): 单步进入函数。
- 你还可以在
main.c中,在GPIOC->ODR &= ~(1 << 5);这一行设置断点,然后按F5运行,程序会停在这里,方便你观察变量和寄存器的状态。
进阶技巧:常用外设库和资源
直接操作寄存器虽然有助于理解底层,但在实际开发中非常繁琐,强烈建议使用 STM8 标准外设库。
如何使用 SPL 重写上面的代码
SPL 提供了 GPIO_Init 等函数,可以让代码更简洁、可读性更高。
- 确保你已经正确设置了包含路径 (第 3 步)。
- 修改
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 开发的完整流程:
- 安装软件 (IAR, ST-LINK Driver, SPL)。
- 创建项目 (Workspace, Project, Source File)。
- 配置项目 (Target, Include Path, Linker, Debugger)。
- 编写代码 (寄存器操作 或 SPL 库函数)。
- 编译下载 (Make, Download and Debug)。
常见问题
-
Q: 编译时出现 "Error[Pe018]: undefined identifier 'GPIO_Init'" 或类似错误。
- A: 99% 的原因是忘记设置 包含路径,请回到第 3 步,检查
C/C++ Compiler -> Preprocessor中的Additional include directories是否正确指向了 SPL 的inc文件夹。
- A: 99% 的原因是忘记设置 包含路径,请回到第 3 步,检查
-
Q: 点击 Download and Debug 时,提示 "Failed to connect to the target"。
- A:
- 检查 USB 线是否连接好。
- 检查开发板上的 ST-LINK 跳线是否正确。
- 检查
Debugger选项中,Driver是否选择了ST-LINK。 - 打开 ST-LINK Utility 软件,看是否能检测到设备,如果检测不到,可能是驱动问题或硬件损坏。
- A:
-
Q: LED 不闪烁。
- A:
- 引脚号错误: 确认你的 LED 连接的是不是 PC5,查看开发板原理图。
- 电平逻辑错误: STM8S-Discovery 的 LED 是低电平点亮,如果你的代码是高电平点亮,它就永远不会亮。
- 时钟未使能: 确认
CLK->PCKENR2 |= (1 << 3);这一行是否存在。 - 延时太短: 如果延时函数的参数太小,人眼可能看不出闪烁效果,会感觉 LED 一直亮着或一直灭着,可以尝试增大延时参数。
- A:
希望这份详细的教程能帮助你顺利入门 STM8 开发!祝你编程愉快!
