STM8与汇编语言(9)--UART应用之一<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
STM8单片机的UART功能很强,即可以作为普通的UART来使用,也支持LIN(局部互连网)。这里给出的例子是作为普通的UART来使用的。
在使用UART时,主要面向的寄存器有:控制寄存器CR1、CR2和CR3,数据寄存器DR,状态寄存器SR,还有波特率寄存器BRR1和BRR2。
这里特别要指出的是波特率寄存器是一个比较怪的设计,也说不清为啥这么设计,反正用起来相当别扭。例如,当主时钟为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机相连时要注意,DB9的2和3引脚要交换,即三合一板子的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
; 对应的十六进制数为00D0,BBR1=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条评论)
登录后参与讨论