本篇文章主要介绍的是在STMicroelectronics意法半导体NUCLEO-8L152R8开发板上进行一个简单的LED指示灯和定时器演示。作者使用的是Debian GNU / Linux系统,但本篇文章也适用于其他的Linux发行版、* BSD或其他Unices。 本文我们使用的工具包括: ● 小型设备C编译器(SDCC),版本3.8.0或更高版本,用于编译STM8的C程序。 ● stm8flash,将程序写入设备。最近的版本(2018年11月)需要支持NUCLEO-8L152R8的ST-LINK / V2-1。
硬件设置
只需使用一根USB线连接到开发板即可。
获得SDCC 根据您的操作系统,可能有一种简单的方法来安装SDCC 3.5.0或更新版本使用软件包系统或类似软件(例如Debian上的apt-get install sdcc)。虽然SDCC 3.4.0应该足以满足本文的需要,但是如果您遇到任何错误,可能需要尝试更新的版本。特别是,SDCC 3.4.0存在库搜索路径的问题;这可以通过在链接时显式指定标准库的路径来解决。 SDCC二进制文件或源tarball可以从其网站下载。
获取stm8flash stm8flash源代码可以在其GitHub位置找到,其中还有一个源存档的zip存档的下载链接。要编译它,需要安装C编译器,例如gcc、pkg-config和libusb。将存档解压缩(例如使用解压缩stm8flash-master.zip)更改到目录stm8flash-master并输入make。如果有任何错误,例如找不到头文件,请检查是否已安装pkg-config和libusb的开发文件。
演示程序 我们提供一个简单的演示,每次闪烁一次LED指示灯。这演示了如何设置和使用准确的计时器以及执行基本I / O。以下是C代码: - // Source code under CC0 1.0
- #include <stdint.h>
- #define PB_ODR (*(volatile uint8_t *)0x5005)
- #define PB_DDR (*(volatile uint8_t *)0x5007)
- #define PB_CR1 (*(volatile uint8_t *)0x5008)
- #define CLK_DIVR (*(volatile uint8_t *)0x50c0)
- #define CLK_PCKENR2 (*(volatile uint8_t *)0x50c4)
- #define TIM1_CR1 (*(volatile uint8_t *)0x52b0)
- #define TIM1_PCNTRH (*(volatile uint8_t *)0x52bf)
- #define TIM1_PCNTRL (*(volatile uint8_t *)0x52c0)
- #define TIM1_PSCRH (*(volatile uint8_t *)0x52c1)
- #define TIM1_PSCRL (*(volatile uint8_t *)0x52c2)
- unsigned int clock(void)
- {
- unsigned char h = TIM1_PCNTRH;
- unsigned char l = TIM1_PCNTRL;
- return((unsigned int)(h) << 8 | l);
- }
- void main(void)
- {
- CLK_DIVR = 0x00; // Set the frequency to 16 MHz
- CLK_PCKENR2 |= 0x02; // Enable clock to timer
- // Configure timer
- // 1000 ticks per second
- TIM1_PSCRH = 0x3e;
- TIM1_PSCRL = 0x80;
- // Enable timer
- TIM1_CR1 = 0x01;
- // Configure pins
- PB_DDR = 0x20;
- PB_CR1 = 0x20;
- for(;;)
- {
- PB_ODR = (clock() % 1000 < 500) << 5;
- }
- }
复制代码sdcc是一个独立的,而不是C的托管实现,并允许main函数返回void。我们将定时器设置为每毫秒递增一次,这允许我们实现基本的clock()函数。此函数用于控制LED的闪烁。 假设C代码在led.c中,可以使用sdcc -mstm8 --std-c99 led.c调用sdcc简单地编译该演示。选项-mstm8选择目标端口(stm8)。将生成名称与源文件对应的.ihx文件。
将演示烧写到开发板上 假设stm8flash和led.ihx在同一目录中,则通过集成的stlink-2/1设备连接开发板。/stm8flash -c stlink21 -p stm8l152r8 -w led.ihx将把演示代码写入开发板上。它将每秒运行并闪烁绿色LED LD2一次。
有关stm8flash的更多信息 stm8flash由Valentin Dudouyt撰写。它适用于stlink(包括集成在探索板上的那个)和stlink-v2设备。可以使用-c stlink或-c stlinkv2选择烧写器。使用-p选项选择目标设备(要获取目标设备列表,请使用带有不是stm8设备的选项参数的-p选项,例如-p help.stm8flash将处理以.ihx或.结尾的文件名。十六进制为Intel十六进制,其他文件名为二进制文件。
更多关于SDCC的信息 SDCC最初是由Sandeep Dutta为MCS-51编写的,并且具有相对保守的架构(参见Sandeep Dutta,“编译器剖析”,2000)。它已经被各种贡献者扩展,并且最近结合了一些尖端技术,特别是在寄存器分配中(参见Philipp Klaus Krause,“多项式时间中的最佳寄存器分配”,2013)。 stm8后端主要由Philipp Klaus Krause编写,用于研究字节寄存器分配和溢出(参见Philipp Klaus Krause,“Bytewise Register Allocation”,2015)。 SDCC是一个C编译器,旨在符合C标准。 对于STM8开发人员来说,该编译器的一些重要选项包括: ● -c 编译成稍后要链接的目标文件 ● - 用于在C99模式下编译的-std-c99(虽然某些C99功能,例如sdcc尚不支持可变长度数组) ● --opt-code-size用于优化代码大小 ● --max-allocs-per-node选择优化级别。默认值为3000,更高的值会导致更优化的代码,更长的编译器运行时间以及编译期间更高的内存使用量。 |