OpenEdv-开源电子网

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

STM32的IO口复用为串口之后的IO设置问题

[复制链接]

3

主题

8

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2018-8-14
在线时间
5 小时
发表于 2018-8-14 11:08:05 | 显示全部楼层 |阅读模式
1金钱
//USART1_TX PA.9 PA.10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9 与 GPIOA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度 50MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化 PA9, PA10  


我看官方大大写的程序里(usart.c) 关于IO复用为串口1之后,IO口设置如上。
这里有个重要的疑问,PA9是TX做输出设置为推挽复用输出没错,但是PA10是RX,为什么也设置成推完复用输出????
RX设置成输出还能做接收数据的IO口用吗??
我自己在网上查了下,都说PA9设置成推挽输出,PA10设置成浮空输入,如下
    //USART1 Tx(PA.09)     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;     GPIO_Init(GPIOA, &GPIO_InitStructure);    //USART1 Rx(PA.10)     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;     GPIO_Init(GPIOA, &GPIO_InitStructure);
是不是官方大大写的程序有误呢??本人刚开始学,没去试验程序,请大佬们看看,感谢

最佳答案

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

举个例子:我们写软件的最底层的操作就是到"寄存器层面",至于寄存器与物理电压之间是如何关联的,那是“芯片级”的工程师做的事。 所以不必纠结,我们做的就是在成品的基础上就行上层应用开发。 感觉知其然挺好的,但是库函数会用就可以,想要深究,寄存器好好研究一下。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2018-6-6
在线时间
28 小时
发表于 2018-8-14 11:08:06 | 显示全部楼层
举个例子:我们写软件的最底层的操作就是到"寄存器层面",至于寄存器与物理电压之间是如何关联的,那是“芯片级”的工程师做的事。  所以不必纠结,我们做的就是在成品的基础上就行上层应用开发。
感觉知其然挺好的,但是库函数会用就可以,想要深究,寄存器好好研究一下。
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10567
金钱
10567
注册时间
2017-2-18
在线时间
1913 小时
发表于 2018-8-14 11:17:24 | 显示全部楼层
我这边的代码跟你不一样。战舰V3板子(103ZET6芯片)。看的是哪个板子的代码?
2.png
回复

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2018-8-14
在线时间
5 小时
 楼主| 发表于 2018-8-14 11:41:50 | 显示全部楼层
peng1554 发表于 2018-8-14 11:17
我这边的代码跟你不一样。战舰V3板子(103ZET6芯片)。看的是哪个板子的代码?

stm32f407ZGT6  探索者的,我看里面给的程序例码 都是写成了推挽输出
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10567
金钱
10567
注册时间
2017-2-18
在线时间
1913 小时
发表于 2018-8-14 12:10:08 | 显示全部楼层
wxz1029wxz 发表于 2018-8-14 11:41
stm32f407ZGT6  探索者的,我看里面给的程序例码 都是写成了推挽输出

这是我在F4中文参考手册“IO引脚复用和映射”章节看到的
3.png
回复

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2018-8-14
在线时间
5 小时
 楼主| 发表于 2018-8-14 17:04:59 | 显示全部楼层
peng1554 发表于 2018-8-14 12:10
这是我在F4中文参考手册“IO引脚复用和映射”章节看到的

您的回答不太明确啊。
是不是官方给的固件库写的有问题?PA10用作RX的时候应该设置成浮空输入,而官方给的是推挽输出。

另外,如果按官方写的USART.C来用,PA10的IO设置成推挽输出的话,对串口RX功能有影响吗?
回复

使用道具 举报

13

主题

186

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
441
金钱
441
注册时间
2016-6-30
在线时间
97 小时
发表于 2018-8-14 17:08:54 | 显示全部楼层
注释的锅 GPIO_Mode_AF_PP 是复用功能 并不是推挽输出
回复

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2018-8-14
在线时间
5 小时
 楼主| 发表于 2018-8-14 17:37:22 | 显示全部楼层
我现在更蒙了,刚查了手册,IO口复用为串口的时候,GPIOx_MODER不应该都配置成GPIO_Mode_AF;//复用功能吗?
官方给的是多加了一个GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出,已经是复用功能了,为什么还设置推挽输出。
网上给的GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  //是把PA10设置成了浮空输入 ,不应该设置成AF复用吗。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2018-8-15 01:27:19 | 显示全部楼层
因为这么设置也能用。 这么说你能力理解么?  
回复

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2018-8-14
在线时间
5 小时
 楼主| 发表于 2018-8-15 09:13:01 | 显示全部楼层
正点原子 发表于 2018-8-15 01:27
因为这么设置也能用。 这么说你能力理解么?


//USART1_TX PA.9 PA.10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9 与 GPIOA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度 50MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化 PA9, PA10


如果这么设置的话,PA10能做RX用吗??就是能做输入用吗?因为我看PA9和PA10都设置成了推挽复用输出
回复

使用道具 举报

2

主题

686

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
10804
金钱
10804
注册时间
2014-6-12
在线时间
1035 小时
发表于 2018-8-15 10:45:21 | 显示全部楼层
wxz1029wxz 发表于 2018-8-15 09:13
//USART1_TX PA.9 PA.10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9 与 GPI ...

如果实践证明能用就不要纠结了,处理问题不止一种办法。
回复

使用道具 举报

2

主题

686

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
10804
金钱
10804
注册时间
2014-6-12
在线时间
1035 小时
发表于 2018-8-15 10:49:22 | 显示全部楼层
wxz1029wxz 发表于 2018-8-15 09:13
//USART1_TX PA.9 PA.10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9 与 GPI ...

如果要理解的话,就是在硬件结构里,做输入时是上拉,做输出时是推挽。
回复

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2018-8-14
在线时间
5 小时
 楼主| 发表于 2018-8-15 11:19:30 | 显示全部楼层
xuyaqi 发表于 2018-8-15 10:49
如果要理解的话,就是在硬件结构里,做输入时是上拉,做输出时是推挽。

您这回答 跟我那问题不对应啊
回复

使用道具 举报

2

主题

686

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
10804
金钱
10804
注册时间
2014-6-12
在线时间
1035 小时
发表于 2018-8-15 16:33:46 | 显示全部楼层
wxz1029wxz 发表于 2018-8-15 11:19
您这回答 跟我那问题不对应啊

如果要仔细深入学习,我看还是学习寄存器程序,那样通过查寄存器手册,可以了解的一清二楚,看固件库程序都封装了,看不到里面的细节,只能照着用。
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2019-6-30
在线时间
7 小时
发表于 2019-6-30 18:11:12 | 显示全部楼层
设置为复用推挽时,施密特触发器输入打开的
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-15 04:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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