串口向PC发送数据的过程以及Printf函数的作用
串口发送数据的过程:
  函数printf作用在程序中,先给USARTGPIO的初始化结构体赋值,并通过初始化函数将相关寄存器进行初始化,,当然还有时钟的设置,复用引脚需要的相关设置等。  当这些设置好以后说明USART模块已经做好了发送或接收数据的准备,具体的发送或接收还没有开始。
  我们把写好的程序通过预处理、编译、链接、汇编,生成机器码,被烧录进入程序存储区,然后处理器开始取指令并一条一条执行下去。也就是说,单片机会按照我们程序预定的设置设置好寄存器,当我们需要收发数据时,其实就是单片机把内存(变量)中的数据写入USART收发数据相关的数据寄存器中,然后收发寄存器会把寄存器中的数据一位一位的向pc机发送(或者是把PC串口中传入的数据一位一位的接受并存入相关变量中,(或直接通过DMA方式))。
Printf函数的作用以及实现:
  数据的发送依靠的是向数据寄存器中写入数据,这个过程在库函数编程中是通过相关函数,
比如USART_SendData来实现的。下面附上该函数的定
void USART_SendData(USART_TypeDef* USARTx,
uint16_t Data)
{
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  assert_param(IS_USART_DATA(Data));
   
  /* Transmit Data */
  USARTx->DR = (Data & (uint16_t)0x01FF);
}
从该函数的定义中就可以看出,该函数的功能就是写数据寄存器(DR)。
Printf 是一个c语言标准库函数,或者更严谨一些,Printf是一个宏,在这个宏中调用了一个数据发送函数fputc。我们重写fputc这个函数,这样当我们调用Printf这个宏时,这个宏就会优先调用用户的函数,从而就实现了Printf的重映射。而Printf实现的作用就是“格式的”输出。其实发送数据依靠的最终仍然是fputc,或者说最终的USART_SendData。我们也可以自己编写一个Printf函数,来实现格式控制。