原创 STM8与汇编语言(4)

2010-5-18 15:24 4627 1 6 分类: MCU/ 嵌入式

 


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


 


今天要做的实验是在ST的三合一开发板上,用汇编语言写一个程序,驱动板上的LED指示灯闪烁。


开发板上的LED1接在STM8PD3上,因此要将PD3设置成输出模式,为了提高高电平时的输出电流,要将其设置成推挽输出方式。这主要通过设置对应的DDR/CR1/CR2寄存器实现。


还是利用ST的开发工具,先生成一个汇编程序的框架,然后修改其中的main.asm,修改后的代码如下。


编译通过后,下载到开发板,运行程序,可以看到LED1在闪烁,且闪烁的频率为5HZ


 


stm8/


 


       #include "mapping.inc"


 


; 下面定义端口D的寄存器地址


PD_ODR   EQU    $<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />500f                  


PD_IDR   EQU    $5010


PD_DDR   EQU    $5011


PD_CR1   EQU    $5012


PD_CR2   EQU    $5013


 


; 定义堆栈空间的起始位置和结束位置


stack_start.w  EQU    $stack_segment_start


stack_end.w    EQU    $stack_segment_end


 


; 下面开始定义一个段,该段位于ROM


               segment 'rom'                


; 定义复位后的第一条指令的标号(即入口地址)


main.l                                 


;


; 首先要初始化堆栈指针


               LDW     X,#stack_end         


               LDW     SP,X


 


          LD      A,#08


          LD      PD_DDR,A              ; PD3设置成输出


          LD      A,#08


          LD      PD_CR1,A              ; PD3设置成推挽输出


          LD      A,#00


          LD      PD_CR2,A              ;


MAIN_LOOP.L


          LD      A,#08                 ;


          LD      PD_ODR,A              ; PD3的输出设置成1


          LD      A,#100


          CALL    DELAY_MS              ; 延时100MS


                                  


          LD      A,#00                 ; 


          LD      PD_ODR,A              ; PD3的输出设置成1


          LD      A,#100


          CALL    DELAY_MS              ; 延时100MS


                                  


          JRA     MAIN_LOOP             ;


 


; 函数功能:延时


; 输入参数:寄存器A -- 要延时的毫秒数,这里假设CPU的主频为2MHZ


; 输出参数:无


; 值:无


;     注:无


DELAY_MS.L


          PUSH    A                     ; 将入口参数保存到堆栈中


          LD      A,#250                ; 寄存器A<-250,作为下面的循环数 


DELAY_MS_1.L


          NOP                           ; 用空操作指令进行延时4T


          NOP


          NOP


          NOP


          NOP


          DEC     A                     ; 寄存器A<-A-1,本条指令执行之间为1T


          JRNE    DELAY_MS_1            ; 若不等于0,则循环,


                                                                 ; 本条指令执行时间为2T(跳时)或1T(不跳时)


          POP     A                     ; 从堆栈中恢复入口参数


          DEC     A                     ; 将要延时的MS数-1 


          JRNE    DELAY_MS              ; 若不等于0,则循环


          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}    ; 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


 


 


                             201048


文章评论5条评论)

登录后参与讨论

billzhu_345737527 2013-4-16 22:10

$是16进制 #是 立即数 是十进制 往寄存器写入十六进制要写成 ldw X, #$07ff

zzytyy_948289124 2013-3-6 21:42

这样不对,$是地址,#才是数字,搞不定。。。。

zzytyy_948289124 2013-3-6 21:22

解决了:ldw X, $7ff

zzytyy_948289124 2013-3-6 21:15

在调试的时候不明白的地方: ldw X,#stack_end -- 在main.asm里面有: #stack_end EQU $stack_segment_end --在mapping.inc里面有: #define stack_segment_end 7FF 但是直接写:ldw X, #0x7ff 编译器提示FF未定义;但是写:ldw X, #2047 编译器就通过编译了。请问这是为什么呢?谢谢!

billzhu_345737527 2013-3-6 21:13

在调试的时候不明白的地方: ldw X,#stack_end -- 在main.asm里面有: #stack_end EQU $stack_segment_end --在mapping.inc里面有: #define stack_segment_end 7FF 但是直接写:ldw X, #0x7ff 编译器提示FF未定义;但是写:ldw X, #2047就能通过编译。请问这是为什么呢?
相关推荐阅读
top6288_343454825 2012-04-24 12:00
STM32L开发经验之一
STM32L开发经验之一   这2天在调试单位的一个电路板,电路板的核心芯片是ST公司的STM32L152,在进行系统时钟源切换时发现一个问题:当选择系统时钟源为外接振荡器HSE时,有时对...
top6288_343454825 2011-09-01 22:32
液晶显示器FP71G+不亮的维修
液晶显示器FP71不亮的维修 有一台液晶显示器,型号是FP71G+,开机后不亮。上网查找了一些信息,据说此款显示器出现这种现象多半都是高压有问题,而且还指出了大部分问题都出现那对三极管上(型号为570...
top6288_343454825 2010-09-19 16:06
算法优化的重要性
                    算法优化的重要性 前些日子,在开发一个单片机的产品时,遇到这么一个问题,就是要将一个无符号的16位数,乘以1.2288后,再赋给另一个无符号的16位数。用C语言...
top6288_343454825 2010-08-19 16:56
STM8的C语言编程(14)-- PWM
                STM8的C语言编程(14)-- PWM 在单片机应用系统中,也常常会用到PWM信号输出,例如电机转速的控制。现在很多高档的单片机也都集成了PWM功能模块,方便用户的应...
top6288_343454825 2010-08-16 10:02
STM8的C语言编程(13)-- 蜂鸣器
                 STM8的C语言编程(13)-- 蜂鸣器 蜂鸣器是现在单片机应用系统中很常见的,常用于实现报警功能。为此STM8特别集成了蜂鸣器模块,应用起来非常方便。在应用蜂鸣器模...
top6288_343454825 2010-08-13 09:10
STM8的C语言编程(12)-- AD转换
                                       STM8的C语言编程(12)-- AD转换 在许多的单片机应用系统中,都需要A/D转换器,将模拟量转换成数字量。在STM8...
广告
我要评论
5
1
广告
关闭 热点推荐上一条 /3 下一条