打印
[STM8]

写书计划《无刷直流电机控制应用--基于STM8》现书 特惠见P12

[复制链接]
楼主: uet_cache
手机看帖
扫描二维码
随时随地手机跟帖
61
cjhk| | 2013-3-3 18:58 | 只看该作者 回帖奖励 |倒序浏览
支持楼主   期待你的作品出来   呵呵   **很重要的  呵呵   顶一个   呵呵

使用特权

评论回复
62
uet_cache|  楼主 | 2013-3-4 13:03 | 只看该作者
(再三斟酌,第三章附加一部分章节)
再改目录为:
1部分 STM8系列微处理器应用基础1 STM8微处理器概述1.1   STM8S系列   
1.1.1      STM8S主要特点
1.1.2      STM8S主要应用
1.2   STM8L系列
1.2.1      STM8L主要特点
1.2.2      STM8L主要应用
1.3   STM8A系列  
1.3.1      STM8A主要特点
1.3.2       STM8A主要应用
1.4   STM8芯片选型
1.4.1      芯片选型表
1.4.2     STM8微控制器网站     
2STM8微处理器开发环境2.1   STM8集成开发环境简介     
2.1.1       ST TOOLSET
2.1.2       COSMIC
2.1.3       IAR
2.2   STM8开发工具     
2.2.1      ST-LINK
2.2.2      STX-RLINK
2.3   STM8程序设计     
2.3.1      STVD汇编语言程序设计   
2.3.2      COSMIC C语言程序设计   
2.3.3       COSMIC C语言相关说明
2.3.4      IAR C语言程序设计           
2.4   STM8烧录
2.4.1       使用STVD烧录
2.4.2       使用STVP烧录   
2.5   STM8S 固件库
2.5.1      固件库简介
2.5.2      压缩包描述
2.5.3      文档和库规范
2.5.4      使用举例      
3 STM8S硬件基础及实验例程3.1   STM8S产品概述
3.1.1      模块框图
3.1.2       中央处理单元
3.1.3      单线调试模块
3.1.4      中断控制器
3.1.5      存储器
3.1.6     功能外设
3.1.7       选项字节
3.2   STM8S硬件基础
3.2.1      STM8S最小系统
3.2.2       电源稳压电路
3.2.3      GPIO接口电路
3.2.4      AD转换电路
3.2.5      串行接口电路
3.2.6     STM8 EMC设计注意事项
3.3   时钟配置
3.3.1      STM8S时钟树
3.3.2      时钟配置实现
3.4   GPIO应用实验
3.4.1     实验要求
3.4.2     GPIO内部结构
3.4.3     相关寄存器配置
3.4.4     参考程序
3.5   模数转换器应用实验
3.5.1      实验要求
3.5.2     ADC方块图
3.5.3      ADC功能描述
3.5.4      相关寄存器配置
3.5.5      参考程序
3.6   定时器应用实验
3.6.1     实验要求
3.6.2     定时器概述
3.6.2     TIM1时基单元
3.6.3      相关寄存器配置
3.6.4     参考程序
3.7   串行接口应用实验
3.7.1     实验要求
3.6.2     UART框图
3.7.3      相关寄存器配置
3.7.4     参考程序
3.8   数据EEPROM存储器应用实例
3.8.1     实验要求
3.8.2     存储器组织结构
3.8.3       EEPROM编程模式
3.8.4     参考程序
2部分 无刷直流电机理论基础4 无刷直流电机概述4.1   常用电机分类及结构特点
4.1.1       三相交流异步电机
4.1.2       直流电动机
4.1.3       步进电机
4.1.4       无刷直流电机
4.2   无刷直流电机的工作原理
4.2.1      三个基本定则
4.2.2      换相原理
4.2.3      工作原理
4.3 转子位置传感器
       4.3.1       霍尔传感器
       4.3.2       编码器
4.4无位置传感无刷直流电机转子位置检测技术
       4.4.1      反电动势法
4.4.2      电流法4.4.3       状态观测器法
4.4.4       人工智能方法
4.4.5      磁链法4.5   无刷直流电机的数学模型4.6   无刷直流电机的运行特性
       4.6.1       起动特性
       4.6.2       机械特性
       4.6.3       调速特性
。。。。。。。

使用特权

评论回复
63
kgsz| | 2013-3-4 13:52 | 只看该作者
:victory: 哈哈 老师好!

使用特权

