1、 就目前初学阶段,串口最主要的作用就是帮助我们调试程序
2、 实现串口通讯,需配置下列参数:字长(一次传送数据的长度)、波特率(每秒传送字节的位数)、奇偶校验位,还有停止位。波特率大小与通信距离成反比
3、 串口线尽量采用与PC相同的标准串口接法。PC和单机,单机和单机均为交叉线
4、 要实现基本的的全双工异步通信,只需三根线,TX、RX and GND
5、 至上而下,串口外设主要有三部分组成,分别是波特率的控制部分、收发控制部分以及数据存储转移部分。
A、 波特率(b/s,bps)的控制部分:在配置波特率时,我们向波特比率寄存器USART_BRR写入参数,修改了串口时钟的分频值USARTDIV。USART_BRR寄存器包括两部分,分别是DIV_Mantissa(USARTDIV的整数部分)和DIVFraction(USARTDIV的小数)部分,最终,计算公式为USARTDIV=DIV_Mantissa+(DIVFraction/16)
a、 USARTDIV是对外设进行分配,USART1是挂载到APB2总线上,所以它的时钟源为fPCLK1.而USART2、3是挂载在APB1上,时钟源为fPLCK1。
b、 串口的时钟源经分频后作为发送器时钟和接收器时钟
B、 收发控制部分:围绕该部分,有USART1的三个控制寄存器(CR1\CR2\CR3),1个状态寄存器(SR),向控制器写控制参数,控制发送和接收、如奇偶校验位、停止位
C、 数据存储转移部分:内核或DMA把数据写到发送数据寄存器TDR,发送控制器适时地把数据从TDR加载到发送移位寄存器,然后通过串口线TX,把数据一位位地发出去
6、 函数USART1_Config( ),主要的工作:使能串口1的时钟,配置好了usart1的I/O,配置好了usart1的工作模式,具体为波特率为115200,8个数据位,一个停止位,无硬件流控制(PS:硬件流控制硬件流,当外设硬件处于准备好的状态时,硬件启动自动控制,而不需要软件再进行干预)
7、 重定向printf( )到串口。重定向,即用户可以自己重写C的库函数。为了实现重定向printf( ),我们需要重写fputc( )这个C标准库函数。重定向时,我们把fputc()的形参ch,作为串口将要发送的数据,也就是说,当使用printf(),它调用这个fputc()函数时,然后使用ST库的串口发送函数USART_SendData(),把数据转移到发送数据寄存器TDR,触发我们的串口向PC发送一个相应的数据。调用完USART_SendData()后,要使用while( USART_GetFlagStatus(USART1,USART_FLAG_TC)!= SET) 语句不停地检查串口发送是否完成的标志位TC,一直检测到标志为完成,才进入一下步的操作,避免出错。(PS:在重定向是,要勾选微库,即为嵌入式应用制作的C库)
8、 当然,不重定向,可以自己编写输出函数USART1_printf( ). printf() 函数会受缓冲区大小的影响,有时候在用它打印的时候程序会发生莫名奇妙的错误,而实际上就是由于使用printf() 这个函数引起的,其优点就是这种情况很少见且支持的格式较多。而USART1_printf()则不会受缓冲区的影响产生莫名的错误,但其支持的格式较少。推荐使用用USART1_printf()。
用户1700638 2013-3-24 18:34
飞言走笔 2013-3-18 21:12