STM8单片机C语言编程技巧Word版.docx
- 文档编号:4556916
- 上传时间:2023-05-07
- 格式:DOCX
- 页数:8
- 大小:170.79KB
STM8单片机C语言编程技巧Word版.docx
《STM8单片机C语言编程技巧Word版.docx》由会员分享,可在线阅读,更多相关《STM8单片机C语言编程技巧Word版.docx(8页珍藏版)》请在冰点文库上搜索。
STM8单片机C语言编程技巧Word版
如何分配变量到指定的地址
举例:
unsignedchartemp_A@0x00;//定义无符号变量temp_A,强制其地址为0x00
unsignedchartemp_B@0x100;//定义无符号变量temp_B,强制其地址为0x100
@tinyunsignedchartemp_C;//定义无符号变量temp_C,由编译器自动在地址小于0x100的RAM中为其分配一个地址
@nearunsignedchartemp_D;//定义无符号变量temp_D,由编译器自动在地址大于0xFF的RAM中为其分配一个地址
另外也可以采用伪指令"pragma"将函数或者变量定义到指定的section中,例如:
#pragmasection[name]//将下面定义的未初始化变量定义到.namesection中
Unsignedchardata1;
Unsignedintdata2;
……(任何需要定义在.namesection中的变量)
……
#pragmasection[]//返回到正常的section.
注意:
pragma伪指令可以用来定位函数,初始化变量或者未初始化变量。
这三者用不同的括号区分。
(name):
代码
[name]:
未初始化变量
{name}:
初始化变量
如何在COSMICC文件中使用汇编语言
在COSMICC文件中使用汇编语言常见的方法有如下两种:
使用#asm…#endasm组合格式
或_asm("…");单行格式。
举例1:
unsignedchartemp_A;
Voidfunc1(void)
{
...
#asm
PUSHA
LDA,(X)
LD_temp_A,A
POPA
#endasm
...
}
注:
在C嵌汇编环境下使用全局变量,要在该全局变量名称前加下划线"_"。
举例2:
Voidfunc1(void)
{
...
_asm("rim");
_asm("nop");
...
}
如何观察RAM/FLASH/EEPROM的最终分配情况
在Project->settings->linker选项页中,将Category选为Output,再勾选GenerateMapFile。
点击OK按键后,再次编译链接该项目,如果成功则会在项目输出目录中(本例是在C:
\STM8_NewProject1\debug目录下)生成.map文件。
该文件详细地列出RAM/FLASH/EEPROM的分配使用情况。
如何生成hex格式的输出文件
在Project->settings->PostBuild选项页中,在commands栏内加入下行命令:
chex–fi-o$(OutputPath)$(TargetSName).hex$(OutputPath)$(TargetSName).sm8
再次编译链接该项目,如果成功则会在项目输出目录中(本例是在C:
\STM8_NewProject1\debug目录下)生成.hex文件。
什么是MEMORYMODEL
STM8的C编译器支持多种存储器模式。
用户可以根据应用的需要选择最适合的配置。
可以根据需要选择采用2个字节的寻址方式(仅适用于64k以内的程序)或者3字节的寻址方式。
也可以规定将变量默认为定义在存储器的哪一区域:
zeropage内,还是zeropage外。
下面对几种供选择的MEMORYMODEL做简单说明。
在Project->settings->CComplier选项页中,将Category选为General,里面有一个MemoryModels选项栏如下:
在下拉菜单中共有4种MEMORYMODEL可供选择:
∙程序地址空间在64K以内(即程序容量小于32K)
mods0,
modsl0
∙程序地址哦那个键在64K以上(即程序容量大于32K)
mods
modsl
MODS0
MODSL0
MODS
MODSL
名称
StackShort
短堆栈模式
StackLong
长堆栈模式
StackShort
短堆栈模式
StackLong
长堆栈模式
程序地址空间
程序所用到的地址空间在64K范围内
程序所用到的地址空间超出64K范围
指针默认类型
函数指针和数据指针默认为@near(2bytes)
函数指针默认为@far(地址为3字节);
数据指针默认为@near
全局变量默认类型
所有全局变量的地址默认为1个字节。
对于地址超出1个字节的变量,必须用@near定义
所有全局变量默认为Long型。
若要将变量地址定义为1个字节,必须用@tiny定义
所有全局变量的地址默认为1个字节。
对于地址超出1个字节的变量,必须用@near定义
所有全局变量默认为Long型。
若要将变量地址定义为1个字节,必须用@tiny定义
.lkf文件的作用
.lkf文件在程序链接时决定如何具体分配RAM/ROM的空间。
在ProjectSettings–Linker–Category(Input)选项页中,当"Auto"选择框被选中时,由系统自动生成.LKF文件,否则由用户指定。
当"Auto"选择框被勾选时,.lkf文件会自动生成在项目主目录下的debug/和release/目录中。
下面以上图所示at45DBXXProject的lkf文件为例,来进一步理解.lkf。
在.lkf中,以"#"开头的行是注释行,为方便用户理解,将原注释删除,代之以中文注释如下:
#定义(+seg)一个常量段(.const),开始(b)于0x8080,最大分配(m)0x1ff80个字节(即不超过
#0x27FFF),为该段起名(n)为.const(和常量段的保留字同名),需要初始化的变量的初始值存
#放于此段(-it)
+seg.const-b0x8080-m0x1ff80-n.const-it
#定义(+seg)一个程序段(.text),紧跟(-a)在.const段后面(和.const共同位于0x8080–
#0x27FFF),为该段起名(n)为.text(和程序段的保留字同名)。
+seg.text-a.const-n.text
#定义(+seg)一个EEPROM段(.eeprom),开始(b)于0x4000,最大分配(m)0x800个字节(即不超
#过0x47FF),为该段起名(n)为.eeprom(和EEPROM段的保留字同名)。
+seg.eeprom-b0x4000-m0x800-n.eeprom
#.bsct段服务于定义在0页(地址小于0x100)以内需要初始化的全局变量(如@tinychara=9;)
+seg.bsct-b0x0-m0x100-n.bsct
#.ubsct段服务于定义在0页(地址小于0x100)以内不需要初始化的全局变量(如@tinycharb;)
+seg.ubsct-a.bsct-n.ubsct
#.bit表示位域段,定义后即可在程序中使用_Bool变量(如_Boolc=1;),-id表示该段需要初始化。
+seg.bit-a.ubsct-n.bit-id
#这是ST7时代(STM8是基于ST7发展而来的)由于物理堆栈小,速度慢,使用内存来模拟堆栈的变通手段。
+seg.share-a.bit-n.share-is
#.data段服务于定义在0页(地址大于0xFF)以外需要初始化的全局变量(如@nearchard=8;)
+seg.data-b0x100-m0x1300-n.data
#.bss段服务于定义在0页(地址大于0xFF)以内不需要初始化的全局变量(如@nearchare;)
+seg.bss-a.data-n.bss
#段定义结束,下面放置的库及Obj文件中的变量、常量、程序就按照上面的规定进行分配。
#初始化程序
crtsi0.sm8
#用户程序
Debug\main.o
…
#一些必要的cosmic库
libis0.sm8
libm0.sm8
#重定义常量段,开始于0x8000,用于放置中断向量表(STM8硬件决定此位置)
#–k用于程序冗余代码优化,详情可参考cosmic用户手册。
+seg.const-b0x8000–k
#中断向量
Debug\stm8_interrupt_vector.o
#定义了三个变量,用于系统初始化
+def__endzp=@.ubsct#endofuninitializedzpage
+def__memory=@.bss#endofbsssegment
+def__stack=0x17ff#不同的芯片__stack内容不同,由系统自动生成
如何实现位操作
CosmicC编译器支持位变量的操作,可以将其定义成_Bool类型。
_Bool类型的变量只包含两种值true
(1)或者false(0)。
若将一个表达式赋值给_Bool变量,则编译器会将表达式与0做比较,然后将布尔值赋给_Bool变量。
因此,任何整型或者表达式的值都可以赋给_Bool变量。
但是,布尔变量不能定义位数组,只能定义成结构体或者联合。
而且,_Bool变量会被打包成字节的形式。
编译器会将所有的全局_Bool变量打包成字节形式,存放在.bitsection中。
局部_Bool变量也会被打包成字节形式。
但是_Bool类型的参数会被扩展成一个单字节。
具体的关于位变量的定义和使用可参考如下例子:
定义位变量:
_Boolin_range;
_Boolp_valid;
char*ptr;
使用位变量:
in_range=(value>=10)&&(value<=20);
p_valid=ptr;/*p_validistrueifptrnot0*/
if(p_valid&&in_
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- STM8 单片机 语言 编程 技巧 Word