STM8单片机C语言编程技巧

上传人:cn****1 文档编号:504934449 上传时间:2022-07-18 格式:DOC 页数:10 大小:328KB
返回 下载 相关 举报
STM8单片机C语言编程技巧_第1页
第1页 / 共10页
STM8单片机C语言编程技巧_第2页
第2页 / 共10页
STM8单片机C语言编程技巧_第3页
第3页 / 共10页
STM8单片机C语言编程技巧_第4页
第4页 / 共10页
STM8单片机C语言编程技巧_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《STM8单片机C语言编程技巧》由会员分享,可在线阅读,更多相关《STM8单片机C语言编程技巧(10页珍藏版)》请在金锄头文库上搜索。

1、如何分配变量到指定的地址 举例:unsigned char temp_AOxOO; 左义无符号变量temp_A,强制其地址为0x00 unsigned char temp_B0x100; 龙义无符号变量temp_B,强制其地址为0x100tiny unsigned char temp_C; /;e义无符号变M temp_C,由编译器自动在地址小于0x100 的RAM中为其分配一个地址near unsigned char temp_D;/;E义无符号变量temp_D,由编译器自动在地址大于OxFF 的RAM中为其分配一个地址另外也可以采用伪指令pragma将函数或者变量左义到指左的section

2、中,例如:#pragma section name /将下而左义的未初始化变量龙义到.name section中 Unsigned char datal;Un signed int data2;(任何需要定义在.name section中的变蚩:) #pragma section / 返回到正常的 section注意:pragma伪指令可以用来左位函数,初始化变量或者未初始化变量。这三者用不同的 括号区分。(name):代码name:未初始化变量name:初始化变量如何在COSMIC C文件中使用汇编语言在COSMIC C文件中使用汇编语言常见的方法有如下两种:使用#asm .#endasm组

3、合格 式或_asm(“);单行格式。举例1:unsigned char temp_A;Void fund (void)#asmPUSH ALD A,(X)LD _temp_A,APOP A#endasm 注:在C嵌汇编环境下使用全局变量,要在该全局变量名称前加下划线I”。 举例2:Void fund (void)_asm(nrimM);_asm(nop);如何观察RAM/FLASH/EEPROM的最终分配情况 在 Project-settings-linker选项页中,将Category选为0utput,再勾选Generate Map File。Project SettingSettings

4、DebugE ip at45dbxxclnk $ (ToolsetLibOpts) _o$ (OutputFath)$ (TargetSNne). sm8 -mCancelComm andi Generate Error FError FileSymbols sor ted by addiDefaultsUser DefinedLiiJcer Post-Build.AssemblerLogical Address Symbsettings-PostBuild选项页中,在commands栏内加入下行命令:chex -fi -o $(OutputPath)$(TargetSName).hex $(

5、0utputPath)$(TargetSName).sm8再次编译链接该项目,如果成功则会在项目输出目录中(本例是在C:STM8_NewProject 1 debug 目录下)生成.hex 文件。什么是 MEMORY MODELSTM8的C编译器支持多种存储器模式。用户可以根据应用的需要选择最适合的配宜。可 以根据需要选择采用2个字节的寻址方式(仅适用于64k以内的程序)或者3字节的寻址 方式。也可以规泄将变量默认为泄义在存储器的哪一区域:zero page内,还是zero page 外。下而对几种供选择的MEMORY MODEL做简单说明。在 Project-settings-C Compi

6、ler选项页中,将Category 选为 General,里面有一个 Memory Models选项栏如下:在下拉菜单中共有4种MEMORY MODEL可供选择: 程序地址空间在64K以内(即程序容量小于32K)modsO,modslO 程序地址哦那个键在64K以上(即程序容量大于32K)modsmodslMODSOMODSLOMODSMODSL名称Stack Short 短堆栈模式Stack Long 长堆栈模式Stack Short 短堆栈模式Stack Long 长堆栈模式程序地址空间程序所川到的地址空间在64K范国内程序所用到的地址空间超出64K范国指针默认类型函数指针和数据指针默认为

