打印
[MM32软件]

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

[复制链接]
698|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
官方的每个串口例子都有用到串口重定向到串口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
这个软件不是写给这个片子的,官方提供的软件例程是临时拼凑的

哈哈,难怪,我发现好几处张冠李戴的地方。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

1971

主题

15987

帖子

210

粉丝