评论回复
64
uet_cache|  楼主 | 2013-3-4 18:54 | 只看该作者
本帖最后由 uet_cache 于 2013-3-4 18:55 编辑

(论坛表格处理有问题,有需要请参考博客)
2.2  STM8开发工具
目前,有两款开发工具可以支持STM8的开发:STX-RLINK和ST-LINK。 其中ST-LINK是ST研发的开发工具,支持STM32和STM8 两个产品系列的仿真调试。
2.2.1  ST-LINK
ST-LINK 是在线调试器和编程器,可用于STM8系列和STM32系列的设计开发生产。
ST-LINK提供的接口如表2-1。ST-LINK 目前支持的开发环境如表2-2。ST-LINK与STM8系列对应的引脚连接如表2-3。
表2-1 ST-LINK提供的接口
接口方式

描述

SWIM
用于开发STM8系列产品
JTAG
用于开发STM32系列产品

表2-2 ST-LINK 目前支持的开发环境
开发环境

描述

ST Visual Develop (STVD)

用于开发STM8系列产品
IAR EWSTM8
用于开发STM8系列产品
COSMIC
用于开发STM8系列产品

表2-3 ST-LINK与STM8系列对应的引脚连接
ST-LINK引线

STM8的引脚

TVCC线
MCU VCC 电源引脚
SWIM线
MCU SWIM引脚
GND线
MCU的GND电源地
SWIM-RST
MCU 复位引脚

目前有两种不同版本的STLINK:STLINK III及STLINK V2。STLINKV2是STLINKIII的升级版本。低版本STVD 4.1.1开发环境不支持STLINKV2,而STVD 4.3.3版本支持两种STLINK。STLINKV2仿真STM32和STM8芯片时的速度比STLINKIII也有明显优势。STLINKV2支持SWD和JTAG模式仿真STM32。STLINKIII是U盘驱动,一般操作系统不需要单独安装驱动程序,直接连入电脑即可使用。而STLINK V2需要安装驱动程序才能仿真芯片。STLINKV2驱动完成后,可在安装目录下查看STLINKV2的用户手册。另外,本书附带光盘中,附有驱动文件和“STLINK V2安装使用详解.pdf”。购买本书的读者均可在光盘中直接按文档中的讲解安装驱动程序和仿真STM32和STM8芯片。
用户购买STLINKV2时,可以向卖家索要驱动程序,也可以从ST官网直接下载。
图2-7为一种常用的STLINK V2仿真器实物图。
图2-7  STLINK V2实物图
2.2.2 STX-RLINK
STX-RLINK 是Raisonance公司提供的第三方开发工具,如图2-8所示。STX-RLINK 是一个低成本的调试器和编程器,可以支持STM32, STR9,STR7,STM8,ST7和uPSD系列的设计开发生产。STM8 使用SWIM接口调试和编程。

图2-8 STX-RLINK实物图
STX-RLINK 连接如图2-9所示。



图2-9 STX-RLINK 连接图
注意:
1)如果在目标板上没有上拉电阻,SWIMDATA上需要增加一个2K2的上拉电阻。
2)需要在目标板上外加5V电源

使用特权

