原创 STM8与汇编语言(3)

2010-5-18 15:25 6252 12 12 分类: MCU/ 嵌入式

                     


                   STM8与汇编语言(3<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


 


STM8的开发环境用起来还是不错的,可以到ST的网站上下载安装程序ST_Toolset.exe。利用该环境可以开发用汇编语言写的程序,而且与ST的三合一开发板配合起来,确实非常方便。


不过如果要想用C语言来开发,稍微有点麻烦,得去别的公司下载C的编译器(CXSTM8_16K.exe),而且下载完以后,还得去注册,等待许可文件。实际上,我也按照ST介绍的方法做了,但始终都没有收到许可文件,也许本人实在愚笨。但不管怎么说,我觉得ST这一点做得相当不好,实在有点抠门。既然是免费的,为什么不一起打包提供给客户,这么麻烦,多耽误客户使用,得少卖多少STM8的芯片。


言归正传,还回到正题。用汇编语言开发程序,最简单的就是利用ST开发环境中提供的汇编程序框架自动生成功能。打开开发环境后,在File菜单中选择New Workspace,点击Create workspace and project图标,然后就可以建立项目,在工具链中选ST Assembler Linker,最后选择MCU的型号,点击OK,就完成了一个项目的建立。这个环境与微软的VC6开发环境很象,点开项目文件中的Source Files,能看到系统自动生成好了一个汇编语言的框架,我们编写程序只要在这框架基础上就可以了。其实不用编写任何一条指令,这个框架程序是能够编译通过,并下载运行的。


自动生成的项目中包含3个重要的文件:mapping.inc,mapping.asmmain.asm


mapping.inc文件中定义的是一些常量,mapping.asm文件中定义的是一些内存的分配,主要的汇编代码都在main.asm


下面是main.asm中的汇编代码及注释。


 


stm8/


 


      #include "mapping.inc"


 


      segment 'rom'


; 下面是定义一个标号,ST汇编的写法,有点不习惯


; 这里的main标号是复位后的第一条指令,与后面的中断向量表中


; 的名字是对应的


main.l   


      ; initialize SP


      ldw X,#stack_end


      ldw SP,X                              ; 设置堆栈指针


 


      #ifdef RAM0      


; 如果定义了RAM0,则要汇编以下代码 


      ; clear RAM0


ram0_start.b EQU $ram0_segment_start


ram0_end.b EQU $ram0_segment_end


      ldw X,#ram0_start    ;寄存器X指向要清除的内存起始地址   


clear_ram0.l            ;这是一个标号定义,用于后面的跳转指令


      clr (X)              ;对应的内存单元清0 


      incw X              ;寄存器X+1,指向下一个单元  


      cpw X,#ram0_end        ;比较寄存器X是否等于内存的最后一个地址 


      jrule clear_ram0       ;若不等于,则循环


      #endif


 


      #ifdef RAM1


; 如果定义了RAM1,则要汇编以下代码,代码含义与上面完全一样 


      ; clear RAM1


ram1_start.w EQU $ram1_segment_start


ram1_end.w EQU $ram1_segment_end


      ldw X,#ram1_start


clear_ram1.l


      clr (X)


      incw X


      cpw X,#ram1_end     


      jrule clear_ram1


      #endif


 


      ; clear stack


; 将堆栈区的内存单元清0,代码含义与上面完全一样 


stack_start.w EQU $stack_segment_start


stack_end.w EQU $stack_segment_end


      ldw X,#stack_start


clear_stack.l


      clr (X)


      incw X


      cpw X,#stack_end     


      jrule clear_stack


 


infinite_loop.l                         ; 定义一个标号


;由于是一个框架,初始化内存后,进入一个死循环


      jra infinite_loop                    


 


;下面代码写的是一段中断服务程序,不过也是空的


      interrupt NonHandledInterrupt


NonHandledInterrupt.l


; 当进入中断服务程序后,无其它动作,直接返回


  iret                                 


 


; 下面这张表很重要,定义了STM8所有的硬件中断对应的中断


; 服务程序的入口地址


  segment 'vectit'


      dc.l {$82000000+main}                               ; reset


      dc.l {$82000000+NonHandledInterrupt}     ; trap


      dc.l {$82000000+NonHandledInterrupt}     ; irq0


      dc.l {$82000000+NonHandledInterrupt}     ; irq1


      dc.l {$82000000+NonHandledInterrupt}     ; irq2


      dc.l {$82000000+NonHandledInterrupt}     ; irq3


      dc.l {$82000000+NonHandledInterrupt}     ; irq4


      dc.l {$82000000+NonHandledInterrupt}     ; irq5


      dc.l {$82000000+NonHandledInterrupt}     ; irq6


      dc.l {$82000000+NonHandledInterrupt}     ; irq7


      dc.l {$82000000+NonHandledInterrupt}     ; irq8


      dc.l {$82000000+NonHandledInterrupt}     ; irq9


      dc.l {$82000000+NonHandledInterrupt}     ; irq10


      dc.l {$82000000+NonHandledInterrupt}     ; irq11


      dc.l {$82000000+NonHandledInterrupt}     ; irq12


      dc.l {$82000000+NonHandledInterrupt}     ; irq13


      dc.l {$82000000+NonHandledInterrupt}     ; irq14


      dc.l {$82000000+NonHandledInterrupt}     ; irq15


      dc.l {$82000000+NonHandledInterrupt}     ; irq16


      dc.l {$82000000+NonHandledInterrupt}     ; irq17


      dc.l {$82000000+NonHandledInterrupt}     ; irq18


      dc.l {$82000000+NonHandledInterrupt}     ; irq19


      dc.l {$82000000+NonHandledInterrupt}     ; irq20


      dc.l {$82000000+NonHandledInterrupt}     ; irq21


      dc.l {$82000000+NonHandledInterrupt}     ; irq22


      dc.l {$82000000+NonHandledInterrupt}     ; irq23


      dc.l {$82000000+NonHandledInterrupt}     ; irq24


      dc.l {$82000000+NonHandledInterrupt}     ; irq25


      dc.l {$82000000+NonHandledInterrupt}     ; irq26


      dc.l {$82000000+NonHandledInterrupt}     ; irq27


      dc.l {$82000000+NonHandledInterrupt}     ; irq28


      dc.l {$82000000+NonHandledInterrupt}     ; irq29


 


      end


 


   把这个项目Build后,点击Debug中的Start Debugging就可以将程序下载到ST的三合一板上了,然后点击Run,程序就运行起来了,不过由于框架程序是一个空程序,初始化内存后就进入死循环了,因此什么效果也看不见。因此我们必须在框架程序的基础上,编写自己的程序。后面的程序例子都是在这个框架程序的基础上编写的。


                                      2010331


 

文章评论0条评论)

登录后参与讨论
我要评论
0
12
关闭 站长推荐上一条 /2 下一条