STM32——我对输出重定向的理解

不勾选Microlib

//取消ARM的半主机工作模式
#pragma import(__use_no_semihosting)                             
struct __FILE { 
    int handle; 
}; 
 
FILE __stdout;          
_sys_exit(int x) 
{ 
    x = x; 
}
 
int fputc(int ch, FILE *f){      
    while((USART1->SR&0X40)==0);
    USART1->DR = (u8) ch;      
    return ch;
}

勾选Microlib

int fputc(int ch, FILE *f){      
    while((USART1->SR&0X40)==0);
    USART1->DR = (u8) ch;      
    return ch;
}

 

fputc就是一个标准IO的输出函数,标准IO可以参考我的另一篇博客

Linux学习——标准IO的读写_宇努力学习的博客-CSDN博客_linux 读写io 

百度中对fputc的描述

fputc_百度百科

其他人对串口的理解:

stm32串口 - 走看看

while((USART1->SR&0X40)==0);//等待发送结束

解析:

USART1->SR: 串口状态寄存器

USART1->SR&0X40即串口状态寄存器的TXE标志位,TXE标志位标识发送数据寄存器(TDR寄存器)是否为空。

while((USART1->SR&0X40)==0);即判断TXE标志位是否为0,

         若为0,则等待此标志位被置1.

         若为1(即发送数据寄存器中的数据全部被转移至移位寄存器,导致发送数据寄存器变成空,被硬件置为1),

         则标识发送数据寄存器(TDR寄存器)为空,可以发送下一个字节帧数据到发送数据寄存器(TDR寄存器)。

清除TXE位一般都是通过往数据寄存器中写入数据完成的。

 TXE是由硬件设置的,它表明:数据已经从TDR中转移到移位寄存器了,数据发送已经开始;TDR寄存器是空的;

下一个数据可以写入USART_DR寄存器,而不会覆盖前面的数据。

当发送在进行时,一个对USART_DR寄存器的写命令将数据保存到TDR寄存器中,并且当前传输完成之后,

TDR寄存器中的数据将被复制到移位寄存器中。

当没有进行发送时,往USART_DR寄存器中写入一个数据,数据将直接被放入移位寄存器,发送开始,TXE位将被立即置1

当一个帧发送完成时(结束位之后),TC位被置1

清除TC位是通过下面的软件操作完成的:(1)读一次USART_SR寄存器(2)写一次USART_DR寄存器(TC位也可以通过对它写0清除,

这个清除序列只建议在多缓存通信中使用)。

 USART1->CR1:串口控制寄存器1

其包含“TXEIE位”,即“发送数据寄存器(TDR寄存器)为空中断使能位”即“发送缓冲区空中断使能位”。

TXEIE发送缓冲区空中断使能(Transmit Interrupt Enable)位,设置该位为 1,当 USART_SR 中的 TXE 位为1 时,将产生串口中断。

如果TXEIE位被设置,则TEX被硬件置1时将产生一个串口中断。

如果此时USART正在发送数据,对USART_DR寄存器的写操作把数据存进TDR寄存器,并在当前传输结束时把该数据复制进移位寄存器。

如果此时USART没有在发送数据,处于空闲状态,对USART_DR寄存器的写操作直接把数据放进移位寄存器,数据传输开始,TXE位立即被置起。

当一帧发送完成时(停止位发送后)并且设置了TXE位,TC位被置起,如果USART_CR1寄存器中的TCIE位被置起时,则会产生中断。

总的来说就是他用while来判断了一下串口中是否有数据,如果有就等待直到他没有数据后将ch放到DR寄存器里等待发送,剩下的工作由配置好的硬件来完成。

你可能感兴趣的:(stm32,arm,嵌入式硬件)