关于stm32 串口全双工的问题

2019-08-08 13:06发布

最近要做的一个东西要大量的用到串**互,一方面要接受大量地数据,一方面要及时发送数据。
我发现一个问题:(以串口2为例 Usart2;)
在stm32说 串口是全双工的,但是数据的发送和接收寄存器却都是 USART2->DR;
这让我百思不得其解,这样如果我在用中断接收数据的时候 ,正好要发送,这是不是会发生问题!(我接受数据的时间是不可预知的)
我听说51 虽然串口的发送和接收的寄存器都叫SBUF,但是实际上是两个东东(我也不知道叫啥),这个stm32会不会也是这种情况(两个数据寄存器只是名字一样?)
如果只是名字一样,实际寄存器一样(全双工没问题),但是这个不是违反了高级语言(如c语言)的规则吗(一个变量一个名字)? 这种机制有啥好处?(本着凡存在皆合理精神思考)
求大神讲解一番;

另一个问题:
我看到 USART2->DR这个(我在中断函数里读数据)(u8 temp= USART2->DR)
我就想这个 USART2应该是一个结构体变量吧,DR应该是他的一个成员变量吧;
但是按F12一查,发现这个:
#define USART2              ((USART_TypeDef *) USART2_BASE)
#define USART2_BASE           (APB1PERIPH_BASE + 0x4400)
这只是个地址,我彻底迷茫了,这个咋理解呢//这个库这么博大精深啊

求大神讲解,再次,谢谢
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
Pony279
1楼-- · 2019-08-08 14:54
前面的问题自己读手册.

"但是这个不是违反了高级语言(如c语言)的规则吗(一个变量一个名字)?"
硬件完全遵循高级程序语言了, 还叫硬件吗?

" 这种机制有啥好处?"
一个寄存器只能读, 另一个只能写, 给它们各自分配不同的地址编号岂不是浪费?

后面的问题, 自己理清楚结构体的内存布局, C语言的指针以及指针强制转换的问题.
humanking7
2楼-- · 2019-08-08 17:44
回复【楼主位】humanking7:
---------------------------------
我已经理解了能全双工的原因了,原来就是数据手册上有个图(P474),但是为啥这样做了,(另外问题2是如何解答呢)
humanking7
3楼-- · 2019-08-08 21:07
回复【2楼】Pony279:
---------------------------------
真是厉害啊,谢谢您
可是USART2->DR中没有 没有查到关于DR的东西,这个DR是在那定义的?
正点原子
4楼-- · 2019-08-08 23:35
 精彩回答 2  元偷偷看……
humanking7
5楼-- · 2019-08-09 05:23
回复【2楼】Pony279:
---------------------------------
原来是USART_TypeDef 这个结构体的变量,原来不知道有这个,现在了解了,谢谢了
humanking7
6楼-- · 2019-08-09 10:15
回复【5楼】正点原子:
---------------------------------
ok

一周热门 更多>