原创 STM8与汇编语言(9)--UART应用之一

2010-6-3 14:55 4372 8 8 分类: MCU/ 嵌入式

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


 


STM8单片机的UART功能很强,即可以作为普通的UART来使用,也支持LIN(局部互连网)。这里给出的例子是作为普通的UART来使用的。


在使用UART时,主要面向的寄存器有:控制寄存器CR1CR2CR3,数据寄存器DR,状态寄存器SR,还有波特率寄存器BRR1BRR2


这里特别要指出的是波特率寄存器是一个比较怪的设计,也说不清为啥这么设计,反正用起来相当别扭。例如,当主时钟为2MHZ时,如果要求波特率为9600,则分频系数DIV=2000000/9600=208,变成16进制数就是00D0。按照常规理解,那就是00送波特率分频寄存器的高8位,D0送波特率分频寄存器的低8位。但在STM8单片机中却不是这样,BRR1保存的是分频系数的第11位到第4位,BRR2保存的是分频系数的第15位到第12位,和第3位到第0位。那么对于这个例子来说,BRR1=0D,BRR2=00


另外一点要注意,必须先写BRR2,然后再写BRR1


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


编译通过后,下载到开发板,运行程序。在PC机上用串口调试工具软件,将波特率设置在9600,可以看到接收的字符为ABABAB…


另外做实验时,如果将ST的三合一板与PC机相连时要注意,DB923引脚要交换,即三合一板子的DB9的第3脚要连到PC机的DB9的第2脚,而三合一板子的DB9的第2脚则要连到PC机的DB9的第3脚,当然第5脚(GND)就直连了。


 


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


              LD      A,#$41                 


              CALL    UART3_SendChar


              LD      A,#$42


              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


 


  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


 


 


                   2010-6-3

文章评论0条评论)

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