评论回复
65
uet_cache|  楼主 | 2013-3-5 11:00 | 只看该作者
(2.3.1节,加了图就超数限了。有需要请去博客查看。)2.3  STM8程序设计
STVD开发环境提供了一个免费的汇编编译器,用户可直接使用汇编语言在STVD中编写汇编程序。如果使用C语言编写程序,可将COSMIC C编译器外挂于ST TOOLSET中,使用STVD进行产品的开发。
2.3.1 STVD汇编语言程序设计   
程序设计主要包括包括工程的建立、工程的编译和调试几个阶段。
1.工程创建
从开始菜单启动ST Visual DevelopSTVD)。从菜单中选择“File->New Workspace…”,如图2-10所示。
2-10 STVD创建Workspace
在出现如图2-11所示的对话框中,选择“Create workspace and project”,点击“确定”。
2-11 选择Create workspace and project
在新出现的对话框中,“Workspace filename”编辑框中输入workspace名字,如:demo,选择“workspace”保存的路径,如c:\stm8asm,如图2-12所示。点击“OK”。
2-12 输入Workspace名称
在新出现的对话框中,“project filename”中输入project名字,如:demo。在“Project location”中选择project保存的路径,一般与“workspace”保存在同一个目录下。选择工具链“Toolchain”,如: ST Assembler LinkerST AssemblerST提供的免费的汇编编译器。“Toolchain Root”一般是默认安装的。如果在ST TOOLSET安装过程中改变了安装目录,需要确认安装路径。相关设置如图2-13所示:
2-13 设置编译器安装路径
点击“OK”,在新出现的“MCU Selection”对话框中,选择MCU型号。可以在空白框中输入型号中的部分字符可快速筛选目标型号。点击“Select”按钮,再点击“OK”,即设置完成。如图2-14所示。
2-14 选择芯片型号
至此,workspaceproject 创建完成。
用户需要修改并添加自己的汇编代码。完成后界面如图2-15所示。
2-15 STVD创建工程界面图
STVD在项目中自动添加了main.asm, mapping.asmmapping.inc 文件。其说明如表2-4
2-4 main.asm, mapping.asm和mapping.inc 文件说明
文件
说明
main.asm
-          基本的程序架构
-          文件中包含了中断向量和中断函数(NonHandledInterrupt),用户可根据此进行参考修改
-          清RAM0,RAM1和清堆栈程序。用户可删除此部分程序,自己进行变量的初始化。建议在程序开始时对自己定义的变量初始化。
mapping.asm
定义了段的名字和地址(ram0, ram1, stack, eeprom, rom, vectit)
mapping.inc
定义了段(ram0,ram1,stack)的起始和结束地址
从安装目录下,如默认安装目录“C:\Program Files\STMicroelectronics\st_toolset\asm\include 找到相关MCU型号的寄存器定义文件拷贝到当前工程目录下(本例中用到STM8S207C_S.ASM STM8S207C_S.INC),并添加到工程项目中。添加后的workspace如图2-16所示:
2-16 Workspace 信息
用户可以根据自己的要求,修改main.asm
在修改中断时,先在中断向量表中找到对应的中断地址,把NonHandledInterrupt中断名字修改成自定义的中断名字,其他部分不需要修改。然后定义一个中断函数。如表2-5所示和表2-6所示。
2-5 中断定义说明
;自定义中断函数
interrupt My_Interrupt_Name
My_Interrupt_Name.l
;
;…中断处理代码
;
Iret
;中断向量表
segment 'vectit'
    dc.l {$82000000+main}               ; reset
    dc.l {$82000000+ My_Interrupt_Name}    ; trap
    ;…
    ;其他中断
    ;…
end
说明:
dc.l {$82000000+main},复位向量在复位后直接跳转到main处执行。
表2-6 源文件main.asm
stm8/   ; 第一行必须保留而且要顶格写.指定目标单片机的指令集
;* 包含文件
#include "mapping.inc"
#include "stm8s207c_s.inc"
Include
;* 常量定义
     #define MYDF1  3
