OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8185|回复: 8

大家看看,一个题目,求思路

[复制链接]

7

主题

37

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
397
金钱
397
注册时间
2013-1-14
在线时间
75 小时
发表于 2014-12-11 14:47:46 | 显示全部楼层 |阅读模式
5金钱
碰到一个题目,其中有一条要求写一个函数如下:
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.
所以以上函数功能实现失败。
头疼,在不通过查询标志位的前提下,大家有什么好思路来实现这个函数。




最佳答案

查看完整内容[请看2#楼]

你老师有病。 这题目完全不可能实现,有本事让他自己写个试试。 判断发送完成 的唯一方式,就是等待标志位,既然不等待标志位,那就没法确认发送是否完成,既然没法确认,就是伪命题。 综上,不可能实现。 别浪费时间了。
天道酬勤
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-12-11 14:47:47 | 显示全部楼层
你老师有病。
这题目完全不可能实现,有本事让他自己写个试试。
判断发送完成 的唯一方式,就是等待标志位,既然不等待标志位,那就没法确认发送是否完成,既然没法确认,就是伪命题。
综上,不可能实现。
别浪费时间了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

80

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2014-11-26
在线时间
0 小时
发表于 2014-12-11 16:32:19 | 显示全部楼层
为什么不去检查USART1_SR的TXE呢?
回复

使用道具 举报

28

主题

1489

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1656
金钱
1656
注册时间
2013-7-24
在线时间
1 小时
发表于 2014-12-11 17:48:26 | 显示全部楼层
很有创意,我从未想到过这样实现。
于20150522停用该账号:http://www.microstar.club
回复

使用道具 举报

7

主题

37

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
397
金钱
397
注册时间
2013-1-14
在线时间
75 小时
 楼主| 发表于 2014-12-11 18:41:59 | 显示全部楼层
回复【2楼】好人:
---------------------------------
题目就是这样,不能通过查询寄存器的方法来实现
天道酬勤
回复

使用道具 举报

1

主题

80

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2014-11-26
在线时间
0 小时
发表于 2014-12-11 20:04:01 | 显示全部楼层
照你的描述,也并不是不能查询寄存器。题只是要求不能等待。如果是老师出的题,那他也应该是考这个标志位的用法。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-12-11 22:49:53 | 显示全部楼层
所以说,不了解底层的人出题目真可怕。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2014-12-10
在线时间
11 小时
发表于 2014-12-15 09:29:57 | 显示全部楼层
很奇怪,你为什么是读的DR,不是读TDR的么?
还有就是,写的也是DR,不是应该写TDR的么
回复

使用道具 举报

7

主题

85

帖子

0

精华

初级会员

Rank: 2

积分
163
金钱
163
注册时间
2011-3-3
在线时间
12 小时
发表于 2014-12-21 16:00:25 | 显示全部楼层
个人感觉,非阻塞传输就是不要去等待确认标志位,提升CPU效率,其实就用中断实现就OK了啊,建立一个队列,中断搞定,我弄过,比较高效
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 10:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表