STM8单片机C语言编程技巧

上传人:z**** 文档编号:65985140 上传时间:2022-03-26 格式:DOC 页数:5 大小:379.50KB
收藏 版权申诉 举报 下载
STM8单片机C语言编程技巧_第1页
第1页 / 共5页
STM8单片机C语言编程技巧_第2页
第2页 / 共5页
STM8单片机C语言编程技巧_第3页
第3页 / 共5页
资源描述:

《STM8单片机C语言编程技巧》由会员分享,可在线阅读,更多相关《STM8单片机C语言编程技巧(5页珍藏版)》请在装配图网上搜索。

1、如何分配变量到指定的地址举例:unsignedchartemp_A0x00;/unsignedchartemp_B0x100;/定义无符号变量temp_A,强制其地址为0x00定义无符号变量temp_B,强制其地址为0x100tinyunsignedchartemp_C;/定义无符号变量temp_C,由编译器自动在地址小于的RAM中为其分配一个地址nearunsignedchartemp_D;/定义无符号变量temp_D,由编译器自动在地址大于的RAM中为其分配一个地址另外也可以采用伪指令pragma将函数或者变量定义到指定的section中,例如:#pragmasectionname/将下面

2、定义的未初始化变量定义到.namesection中0x1000xFFUnsignedchardata1;Unsignedintdata2;(任何需要定义在.namesection中的变量)#pragmasection/返回到正常的section.注意:pragma伪指令可以用来定位函数,初始化变量或者未初始化变量。这三者用不同的括号区分。(name):代码name:未初始化变量name:初始化变量如何在COSMICC文件中使用汇编语言在COSMICC文件中使用汇编语言常见的方法有如下两种:使用#asm#endasm式或_asm(”);单行格式。举例1:unsignedchartemp_A;Vo

3、idfunc1(void)组合格#asmPUSHALDA,(X)LD_temp_A,APOPA#endasm注:在C嵌汇编环境下使用全局变量,要在该全局变量名称前加下划线举例2:Voidfunc1(void)_asm(rim);_asm(nop);如何观察RAM/FLASH/EEPROM的最终分配情况在Project-settings-linker选项页中,将Category选为Output,再勾选GenerateMapFile。PrcjectSettingsFost-BijiildFost-BijiildAssanblerFreLiitkLanierjfogt-EuUefaultsError

4、FileGenerslte1ErrorFGeniiitsNipFiJame*Log!calAddressSynibcESymbolssortedByAlpFhvsic&lA.ddr*sSvmbi:SymbolssortedbyMserDefined.1DonmandIclnk$q|$Qty说F讥h)$(Tar舉烷Nan*詢RF*QE|Cwncel点击OK按键后,再次编译链接该项目,如果成功则会在项目输出目录中(本例是在C:STM8_NewProject1debug目录下)生成.map文件。该文件详细地列出RAM/FLASH/EEPROM的分配使用情况。如何生成hex格式的输出文件在Projec

5、t-settings-PostBuild选项页中,在commands栏内加入下行命令:chex-fi-o$(OutputPath)$(TargetSName).hex$(OutputPath)$(TargetSName).sm8再次编译链接该项目,如果成功则会在项目输出目录中(本例是在C:STM8_NewProject1debug目录下)生成.hex文件。什么是MEMORYMODELSTM8的C编译器支持多种存储器模式。用户可以根据应用的需要选择最适合的配置。可以根据需要选择采用2个字节的寻址方式(仅适用于64k以内的程序)或者3字节的寻址方式。也可以规定将变量默认为定义在存储器的哪一区域:z

6、eropage内,还是zeropage外。下面对几种供选择的MEMORYMODEL做简单说明。在Project-settings-CComplier选项页中,将Category选为General,里面有一个MemoryModels选项栏如下:在下拉菜单中共有4种MEMORYMODEL可供选择:?程序地址空间在64K以内(即程序容量小于32K)modsO,modslO?程序地址哦那个键在64K以上(即程序容量大于32K)modsmodslMODS0MODSL0MODSMODSL名称StackShort短堆栈模式StackLong长堆栈模式StackShort短堆栈模式StackLong长堆栈模式

7、程序地址空间程序所用到的地址空间在64K范围内程序所用到的地址空间超出64K范围指针默认类型函数指针和数据指针默认为near(2bytes)函数指针默认为far(地址为3字节);数据指针默认为near全局变量默认类型所有全局变量的地址默所有全局变量默认为认为1个字节。对于地址Long型。若要将变量地超出1个字节的变量,必址定义为1个字节,必须须用near定义用tiny定义所有全局变量的地址默所有全局变量默认认为1个字节。对于地址Long型。若要将变量超出1个字节的变量,必址定义为1个字节,须用near定义用tiny定义.lkf文件的作用kf文件在程序链接时决定如何具体分配RAM/ROM的空间。

8、在ProjectSettings-Linker-Category。nput)选项页中,当Auto选择框被选中时,由系统自动生成丄KF文件,否则由用户指定。当Auto选择框被勾选时,kf文件会自动生成在项目主目录下的debug/和release/目录中。下面以上图所示at45DBXXProject的lkf文件为例,来进一步理解kf。在.lkf中,以#开头的行是注释行,为方便用户理解,将原注释删除,代之以中文注释如下:#定义什seg)个常量段(.const),开始(b)于0x8080,最大分配(m)0x1ff80个字节(即不超过0X27FFF),为该段起名(n)为.const(和常量段的保留字同名

