首先我在数据手册中查看有关USART的状态寄存器,其中最直接的提到了产生中断的直接原因:控制寄存器USART_CR中的TXEIE和TCIE位置为一就分别触发两种中断。
相应的去看CR寄存器中
在USART发送端有两个寄存器发送数据寄存器(USART_DR)和我们程序看不到的发送移位寄存器.
USART_DR寄存器对应的中断标志是USART_IT_TXE,中断标志为1时,就可以往DR寄存器中传数据,TDR寄存器中的全部数据传送到移位寄存器之后,TDR寄存器为空,TXE标志位会被设置为1,此时可以将下一个要发送的数据送到DR寄存器中。
由于发送完一个字符之后TDR寄存器一定为空,所以每发送完一个字符都需要关闭该中断,在下一次发送之前再打开,否则的话会导致重复进入中断!因此中断是在发送函数中打开,而不是一开始串口初始化的时候打开。
移位寄存器对应的中断标志是USART_IT_TC,中断标志为1时,就可以往TDR寄存器中传数据,当移位寄存器为空时,TC标志位被置为1,此时可以将下一个要发送的数据送到TDR寄存器中。由于TC没有TXE的烦恼,所以串口再初始化的时候打开就可以。