7、near (2 bytes)函数指针默认为3(地址为3字节): 数据指针默认为near全局变量默认 类型所有全局变量的地址默 所有全局变疑默认为 所有全局变虽的地址默 所有全局变量默认 认为1个字节。对于地址Long型。若要将变量地认为1个字节。对于地址Long型。若要将变 超出1个字节的变量,必址泄义为1个字节,必须超岀1个字节的变量,必址泄义为1个字节, 须用near 义 |ffltiny定义| 须HJnear定义 ffltiny疋义Ikf文件的作用.Ikf文件在程序链接时决圧如何具体分配RAM/ROM的空间。在Project Settings - Linker- Category(lnp

8、ut)选项页中,当Auto”选择框被选中时,由系统自动生成LKF文件,否则由用户指左。当Auto选择框被勾选时,.lkf文件会自动生成在项目主目录下的debug/和release/目录 中。下而以上图所示at45DBXX Project的Ikf文件为例,来进一步理解kf。在.Ikf中,以”#开头的行是注释行,为方便用户理解,将原注释删除,代之以中文注释如下: #泄义(+seg)个常量段(.const),开始(b)于0X8080,最大分配(m)0x1ff80个字肖(即不超 过#0x27FFF),为该段起需(n)为.const(和常量段的保留字同名),需要初始化的变呈的初始值 存#放于此段(-it

9、)+seg .const -b 0x8080 -m Ox Iff 80 -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),为该段起0n)为.eeprom (和EEPROM段的保留字同名)。+seg .eeprom -b 0x4000 -

10、m 0x800 -n .eeprom# .bsct段服务于定义在0页(地址小于0x100)以内需要初始化的全局变量(如tiny char a = 9;)+seg .bsct -b 0x0 -m 0x100 -n .bsct# .ubsct段服务于左义在0页(地址小于0x100)以内不需要初始化的全局变量(如tiny char b;)+seg ubsct -a .bsct n .ubsct#bit表示位域段,左义后即可在程序中使用_Bool变量(如_Boolc = 1;),id表示该段需要 初始化。+seg .bit -a .ubsct -n .bit -id#这是ST7时代(STMS是基于ST

11、7发展而来的)由于物理堆栈小,速度慢,使用内存来模 拟堆栈的变通手段。+seg .share -a .bit -n .share -is# .data段服务于左义在0页(地址大于OxFF)以外需要初始化的全局变量(如near char d = 8;)+seg .data -b 0x100 -m 0x1300 -n .data# .bss段服务于泄义在0页(地址大于OxFF)以内不需要初始化的全局变虽:(如 near char e;) +seg .bss -a .data -n .bss#段左义结束,下面放置的库及Obj文件中的变量、常量、程序就按照上而的规定进行分 配。#初始化程序crtsi0

12、.sm8#用户程序Debugmai n.o# 些必要的cosmic库libis0.sm8libm0.sm8#重左义常量段,开始于0x8000,用于放宜中断向量表(STM8硬件决泄此位置)#-k用于程序冗余代码优化,详情可参考cosmic用户手册。+seg .const -b 0x8000 -k#中断向量Debugstm8_i ntenupt_vector.o#定义了三个玉呈:,用于系统初始化+def _endzp=.ubsct # end of uninitialized zpage+def _memory=.bss # end of bss segment+def _stack=0x17ff

13、 #不同的芯片_stack内容不同,由系统自动生成如何实现位操作Cosmic C编译器支持位变量的操作,可以将苴定义成_Bool类型。_Bool类型的变屋只包 含两种值true (1)或者false (0)。若将一个表达式赋值给_Bool变量,则编译器会将表 达式与0做比较,然后将布尔值赋给_Bool变疑。因此,任何虽型或者表达式的值都可以赋 给_Bool变量。但是,布尔变量不能泄义位数组,只能左义成结构体或者联合。而且,_Bool 变量会被打包成字节的形式。编译器会将所有的全局_Bool变量打包成字节形式,存放在.bit section中。局部_Bool变量 也会被打包成字节形式。但是_Bo

14、ol类型的参数会被扩展成一个单字节。具体的关于位变疑的泄义和使用可参考如下例子:定义位变量:_Bool in_range;_Bool p_valid;char *ptr;使用位变屋:in_range = (value = 10) & (value = 20); p_valid = ptr; r p_valid is true if ptr not 0 7 if (p_valid & in_在使用位变量时,若程序编译时提示如下错误:#error clnk Debugexamplekf:1 no default placement for segment .bitThe command: ”clnk -lMM -o Debugexample.sm8 mDebugexample.map sa DebugexamplekfM has failed, the returned value is: 1 exit code=1.实际上是由于,在项目中没有圧义.bitsection.可按照如下步骤,手工添Jn.bitsection: 打开项目链接配置窗口: Project - Settings - Linke

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 活动策划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号