gaoyang9992006 发表于 2020-4-26 11:51

官方例程的串口重定向是否有错?

官方的每个串口例子都有用到串口重定向到串口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)虽然可以实现大概差不多功能,但是细微上有区别的。很容易让接收方认为收完了一组数据。。。

gaoyang9992006 发表于 2020-4-26 11:51

不知各位大佬为何没看出来这个问题。。。太明显了。

wziyi 发表于 2020-4-27 18:38

这个软件不是写给这个片子的,官方提供的软件例程是临时拼凑的

gaoyang9992006 发表于 2020-4-27 18:57

wziyi 发表于 2020-4-27 18:38
这个软件不是写给这个片子的,官方提供的软件例程是临时拼凑的

哈哈,难怪,我发现好几处张冠李戴的地方。。。
页: [1]
查看完整版本: 官方例程的串口重定向是否有错?