天南地北客
发表于: 2018-11-21 17:27:21 | 显示全部楼层

本篇文章主要介绍的是在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。


硬件设置

NUCLEO-8L152R8 LED.gif

只需使用一根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代码:

  1. // Source code under CC0 1.0
  2. #include <stdint.h>

  3. #define PB_ODR        (*(volatile uint8_t *)0x5005)
  4. #define PB_DDR        (*(volatile uint8_t *)0x5007)
  5. #define PB_CR1        (*(volatile uint8_t *)0x5008)

  6. #define CLK_DIVR        (*(volatile uint8_t *)0x50c0)
  7. #define CLK_PCKENR2        (*(volatile uint8_t *)0x50c4)

  8. #define TIM1_CR1        (*(volatile uint8_t *)0x52b0)
  9. #define TIM1_PCNTRH        (*(volatile uint8_t *)0x52bf)
  10. #define TIM1_PCNTRL        (*(volatile uint8_t *)0x52c0)
  11. #define TIM1_PSCRH        (*(volatile uint8_t *)0x52c1)
  12. #define TIM1_PSCRL        (*(volatile uint8_t *)0x52c2)

  13. unsigned int clock(void)
  14. {
  15.         unsigned char h = TIM1_PCNTRH;
  16.         unsigned char l = TIM1_PCNTRL;
  17.         return((unsigned int)(h) << 8 | l);
  18. }

  19. void main(void)
  20. {
  21.         CLK_DIVR = 0x00; // Set the frequency to 16 MHz
  22.         CLK_PCKENR2 |= 0x02; // Enable clock to timer

  23.         // Configure timer
  24.         // 1000 ticks per second
  25.         TIM1_PSCRH = 0x3e;
  26.         TIM1_PSCRL = 0x80;
  27.         // Enable timer
  28.         TIM1_CR1 = 0x01;

  29.         // Configure pins
  30.         PB_DDR = 0x20;
  31.         PB_CR1 = 0x20;

  32.         for(;;)
  33.         {
  34.                 PB_ODR = (clock() % 1000 < 500) << 5;
  35.         }
  36. }
复制代码

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,更高的值会导致更优化的代码,更长的编译器运行时间以及编译期间更高的内存使用量。

跳转到指定楼层
a121440357
发表于: 2020-6-27 09:01:52 | 显示全部楼层

FRFRJCD惊魂甫定的辅导辅导
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 10 | 回复: 18



手机版|

GMT+8, 2024-3-29 14:14 , Processed in 0.191672 second(s), 7 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表