碰到一个题目,其中有一条要求写一个函数如下:
a) bool serial_out(uint8_t chByte);
非阻塞的串口单字符发送函数。所谓非阻塞是指,当因为任何原因发送失败时(比如上一个字符还没有发送完毕)直接返回false;发送字符时不允许在该函数内等待发送成功(即不允许等待寄存器发送完成标志位举起或busy标志位清除),只要成功的将chByte中所保存的数据送到数据寄存器中即可立即返回true。
如果要用STM32实现,我想法如下,
bool serial_out(uint8_t chByte)
{
USART1->DR = (uint16_t) chByte&0x01ff;
if( (USART1->DR & 0x01FF) == (uint16_t) chByte ){
return true;
}
else{
return false;
}
}
很不幸,事与愿违, (USART1->DR & 0x01FF) == (uint16_t) chByte )这个等式永远不成立,仿真得出USART1->DR值始终为0.
通过查询参考手册得知,STM32串口的的Data register实际是是分TDR和RDR的,结构图如下:
也就是说串口的 data register读和写其实是分开的,你要读USART1->DR的值,实际读的是RDR的值,如果没有外部数据输入,始终是0.
所以以上函数功能实现失败。
头疼,在不通过查询标志位的前提下,大家有什么好思路来实现这个函数。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
还有就是,写的也是DR,不是应该写TDR的么
一周热门 更多>