STM8单片机C语言编程技巧[整理]

上传人:x****育 文档编号:143417393 上传时间:2020-08-29 格式:PDF 页数:10 大小:911.38KB
返回 下载 相关 举报
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、1 如何分配变量到指定的地址 举例: unsigned char temp_A0 x00; ame section中 Unsigned char data1; Unsigned int data2; ( 任何需要定义在.name section中的变量 ) #pragma section 注意: pragma 伪指令可以用来定位函数,初始化变量或者未初始 化变量。这三者用不同的括号区分。 (name):代码 name :未初始化变量 name:初始化变量 如何在 COSMIC C 文件中使用汇编语言 在 COSMIC C 文件中使用汇编语言常见的方法有如下两种:使用#asm #endasm组合

2、格 式 或_asm(); 单行格式。 举例 1: unsigned char temp_A; Void func1(void) . #asm PUSH A LD A,(X) LD _temp_A,A 2 POP A #endasm . 注:在 C嵌汇编环境下使用全局变量,要在该全局变量名称前加下划线_ 。 举例 2: Void func1(void) . _asm(rim); _asm(nop); . 如何观察 RAM/FLASH/EEPROM的最终分配情况 在 Project-settings-linker选项页中, 将 Category 选为 Output ,再勾选 Generate Ma

3、p File 。 3 点击 OK按键后,再次编译链接该项目,如果成功则会在项目输出目录中( 本例是在 C:STM8_NewProject1debug 目录下 )生成 .map 文件。该文件详细地列出 RAM/FLASH/EEPROM的分配使用情况。 如何生成 hex 格式的输出文件 在 Project-settings-PostBuild选项页中,在commands栏内加入下行命令: chex fi -o $(OutputPath)$(TargetSName).hex $(OutputPath)$(TargetSName).sm8 再次编译链接该项目,如果成功则会在项目输出目录中( 本例是在

4、C:STM8_NewProject1debug 目录下 )生成 .hex 文件。 什么是 MEMORY MODEL STM8 的 C编译器支持多种存储器模式。用户可以根据应用的需要选择最适合的配置。 可以根据需要选择采用2 个字节的寻址方式(仅适用于64k 以内的程序) 或者 3 字节的寻址 方式。 也可以规定将变量默认为定义在存储器的哪一区域:zero page 内, 还是 zero page 外。 下面对几种供选择的MEMORY MODEL做简单说明。 在 Project-settings-C Complier选项页中,将Category 选为 General ,里面有一 个 Memory

5、 Models 选项栏如下: 4 在下拉菜单中共有4 种 MEMORY MODEL可供选择: 程序地址空间在64K以内 ( 即程序容量小于32K) mods0, modsl0 程序地址哦那个键在64K 以上(即程序容量大于32K) mods modsl MODS0MODSL0MODSMODSL 名称 Stack Short 短堆栈模式 Stack Long 长堆栈模式 Stack Short 短堆栈模式 Stack Long 长堆栈模式 程序地址 空间 程序所用到的地址空间在64K 范围内程序所用到的地址空间超出64K 范围 指针默认 类型 函数指针和数据指针默认为near (2 bytes)

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

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

8、FF) ,为该段起名(n) 为.const(和常量段的保留字同名) ,需要初始化的变量的 初始值存 # 放于此段 (-it) +seg .const -b 0 x8080 -m 0 x1ff80 -n .const -it # 定义 (+seg) 一个程序段 (.text),紧跟 (-a) 在.const段后面 ( 和.const 共同位于 0 x8080 6 # 0 x27FFF) ,为该段起名(n) 为. text (和程序段的保留字同名) 。 +seg .text -a .const -n .text # 定义 (+seg) 一个 EEPROM 段(.eeprom) ,开始 (b) 于

9、0 x4000,最大分配 (m)0 x800 个字节 ( 即不超 #过 0 x47FF) ,为该段起名(n) 为. eeprom (和 EEPROM 段的保留字同名) 。 +seg .eeprom -b 0 x4000 -m 0 x800 -n .eeprom # .bsct段服务于定义在0 页( 地址小于0 x100) 以内需要初始化的全局变量( 如tiny char a = 9;) +seg .bsct -b 0 x0 -m 0 x100 -n .bsct # .ubsct段服务于定义在0 页( 地址小于0 x100) 以内不需要初始化的全局变量( 如tiny char b;) +seg

10、.ubsct -a .bsct -n .ubsct # .bit表示位域段,定义后即可在程序中使用_Bool 变量 ( 如_Bool c = 1;),-id表示 该段需要初始化。 +seg .bit -a .ubsct -n .bit -id # 这是 ST7时代 (STM8是基于 ST7发展而来的 ) 由于物理堆栈小,速度慢,使用内存来 模拟堆栈的变通手段。 +seg .share -a .bit -n .share -is # .data 段服务于定义在0页( 地址大于 0 xFF)以外需要初始化的全局变量( 如near char d = 8;) +seg .data -b 0 x100

11、-m 0 x1300 -n .data # .bss段服务于定义在0 页 ( 地址大于 0 xFF) 以内不需要初始化的全局变量(如 near char e;) +seg .bss -a .data -n .bss # 段定义结束,下面放置的库及Obj 文件中的变量、常量、程序就按照上面的规定进行 分配。 #初始化程序 7 #用户程序 Debug # 一些必要的cosmic 库 # 重定义常量段,开始于0 x8000,用于放置中断向量表(STM8硬件决定此位置) # k 用于程序冗余代码优化,详情可参考cosmic 用户手册。 +seg .const -b 0 x8000 k # 中断向量 D

12、ebug #定义了三个变量,用于系统初始化 +def _endzp=.ubsct # end of uninitialized zpage +def _memory=.bss # end of bss segment +def _stack=0 x17ff # 不同的芯片 _stack 内容不同,由系统自动生成 如何实现位操作 Cosmic C 编译器支持位变量的操作,可以将其定义成 _Bool类型。 _Bool 类型的变量 只包含两种值true (1)或者 false (0)。若将一个表达式赋值给_Bool 变量,则编译器会 将表达式与0 做比较,然后将布尔值赋给_Bool 变量。因此,任何

13、整型或者表达式的值都可 以赋给 _Bool 变量。但是,布尔变量不能定义位数组,只能定义成结构体或者联合。而且, _Bool 变量会被打包成字节的形式。 编译器会将所有的全局_Bool 变量打包成字节形式,存放在 .bit section中。局部 _Bool 变量也会被打包成字节形式。但是_Bool 类型的参数会被扩展成一个单字节。 具体的关于位变量的定义和使用可参考如下例子: 定义位变量: 8 _Bool in_range; _Bool p_valid; char *ptr; 使用位变量: in_range = (value = 10) p_valid = ptr; /* p_valid i

14、s true if ptr not 0 */ if (p_valid & in_ 在使用位变量时,若程序编译时提示如下错误: #error clnk Debug:1 no default placement for segment .bit The command: clnk -lC:Program FilesCOSMICCXSTM8_16K_4.2.10Lib -o Debug -mDebug -sa Debug has failed, the returned value is: 1 exit code=1. 实际上是由于,在项目中没有定义.bit section。可按照如下步骤,手工添加.bit section: 打开项目链接配置窗口:Project - Settings - Linker,选择 Input 目录项 9 在 Zero page 或者 Ram 里面定义一个.bit section. 然后重新编译一下就可以了。 10

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 习题/试题

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