9、),需要初始化的变量的初始值存#放于此段(-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段的保留字同名)。段服务于定义在0页(地址小于0x1

10、00)以内需要初始化的全局变量(如tinychara=# .ubsct段服务于定义在0页(地址小于0x100)以内不需要初始化的全局变量(如tinycharb;).bit表示位域段,定义后即可在程序中使用_Bool变量(如_Boolc=1;),-id表示该段需要初始化。#这是ST7时代(STM8是基于ST7发展而来的)由于物理堆栈小,速度慢,使用内存来模拟堆栈的变通手段。#.data段服务于定义在0页(地址大于0xFF)以外需要初始化的全局变量(如nearchard=8;)#.bss段服务于定义在0页(地址大于0xFF)以内不需要初始化的全局变量(如#段定义结束,下面放置的库及Obj文件中的变

11、量、常量、程序就按照上面的规定进行分配。#初始化程序crtsi0.sm8#用户程序Debugmain.o#一些必要的cosmic库#重定义常量段,开始于0x8000,用于放置中断向量表(STM8硬件决定此位置)#七用于程序冗余代码优化,详情可参考cosmic用户手册。+seg.const-b0x8000-k#中断向量Debugstm8_interrupt_vector.o#定义了三个变量,用于系统初始化+def_endzp=.ubsct#endofuninitializedzpage+def_memory=.bss#endofbsssegment+def_stack=0x17ff#不同的芯片_

12、stack内容不同,由系统自动生成如何实现位操作CosmicC编译器支持位变量的操作,可以将其定义成_Bool类型。_Bool类型的变量只包含两种值true(1)或者false(0)。若将一个表达式赋值给_Bool变量,则编译器会将表达式与0做比较,然后将布尔值赋给_Bool变量。因此,任何整型或者表达式的值都可以赋给_Bool变量。但是,布尔变量不能定义位数组,只能定义成结构体或者联合。而且,_Bool变量会被打包成字节的形式。编译器会将所有的全局_Bool变量打包成字节形式,存放在.bitsection中。局部_Bool变量也会被打包成字节形式。但是_Bool类型的参数会被扩展成一个单字节

13、。具体的关于位变量的定义和使用可参考如下例子:定义位变量:_Boolin_range;_Boolp_valid;char*ptr;使用位变量:in_range=(value=10)&(value=20);p_valid=ptr;/*p_validistrueifptrnot0*/if(p_valid&in_在使用位变量时,若程序编译时提示如下错误:#errorclnkDebugexample.lkf:1nodefaultplacementforsegment.bitThecommand:cInk-lC:ProgramFilesCOSMICCXSTM8_16K_-oDebugexample.sm8-mDebugexample.map-saDebugexample.lkfhasfailed,thereturnedvalueis:1exitcode=1.实际上是由于,在项目中没有定义.bitsection。可按照如下步骤,手工添加.bitsection:打开项目链接配置窗口:Project-Settings-Linker,选择Input目录项在Zeropage或者Ram里面定义一个.bitsection.然后重新编译一下就可以了。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!