STM8S使用常用问题汇总
==================================================================
按外设模块
======================================================================
============================== GPIO/AFIO =============================
=============================== Beep =================================
1、STM8S提供一个Beep引脚。通过简单的配置即可输出1K、2K、4K三种频率信号驱动外部蜂鸣器。
由于默认情况下Beep输出引脚PD4为TIM2_CC1功能,为此我们需要打开“Option Bytes”的AFR7选项。
打开STVP,选择你使用的MCU型号,找到"Option Bytes"标签。将AFR7改为"Port D4 Alternate Function = Beep"。
菜单栏选择"Program" -> "Current tab",成功后,即可正常使用Beep输出功能。
==================================================================
=============================== Power/RESET =========================
1、STM8S为双电源MCU,外设工作电压为3V~5.5V,内核工作电压为1.8V。因MCU内部已集成1.8V 低功耗电压(LPVR)调节器,MCU工作仅需提供一个供电电源。在电源电路设计时,需要注意芯片VCAP引脚上要提供滤波电容,该电容用于对内部1.8V供电滤波,容值不小于470nF为宜,瓷片和Ta电容均可,尽量选择较低ESR(等效串联电阻值)的型号。
2、MCU芯片自带上电复位(POR)与掉电复位(BOR),工作时供电需注意POR、BOR工作范围。
1)、POR - Power-On Reset 上电复位
POR的功能是在VDD电压由低向高上升越过规定的阀值(VIT+)之前,保持芯片复位,当越过这个阀值(VIT+)后的一小段时间后(Reset temporization),结束复位开始取复位向量执行指令。
2)、BOR - Brown-Out Reset 掉电复位
BOR的功能是在VDD电压由高向低下降越过规定的阀值(VIT-)后,将在芯片内部产生复位。
3、芯片复位地址指向0x6000(内部Bootloader存放首地址),在检查无Boot操作,PC指向0x8080地址。0x8000~0x807F为中断向量占用。
==================================================================
==================================================================
按使用开发环境
======================================================================
============================== STVD =============================
1、STVD如何输出hex文件
菜单栏 Project -> Setting 打开“Post_Build”标签,命令框原默认定义:
chex -o $(OutputPath)$(TargetSName).s19 $(OutputPath)$(TargetSName).sm8
输出S19格式的目标文件。
在其中增加或修改为:
chex -fi -o $(OutputPath)$(TargetSName).hex $(OutputPath)$(TargetSName).sm8
即可输出hex格式目标文件。
生成hex文件被输出到目录 项目“\Debug”目录下。
如图:
(原文件名:hex.png)
引用图片
============================== RIDE =============================
==================================================================
==================================================================
按编译器
======================================================================
============================== STM8 ASM =============================
============================== COSMIC =============================
1、
@tiny - Zero Page(0x00~0xFF) 申明 :@tiny char a
a) .bsct - 在zero page区域的初始化变量
b) .ubsct- 在zero page里面的未初始化变量
c) .bit - 位操作段
d) .share
@near - Zero page 以外的RAM区域
a) .bss - 未初始化变量区域;
b) .data - 已初始化变量区域;
c) .const - 常量区域
@far
.fdata (large variable)
.fconst
.text
@EEPROM
2、
Placing Data Objects in Short Range Memory
@tiny char c;
#pragma space extern [] @tiny
Placing Data Objects in Long Range Memory
@near char ext;
#pragma space extern [] @near
Placing Data Objects in the EEPROM Space
@eeprom char var;
#pragma space extern [] @eeprom @near
Note:The @near modifier is necessary because the eeprom is located outside the zero page.
3、
Memory Models for code smaller than 64K
Stack Short ( mods0) - Global variables are defaulted to short range
Any global object in long range will have to be accessed explicitly with the @near modifier unless accessed through a pointer.
Stack Long ( modsl0) - Global variables are defaulted to long range
Any object in short range will have to be accessed explicitly with the @tiny modifier.
Memory Models for code larger than 64K
Stack Short ( mods) - Global variables are defaulted to short range
Any global object in long range will have to be accessed explicitly with the @near modifier unless accessed through a pointer.
Stack Long ( modsl) - Global variables are also defaulted to long range
Any object in short range will have to be accessed explicitly with the @tiny modifier
4、变量地址的绝对定位:
char acia @0x20;
#define acia *(char *)0x20
struct acia
{
char status;
char data;
} acia @0x6000
Note :that COSMIC C does support the pointer and #define methods of implementing I/O access.
5、内嵌汇编
1)、#pragma asm / #pragma endasm
2)、#asm / #endasm
3)、_asm("rim")
#pragma asm Extern char test;
XREF asmvar void func(void)
#pragma endasm {
if (test)
#asm /* no need for { */
SCF ;Set carry bit
RLC asmvar ;Access assembler variable
#endasm
else
test = 1;
6、
==================================================================
==================================================================
按外设模块
======================================================================
============================== GPIO/AFIO =============================
=============================== Beep =================================
1、STM8S提供一个Beep引脚。通过简单的配置即可输出1K、2K、4K三种频率信号驱动外部蜂鸣器。
由于默认情况下Beep输出引脚PD4为TIM2_CC1功能,为此我们需要打开“Option Bytes”的AFR7选项。
打开STVP,选择你使用的MCU型号,找到"Option Bytes"标签。将AFR7改为"Port D4 Alternate Function = Beep"。
菜单栏选择"Program" -> "Current tab",成功后,即可正常使用Beep输出功能。
==================================================================
=============================== Power/RESET =========================
1、STM8S为双电源MCU,外设工作电压为3V~5.5V,内核工作电压为1.8V。因MCU内部已集成1.8V 低功耗电压(LPVR)调节器,MCU工作仅需提供一个供电电源。在电源电路设计时,需要注意芯片VCAP引脚上要提供滤波电容,该电容用于对内部1.8V供电滤波,容值不小于470nF为宜,瓷片和Ta电容均可,尽量选择较低ESR(等效串联电阻值)的型号。
2、MCU芯片自带上电复位(POR)与掉电复位(BOR),工作时供电需注意POR、BOR工作范围。
1)、POR - Power-On Reset 上电复位
POR的功能是在VDD电压由低向高上升越过规定的阀值(VIT+)之前,保持芯片复位,当越过这个阀值(VIT+)后的一小段时间后(Reset temporization),结束复位开始取复位向量执行指令。
2)、BOR - Brown-Out Reset 掉电复位
BOR的功能是在VDD电压由高向低下降越过规定的阀值(VIT-)后,将在芯片内部产生复位。
3、芯片复位地址指向0x6000(内部Bootloader存放首地址),在检查无Boot操作,PC指向0x8080地址。0x8000~0x807F为中断向量占用。
==================================================================
==================================================================
按使用开发环境
======================================================================
============================== STVD =============================
1、STVD如何输出hex文件
菜单栏 Project -> Setting 打开“Post_Build”标签,命令框原默认定义:
chex -o $(OutputPath)$(TargetSName).s19 $(OutputPath)$(TargetSName).sm8
输出S19格式的目标文件。
在其中增加或修改为:
chex -fi -o $(OutputPath)$(TargetSName).hex $(OutputPath)$(TargetSName).sm8
即可输出hex格式目标文件。
生成hex文件被输出到目录 项目“\Debug”目录下。
如图:
(原文件名:hex.png)
============================== RIDE =============================
==================================================================
==================================================================
按编译器
======================================================================
============================== STM8 ASM =============================
============================== COSMIC =============================
1、
@tiny - Zero Page(0x00~0xFF) 申明 :@tiny char a
a) .bsct - 在zero page区域的初始化变量
b) .ubsct- 在zero page里面的未初始化变量
c) .bit - 位操作段
d) .share
@near - Zero page 以外的RAM区域
a) .bss - 未初始化变量区域;
b) .data - 已初始化变量区域;
c) .const - 常量区域
@far
.fdata (large variable)
.fconst
.text
@EEPROM
2、
Placing Data Objects in Short Range Memory
@tiny char c;
#pragma space extern [] @tiny
Placing Data Objects in Long Range Memory
@near char ext;
#pragma space extern [] @near
Placing Data Objects in the EEPROM Space
@eeprom char var;
#pragma space extern [] @eeprom @near
Note:The @near modifier is necessary because the eeprom is located outside the zero page.
3、
Memory Models for code smaller than 64K
Stack Short ( mods0) - Global variables are defaulted to short range
Any global object in long range will have to be accessed explicitly with the @near modifier unless accessed through a pointer.
Stack Long ( modsl0) - Global variables are defaulted to long range
Any object in short range will have to be accessed explicitly with the @tiny modifier.
Memory Models for code larger than 64K
Stack Short ( mods) - Global variables are defaulted to short range
Any global object in long range will have to be accessed explicitly with the @near modifier unless accessed through a pointer.
Stack Long ( modsl) - Global variables are also defaulted to long range
Any object in short range will have to be accessed explicitly with the @tiny modifier
4、变量地址的绝对定位:
char acia @0x20;
#define acia *(char *)0x20
struct acia
{
char status;
char data;
} acia @0x6000
Note :that COSMIC C does support the pointer and #define methods of implementing I/O access.
5、内嵌汇编
1)、#pragma asm / #pragma endasm
2)、#asm / #endasm
3)、_asm("rim")
#pragma asm Extern char test;
XREF asmvar void func(void)
#pragma endasm {
if (test)
#asm /* no need for { */
SCF ;Set carry bit
RLC asmvar ;Access assembler variable
#endasm
else
test = 1;
6、
==================================================================