MYCNT1  EQU 2
常量区
;/* ram0区变量定义
segment 'ram0'   ;从此行以后是 ram0变量区
MY_RAM0_VAR1         DS.B 1   ;保留1个字节的变量空间
RAM0变量区
;/* ram1区变量定义
segment 'ram1'   ;从此行以后是 ram1变量区
MY_RAM1_VAR1       DS.B 128  ;定义128个字节的一组变量空间
RAM1 变量区
;* 主程序(ROM)
segment 'rom'  ;从此行以后是 rom代码区
main.l         
; 初始化
main_loop.l
     ;……
JRA main_loop
主程序区
Subroutine.l
     Ret
子程序区
;* 中断程序
interrupt NonHandledInterrupt
NonHandledInterrupt.l
Iret
中断程序区
;*中断向量映射
segment 'vectit'
dc.l {$82000000+main}              ; reset
dc.l {$82000000+NonHandledInterrupt}   ; trap
dc.l {$82000000+NonHandledInterrupt}   ; irq0
;……
dc.l {$82000000+NonHandledInterrupt}   ; irq28
dc.l {$82000000+NonHandledInterrupt}   ; irq29
end
中断向量映射
2.工程编译
源程序编辑完成后,可选择菜单栏“Build->Rebuild All”,编译工程。如图2-17所示。
2-17 工程编译选择
若源程序正确无误,会显示如图2-18所示内容:
2-18 工程编译结果
若要查看编译后的程序代码的大小,可找到工程目录下的Debug文件夹,在Debug目录下有个.map文件。本例是stm8asm.map,如图2-19和图2-10所示。
2-19 stm8asm.map文件路径
2-20 stm8asm.map文件信息
stm8asm.map文件里,记录了ram0ram1romstackeepromrom等的使用情况。本例的代码地址范围是:rom'   byte from     8080 to     81F5。程序代码大小是:81F5 – 8080 = 175(HEX) = 373个字节
3.工程调试
首先,选择调试与仿真的工具。可通过菜单栏“Debug instrument->Target Settings”来设置,如图2-21所示。
2-21调试工具菜单选择
在弹出的对话框中,列表中列出了此开发环境支持的所有工具。常用的在线调试工具是Swim RlinkSwim ST-LINK。其中Simulator是软件仿真。如图2-22所示,选择需要的仿真工具,并确定。
2-22调试工具配置
可从菜单栏选择”Debug-> Start Debugging”,进入调试状态,如图2-23所示。
2-23  调试菜单选择
可通过View下拉菜单的菜单项进行不同的参数观测,如图2-24所示。
2-24 观察参数选择
进入调试状态后,界面如图2-25所示。之后,就可以单步仿真调试了
2-25 单步调试界面图

使用特权

评论回复
66
uet_cache|  楼主 | 2013-3-7 10:11 | 只看该作者
2.3.2 COSMIC C语言程序设计  
COSMIC提供了一个的IDE环境,用户可使用COSMIC IDE进行软件的开发。
目前,建议在STVD中外挂COSMIC C编译器,进行软件开发。STVD提供了比较友好的开发调试界面。本书中所讲解的例程均为STVD+COSMIC环境下编写和调试的。
1)要在STVD环境中用COSMIC C语言编写程序,首先要在STVD中对COSMIC C编译器进行设置。运行STVD集成开发环境,选择菜单”Tools -> Options” 。在出现的对话框中选择”Toolset” 选项卡,在选择下拉菜单,选中”STM8S Cosmic”。设置编译器的安装路径。然后选择确定。如图2-26所示。
2-26设置编译器安装路径
本例中选择的”Root path” 是:C:\Program Files\COSMIC\CXSTM8_16K。至此,就完成了COSMIC C编译器的设置完成。
2)在STVD开发环境下的菜单栏中,选择”File > New Workspace…”,如图2-27所示。
2-27 STVD创建Workspace
3)在New Workspace窗口中,点击Create workspace and project 图标,然后点击“确定”。如图2-28所示。
2-28 选择Create workspace and project

使用特权

评论回复
67
uet_cache|  楼主 | 2013-3-7 10:12 | 只看该作者
4)在新出现的对话框中,在“Workspace filename”字段中,输入一个workspace名字,并选择“workspace”的项目保存路径,如图2-29所示。
2-29输入Workspace名称
在点击“OK”后,STVDWorkspace窗口会包含一个workspace图标,在工作目录中会包含文件: <workspace name>.stw, <workspace name>.wsp <workspace name>.wed
5)在新出现的对话框中,如图2-30所示,在Project filename字段中输入一个项目名字,在Project Location字段中选择一个工程保存的路径。默认使用workspace使用的路径,在Toolchain列表框中,选择STM8 Cosmic,在Toolchain Root字段中,输入路径。然后点击OK
2-30设置编译器安装路径
6)在新出现的对话框中,如图2-31所示,在MCU Selection窗口中,选择需要的MCU。也可以通过Project Setting 窗口来选择MCU。点击OK
2-31选择芯片型号
7)保存workspace projectmain.c stm8_interrupt_vector.c自动添加到工程中。如图2-32所示。用户只需要根据不同的MCU的中断向量填写其相应的中断处理函数即可。
2-32 Workspace 信息
8)打开 菜单栏“Project->Settings... ”,根据需要,设置当前的project的配置。如图2-33所示。
2-33 Project->Settings对话框
编译调试如2.3.1节中汇编语言程序中讲到的的编译和调试。

使用特权

评论回复
68
tianli1980| | 2013-3-7 15:16 | 只看该作者
doudoubaba 发表于 2013-2-27 12:03
加油,其实书就应该工程师来写, 而不是泛泛而谈的所谓的教授来写

强烈同意楼上的说法!!!!

使用特权

评论回复
69
hawksabre| | 2013-3-7 17:35 | 只看该作者
楼主  继续**哦  一定要把这本书写出来哦   呵呵  到时记得送我一本  谢谢了  呵呵

使用特权

评论回复
70
电子好学者| | 2013-3-8 15:13 | 只看该作者
大力支持啊

使用特权

评论回复
71
电子好学者| | 2013-3-8 15:15 | 只看该作者
楼主啊  小弟我现在是用定时器4 通道1和通道2 产生两路pwm波  但是我想在 pwm波 有效电平一半时 实现对ad的采集 能不能指点下怎么做呢?谢谢啦!

使用特权

评论回复
72
uet_cache|  楼主 | 2013-3-8 15:47 | 只看该作者
楼上说的是32芯片?
在是用定时器4

使用特权

评论回复
73
uet_cache|  楼主 | 2013-3-8 16:05 | 只看该作者
嗯,工作量很大。所以需要很久。现在,一天十个小时都在搜集资料,整理资料。从发帖之日起,到现在,基本上都是这工作。而且这工作至少还得持续一两个月。  
月底准备联系出版社。
写完可能会有四百多页。到时太厚的话,可能会出上下部。具体要等写完应用再定。

使用特权

评论回复
74
yocheng| | 2013-3-8 23:41 | 只看该作者
加油,等你的大作

使用特权

评论回复
75
uet_cache|  楼主 | 2013-3-9 15:17 | 只看该作者
谢谢支持。
继续上传吧。。

使用特权

评论回复
76
uet_cache|  楼主 | 2013-3-9 15:17 | 只看该作者
2.3.3 COSMIC C语言相关说明
更多更详细COSMIC C语言相关说明请参考光盘中“第二章”中“COSMIC C Cross Compiler User’s Guide for Stm8.pdf”文件。
1COSMIC段的定义(Section
编译器使用默认预定义的段输出不同部分的机器码。默认段如表2-7所示。
2-7 COSMIC默认段
描述
.text
可执行代码
.const
文本字符和常数
.fconst
大常量(@far)
.data
初始化变量(@near)
.bss
未初始化变量(@near)
.bsct
零页内的初始化变量(@tiny, 默认)
.ubsct
零页内的未初始化变量(@tiny,默认)
.fdata
大变量(@far)
.eeprom
EEPROM内任何变量(@eeprom
.bit
位变量
通过pragma定义用户自己的段,格式如下:
#pragma section <attribute> <qualified_name>
<attribute> 可以是空白,或者使用下面语句:
const
_Bool
@tiny
@near
@far
@eeprom
<qualified_name> 是一个段的名字:
(name) - 圆括号表示代码段
[name] – 方括号表示未初始化的数据
{name} – 大括号表示初始化的数据
段的名字开头不能用点开始。段的名字不能超过13个字符。使用<qualified_name>可以切回到默认段。
2COSMIC C语言中嵌入汇编指令
COSMIC C编译器提供两种方法嵌入汇编指令。第一种方法是#asm#endasm嵌入汇编指令块。第二种方法是嵌入行汇编。单独一行汇编指令。
第一种方法语法:
#asm     //开始汇编指令块
#endasm  //结束汇编指令块
第二种方法语法:
_asm(“嵌入的汇编代码”, 符合C语言规则的参数...);
例如,执行单条指令   
_asm("ld _mya,a");
若在一行内执行多条指令,可如:
_asm("push a\n ld a,88\n ld _mya,a\n inc a\n pop a\n call _subroutine\n");
2-8是一个嵌入汇编的例子。
表2-8 COSMIC C语言嵌入汇编的例子
#include "stm8s207c_s.h"
unsigned char i,mya;
void subroutine(void){}
main()
{
mya=0x22;
#asm    //#asm 要顶格书写
    push a   
    ld a,_mya
    inc a
    ld _mya,a
    call _subroutine
    pop a   
#endasm
_asm("push a\n ld a,88\n ld _mya,a\n pop a\n call _subroutine\n");
    while (1)   {i = mya;}
3COSMIC C编译器的启动程序
COSMIC 有一个启动程序,就是在单片机复位之后,在程序跳转至main函数之前,插入一段汇编代码做一些初始化的动作。其包括:
段的初始化(如bss)、拷贝ROMRAM(如果程序中需要的话)和堆栈指针初始化。
2-9crtsi0.sm8反汇编之后的代码。
表2-9 crtsi0.sm8反汇编代码
0x8084 <__stext+1>          0x0FFF          CLR   (0xff,SP)           CLR   (0xff,SP)
0x8086 <__stext+3>          0x94            LDW   SP,X                  LDW   SP,X
0x8087 <__stext+4>          0x90CE8080      LDW   Y,0x8080            LDW   Y,__idesc__
0x808b <__stext+8>          0xAE8082        LDW   X,#0x8082           LDW   X,#0x8082
0x808e <__stext+11>         0xF6            LD    A,(X)               LD    A,(X)
0x808f <__stext+12>         0x2720          JREQ  0x80b1              JREQ  0x80b1
0x8091 <__stext+14>         0xA560          BCP   A,#0x60             BCP   A,#0x60
0x8093 <__stext+16>         0x2717          JREQ  0x80ac              JREQ  0x80ac
0x8095 <__stext+18>         0xBF03          LDW   0x03,X              LDW   c_x,X
0x8097 <__stext+20>         0xEE03          LDW   X,(0x03,X)          LDW   X,(0x03,X)
0x8099 <__stext+22>         0xBF06          LDW   0x06,X              LDW   c_y,X
0x809b <__stext+24>         0xBE03          LDW   X,0x03              LDW   X,c_x
0x809d <__stext+26>         0xEE01          LDW   X,(0x01,X)          LDW   X,(0x01,X)
0x809f <__stext+28>         0x90F6          LD    A,(Y)               LD    A,(Y)
0x80a1 <__stext+30>         0xF7            LD    (X),A               LD    (X),A
0x80a2 <__stext+31>         0x5C            INCW  X                   INCW  X
0x80a3 <__stext+32>         0x905C          INCW  Y                   INCW  Y
0x80a5 <__stext+34>         0x90B306        CPW   Y,0x06              CPW   Y,c_y
0x80a8 <__stext+37>         0x26F5          JRNE  0x809f              JRNE  0x809f
0x80aa <__stext+39>         0xBE03          LDW   X,0x03              LDW   X,c_x
0x80ac <__stext+41>         0x1C0005        ADDW  X,#0x0005           ADDW  X,#0x0005
0x80af <__stext+44>         0x20DD          JRT   0x808e              JRT   0x808e
0x80b1 <__stext+46>         0xAE0000        LDW   X,#0x0000           LDW   X,#0x0000
0x80b4 <__stext+49>         0x2002          JRT   0x80b8              JRT   0x80b8
0x80b6 <__stext+51>         0xF7            LD    (X),A               LD    (X),A
0x80b7 <__stext+52>         0x5C            INCW  X                   INCW  X
0x80b8 <__stext+53>         0xA30009        CPW   X,#0x0009           CPW   X,#0x0009
0x80bb <__stext+56>         0x26F9          JRNE  0x80b6              JRNE  0x80b6
0x80bd <__stext+58>         0xAE0100        LDW   X,#0x0100           LDW   X,#0x0100
0x80c0 <__stext+61>         0x2002          JRT   0x80c4              JRT   0x80c4
0x80c2 <__stext+63>         0xF7            LD    (X),A               LD    (X),A
0x80c3 <__stext+64>         0x5C            INCW  X                   INCW  X
0x80c4 <__stext+65>         0xA30100        CPW   X,#0x0100           CPW   X,#0x0100
0x80c7 <__stext+68>         0x26F9          JRNE  0x80c2              JRNE  0x80c2
0x80c9 <__stext+70>         0xCD80CF        CALL  0x80cf              CALL  main
0x80cc <_exit>               0x20FE          JRT   0x80cc              JRT   _exit
  
STVD开发环境中,选择“project->Setttings...”,可对启动文件进行设置,如图2-34所示。

使用特权

评论回复
77
uet_cache|  楼主 | 2013-3-9 15:19 | 只看该作者
2-34 STVD启动设置
建议:
在软件设计时,建议用户不使用C编译器的启动文件。也就是说,在单片机复位后,直接跳转至main处执行。在main开始处,按照自己的设计,做一些变量和外设等的初始化动作。
跳转至main需要做如下修改
将图2-34Start-up 修改为None
修改复位函数:
{0x82, (interrupt_handler_t)_stext}, /* reset */  
修改为:
{0x82, (interrupt_handler_t)main}, /* reset */
并修改外部函数声明:
extern void _stext(); /* startup routine */  
修改为:
extern void main();  /* startup routine */
4COSMIC的存储器模式
STM8 编译器支持两种存储器模式。
代码小于64K:函数指针和数据指针默认是@near指针(2个字节)
stack short (mods0) 全局变量默认short range类型。任何在long range范围的全局变量必须明确地用@near来访问,除非通过指针访问。
stack Long (modsl0) 全局变量默认为long range类型。任何在short range类型中的变量必须明确地用@tiny 来访问。
代码大于64K:函数指针默认是@far指针(3个字节),数据指针默认为@near类型(2个字节),除非用@far明确地声明。
stack Short (mods)全局变量默认short range类型。 任何在long range范围的全局变量必须明确地用@near 来访问,除非通过指针来访问。
stack Long (modsl0) 全局变量默认为long range类型。任何在short range类型中的变量必须明确地用@tiny 来访问。
其中:short int int 默认为2个字节。long int 默认为4个字节。@tiny 指针(short range)默认为1个字节。@near 指针(long range)默认为2个字节。@far 指针默认为3个字节。
5COSMIC的位变量设置
STM8 C编译器位变量在STVD中的设置,如图2-35所示:
2-35 STVD位变量设置
C编译器使用_Bool类型定义位变量(新的ANSI/ISO标准C99)。布尔变量可用做结构或联合类型,连续的布尔变量放在一个字节中。
布尔变量定义,例子如图2-36
2-36 布尔变量定义
6)常量定义
常量定义例子如图2-37

