新手上路
- 积分
- 21
- 金钱
- 21
- 注册时间
- 2016-7-2
- 在线时间
- 8 小时
|
10金钱
我是用的stm32f103c8t6, 没用官方的标准库。在用串口发送数据的时候,电脑端接受的数据总是不正确(只能接受到最后一个字符),
我查了下是往USART_DR寄存器写入数据后,等待 USART_SR的TC位变为发送完成的时候出的问题。
[mw_shl_code=c,true]
#define RCC_APB2ENR (*((volatile unsigned long *)(0x40021000 + 0x18)))
#define GPIOA_CRH (*((volatile unsigned long *)(0x40010800 + 0x04)))
#define GPIOA_BSRR (*((volatile unsigned long *)(0x40010800 + 0x10)))
#define USART1_SR (*((volatile unsigned long *)(0x40013800)))
#define USART1_DR (*((volatile unsigned long *)(0x40013800 + 0x04)))
#define USART1_BRR (*((volatile unsigned long *)(0x40013800 + 0x08)))
#define USART1_CR1 (*((volatile unsigned long *)(0x40013800 + 0x0c)))
#define USART1_CR2 (*((volatile unsigned long *)(0x40013800 + 0x10)))
int main(void)
{
char *body = "hello, world!";
RCC_APB2ENR |= 0x4004; //usart1 & GPIOA RCC enable
GPIOA_CRH |= 0x4B0;
USART1_CR1 |= 0x2000; //enable USART & set word length
USART1_CR2 |= 0x0; //default stop bits eq 8
USART1_BRR |= 0x341; //baud rate eq 9600
USART1_CR1 |= 0x8; //te
while(1)
{
for(;*body;body++)
{
USART1_DR = *body;
while(USART1_SR & 0x40 == 0);
}
}
}
[/mw_shl_code]
USART_SR寄存器的第6(0100 0000)位为TC位, 那while(USART1_SR & 0x40 == 0);这个空循环语句看着也没错(发送未完成执行空循环)。
如果我在while(USART1_SR & 0x40 == 0);循环后加个延迟函数,就正常了。
这个判断哪有错呢? 请指教!
|
最佳答案
查看完整内容[请看2#楼]
还没解决啊?你检测状态位的时候用TXE,还有初始化的时候AFIO的时钟也开启,好像串口发送用了引脚的复用功能,这样测试一次试试
|