官方的每个串口例子都有用到串口重定向到串口1,
#ifdef USE_IAR
PUTCHAR_PROTOTYPE
{
while((UART1->CSR&UART_IT_TXIEN)==0);//循环发送,直到发送完毕
UART1->TDR = (ch & (uint16_t)0x00FF);
return ch;
}
#else
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
int handle;
};
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
_sys_exit(int x)
{
x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{
while((UART1->CSR&UART_IT_TXIEN)==0);//循环发送,直到发送完毕
UART1->TDR = (ch & (uint16_t)0x00FF);
return ch;
}
#endif
while((UART1->CSR&UART_IT_TXIEN)==0);//循环发送,直到发送完毕
这句话,没搞明白,啥意思?
这是要判断发送缓冲器是否为空吗?
我觉得应该是这个意思,但是寄存器CSR对应的位里面没有UART_IT_TXIEN,这不是一个寄存器的内容,,,搞混了
CSR的寄存器内容应该是
#define UART_FLAG_TXEMPTY ((uint16_t)0x0008)
#define UART_FLAG_TXFULL ((uint16_t)0x0004)
#define UART_FLAG_RXAVL ((uint16_t)0x0002)
#define UART_FLAG_TXEPT ((uint16_t)0x0001)
手册中写的明白,如上图所示
那么UART_IT_TXIEN是什么鬼?
另外跟头文件也对的上
/** @defgroup UART_Interrupt_definition
* @{
*/
#define UART_IT_ERR ((uint16_t)0x0020)
#define UART_IT_PE ((uint16_t)0x0010)
#define UART_OVER_ERR ((uint16_t)0x0008)
#define UART_TIMEOUT_ERR ((uint16_t)0x0004)
#define UART_IT_RXIEN ((uint16_t)0x0002)
#define UART_IT_TXIEN ((uint16_t)0x0001)
所以我觉得这就是错了,一个对应的宏是0x01,一个是0x08,如果按照例子中的,那就是0x01,实际对应的是UART_FLAG_TXEPT ((uint16_t)0x0001)
而这个叫 发送结束标识位(Transmit complete flag bit)虽然可以实现大概差不多功能,但是细微上有区别的。很容易让接收方认为收完了一组数据。。。
|