2017-06-21 24 views
2

这是我用stm8l使用usart的代码。我面临的主要问题是,无论我分配给USART_DR寄存器的值如何,它总是取值0xff,甚至不会因为我增加char变量而改变。只有USART_SR寄存器在我认为正确的值0xc0和0xf0之间切换。USART与stm8l

clockinit(void) //16MHz internal clock enable 
{ 
    CLK_SWR = 0x01; 
    CLK_ICKR = 0x01; 
    CLK_ECKR = 0x00; 
    CLK_DIVR = 0x00; 
    CLK_PCKENR1 = 0xFF; 
    CLK_PCKENR2 = 0xFF; 
} 
usartinit(void) //usart initialisation 
{ 
char X; 
PC_DDR = 0x10; 
PC_CR1 = 0x10; 
X = USART1_SR; 
X = USART1_DR; 
USART1_CR1 = 0x00; 
USART1_CR2 = 0x0C; 
USART1_CR3 = 0x0f; 
USART1_CR4 = 0x03; 
USART1_CR5 = 0x00; 
USART1_GTR = 0x00; 
USART1_PSCR = 0x00; 
USART1_BRR2 = 0x0A; 
USART1_BRR1 = 0x08; 
} 
void main() 
{ 
char *z = "HELLO"; 
clockinit(); 
usartinit(); 
val = strlen(z); 
while (*z) 
{ 
    USART1_DR = (unsigned char) *z; 
    while (USART1_SR_TXE == 0); 
    z++;        
} 
} 
+0

那么,是寄存器做a)读和b)写?你在哪里读过它?你用你的调试器阅读它?当您在范围内时,是否有任何数据在输出引脚上传输?请注意,我们无法有效地涉及涉及硬件的问题。 – ThingyWotsit

+0

是的,我用我的调试器阅读它。我应该在哪里检查输出? – ABHI

+0

请编辑您的问题并修复缩进。 – Lundin

回答

2

你观察的行为是按预期:

USART_DR寄存器的确寄存器。当您将写入到内存位置并使用下一个字符进行传输时使用一个。另一个用于从内存位置读取并包含收到的最后一个字符。

Architecture of USART_DR register

这种架构被选为允许同时发送和从USART接收,这就是原因,你为什么不读从那个位置你写给回来。

+0

对不起,我不明白你的意思是“你为什么不从那个位置读取你写给它的内容“。 – ABHI

+0

@ABHI这个答案描述了你观察到的行为的原因:如果向地址USART_DR写入一个值,那么你真的写入了与从地址USART_DR读取值不同的硬件寄存器。最后一句话只是一个总结。 – Ctx

+0

我该如何纠正问题,或者更好地如何分别访问TDR和RDR? – ABHI