2-37 常量定义
定义一个常量表如下:
const unsigned char constring[]
={0x2C,0x27,0x23,0x1F,0x1D,0x1A,0x17,0x16,0x13,0x11,0x0F,0x0E,0x00, 0x0D, 0x09, 0x15 };
unsigned char i;
i = constring[3];  // i = 0x 1F

使用特权

评论回复
78
uet_cache|  楼主 | 2013-3-9 15:21 | 只看该作者
7)在RAM中运行程序
可使用COSMIC中的函数_fctcpyFLASH中的代码代码拷贝RAM中,并运行。_fctcpyFALSH中拷贝一段可移动代码段到RAM中。_fctcpy寻找linker定义的描述符(此描述符是在RAM中定义段的第一个字符)。本例子在RAM 中定义了一个段.CODE_IN_RAM。所以地一个字符是’C’
需要在程序中应用int _fctcpychar name;
Ram 中创建一个’.CODE_IN_RAM’ 段,并在Option 中输入’-ic’
’.CODE_IN_RAM’ 表示在RAM中定义一个CODE_IN_RAM的段。程序可从此起始地址运行。_fctcpy函数使用此段的名字的第一个描述符’C’
’-ic’ 表示标记这个段为可移动的段。可将FLASH中的代码移动到此。
在程序代码中完成函数:
#pragma section (CODE_IN_RAM)
functions()
{
       var1 = 0x99;
       var2 = 0x88;
       var3 = 0x77;
}
routine()
{
       var1++;
       var2++;
       var3++;
}
#pragma section ()
打开“project->settings…->Linker”,如图2-38所示配置。
2-38 程序RAM运行配置
例子如下:
unsigned char var1,var2,var3;
int _fctcpy(char name);
#pragma section (CODE_IN_RAM)
functions()
{
       var1 = 0x99;
       var2 = 0x88;
       var3 = 0x77;
}
routine()
{
       var1++;
       var2++;
       var3++;
}
#pragma section ()
main()
{
_fctcpy('C');   //拷贝pragma section(CODE_IN_RAM)中的函数到RAM
       functions();       // 调用RAM中的functions 函数
       routine();         // 调用RAM 中的 routine 函数
      
while (1)
       {
              _asm("nop");
              _asm("nop");
              _asm("nop");
              _asm("nop");
       }
}
8)如何生成HEX文件
设置“Project-> Settings…->Post-Build”,如图2-39所示。
2-39 HEX文件生成设置
原来设置:
chex -o  $(OutputPath)$(TargetSName).s19  $(OutputPath)$(TargetSName).sm8
设置为:
chex –fi –o  $(OutputPath)$(TargetSName).hex  $(OutputPath)$(TargetSName).sm8
       如图2-40为编译连接生成结果。
2-40编译连接生成结果

使用特权

评论回复
79
拿起书本| | 2013-3-9 16:08 | 只看该作者
世界上许多美好的事物都是时间和耐性的结果,而**不懈是其精髓。顶楼主

使用特权

评论回复
80
dong_abc| | 2013-3-9 21:17 | 只看该作者
电机应用方面的书很少,这书应该会火。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则