原创 STM8与汇编语言(10)--UART应用之二

2010-6-4 13:39 3252 8 8 分类: MCU/ 嵌入式

                 STM8与汇编语言(10)--UART应用之二<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


 


下面这个实验程序比较简单,它是在上篇基础上,增加了查询方式从UART接收一个字符的子程序。主循环中,等待接收一个字符,然后将接收到的字符再发送出去。如果与WINDOWS的超级终端相连,则键盘上按什么按键,则显示对应的字符。


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


编译通过后,下载到开发板,运行程序。在PC机上运行超级终端,波特率为9600,然后从键盘上输入按键,屏幕上就显示对应的字符。


 


stm8/


 


       #include "mapping.inc"


      


       #include "STM8S<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />207C_S.INC"


 


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


stack_start.w  EQU    $stack_segment_start


stack_end.w    EQU    $stack_segment_end


 


 


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


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


;


; 首先要初始化堆栈指针


        LDW     X,#stack_end         


                LDW     SP,X


 


               CALL    UART3_Init          ; 初始化串口3


MAIN_LOOP.L


              CALL    UART3_RecvChar


              CALL    UART3_SendChar


              JRA     MAIN_LOOP             ; 进入无限循环


 


UART3_Init.l                        ; 串口初始化子程序


              LD      A,#0                ; 禁止UART发送和接收


              LD      LINUART_CR2,A    


       


              LD      A,#0


              LD      LINUART_CR1,A       ; b5 = 0,允许UART


                                       ; b2 = 0,禁止校验


                                   


             LD      A,#0                ; b5,b4 = 00,1个停止位


            LD      LINUART_CR3,A


                           


; 设置波特率,必须注意以下几点:


;    (1) 必须先写BRR2


;    (2) BRR1存放的是分频系数的第11位到第4位,


;    (3) BRR2存放的是分频系数的第15位到第12位,和第3位到第0


; 例如对于波特率位9600时,分频系数=2000000/9600=208


; 对应的十六进制数为00D0BBR1=0D,BBR2=00


              LD      A,#$00


              LD      LINUART_BRR2,A


              LD      A,#$0D


              LD      LINUART_BRR1,A      ; 实际的波特率分频系数为00D0(208)


                                                                  ; 对应的波特率为2000000/208=9600


              LD      A,#$0C              ; b3 = 1,允许发送


                                    ; b2 = 1,允许接收


              LD      LINUART_CR2,A   


              RET


;


UART3_SendChar.l                    ; 发送字符的子程序


              PUSH    A                   ; 将要发送的字符保存到堆栈中


SENDCHAR_1.L                      


              LD      A,LINUART_SR        ; 读取当前状态寄存器的值


              AND     A,#$80              ; 若发送寄存器不空,则等待


              JREQ    SENDCHAR_1


              POP     A                   ; 从堆栈中恢复要发送的字符


              LD      LINUART_DR,A        ; 将要发送的字符送到数据寄存器


              RET


                                  


; 函数功能:从UART3接收一个字符


; 输入参数:无


; 输出参数:无


; 值:寄存器A -- 从串口读回的字符


;     注:无


UART3_RecvChar.l


RECVCHAR_1.L                      


              LD      A,LINUART_SR


              AND     A,#$20


              JREQ    RECVCHAR_1


              LD      A,LINUART_DR


              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


 


               201064


 

文章评论0条评论)

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