OpenEdv-开源电子网

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

STMF407探索者历程代码中的一些疑惑

[复制链接]

1

主题

7

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2016-11-2
在线时间
1 小时
发表于 2016-11-2 10:23:04 | 显示全部楼层 |阅读模式
问题1 GPIO的配置,从M3迁移到M4对GPIO的配置特别不习惯,而且有些不易理解(在QQ里加了一些相关的群也没人能说清楚)。首先就是这个复用功能的配置:

复用功能配置

复用功能配置


复用功能配置
对 I/O 端口进行编程作为复用功能时:
●      可将输出缓冲器配置为开漏或推挽
●      输出缓冲器由来自外设的信号驱动(发送器使能和数据)
●      施密特触发器输入被打开
●      根据 GPIOx_PUPDR 寄存器中的值决定是否打开弱上拉电阻和下拉电阻
●      输入数据寄存器每隔 1 个 AHB1 时钟周期对 I/O 引脚上的数据进行一次采样
●      对输入数据寄存器的读访问可获取 I/O 状态

文档里的说明如上。

再看历程,先拿简单的串口举例,串口的复用配置如下:
        //USART1端口配置
        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

        //串口1对应引脚复用映射
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9复用为USART1
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10复用为USART1

问题是:如果对于串口的TX脚,配置成了复用推完输出,配置上拉下拉还有意义吗?不过这个可以勉强接受,最多就是忽略上拉的作用。(图22的下面部分)
如果是RX脚(此时可以有上拉下拉),配置成推挽输出,这个就很不好理解了。推挽输出就有个高低状体,无论是那个状态都会对输入产生影响,希望高人指点一二;

还有定时器的输入捕获实验类似:
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //GPIOA0
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;        //速度100MHz
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; //下拉
        GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA0

        GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM5); //PA0复用位定时器5

配置成推挽输出,无论输出状态是高是低,都会对输入产生影响吧。不知道是我哪里理解有问题,请大神们教育。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

58

主题

6293

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11477
金钱
11477
注册时间
2014-4-1
在线时间
1298 小时
发表于 2016-11-3 14:04:52 | 显示全部楼层
DavidHan 发表于 2016-11-3 11:54
很感谢你的及时解答。

rx是接收功能,在GPIO的配置里有体现吗? 请用具体的代码指示一下,哪行代码可 ...


只要配置为AF+USART功能,就自动处于接收状态。

回复 支持 1 反对 0

使用道具 举报

58

主题

6293

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11477
金钱
11477
注册时间
2014-4-1
在线时间
1298 小时
发表于 2016-11-2 10:42:05 | 显示全部楼层

问题描述和版面很舒服,语言基本通顺,意思清晰,错别字少。
这样的提问必答,包教包会!


回复 支持 反对

使用道具 举报

58

主题

6293

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11477
金钱
11477
注册时间
2014-4-1
在线时间
1298 小时
发表于 2016-11-2 10:46:24 | 显示全部楼层

不论输出高还是低,推挽电路的驱动能力都很强,即驱动电路的内阻很小,
而上拉、下拉电阻的阻值都很大(一般几十KΩ以上),所以基本没作用。

加还是不加你随意,加了也不犯死罪。

回复 支持 反对

使用道具 举报

58

主题

6293

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11477
金钱
11477
注册时间
2014-4-1
在线时间
1298 小时
发表于 2016-11-2 10:51:51 | 显示全部楼层

RX脚是输入端,而推挽电路是输出,
图22中间、下方的“输出控制”电路会自行把两个MOS都关闭。

这是文字说明方面的问题,可能手册没有提到,也可能读者没注意到。

回复 支持 反对

使用道具 举报

58

主题

6293

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11477
金钱
11477
注册时间
2014-4-1
在线时间
1298 小时
发表于 2016-11-2 10:52:50 | 显示全部楼层

不论是AF功能还是普通IO,
只要端口做输入,下面的输出电路都会关闭。

回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2016-11-2
在线时间
1 小时
 楼主| 发表于 2016-11-2 14:20:45 | 显示全部楼层
xuande 发表于 2016-11-2 10:52
不论是AF功能还是普通IO,
只要端口做输入,下面的输出电路都会关闭。

首先,非常感谢你的精彩回答。

但是有些复用既有输出的功能也有输入的功能。比如串口的两个复用,一个是输出类型(tx),一个是输入类型(rx),代码里一并将他们配置为 GPIO_OType_PP;而在f103的TX是配置成复用推挽输出,RX配置成浮空输入的。不知道F4的TX和RX一并配置为GPIO_OType_PP, GPIO_PuPd_UP如何理解
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2016-11-2
在线时间
1 小时
 楼主| 发表于 2016-11-2 14:27:22 | 显示全部楼层
DavidHan 发表于 2016-11-2 14:20
首先,非常感谢你的精彩回答。

但是有些复用既有输出的功能也有输入的功能。比如串口的两个复用,一个 ...

我有个猜想,但没有找到根据。
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;  //这一项的配置是针对输出,对输入不生效。
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // 这一项的配置是针对开漏输出,和输入。推挽输出可以忽略。

这样的话,上面串口的配置代码可以分解成下面两段
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9  //tx
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //速度50MHz
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
        GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA9

        GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_10; //rx
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NULL; //上拉
        GPIO_Init(GPIOA,&GPIO_InitStructure); //PA10

这样的方式和F1的配置有些类似了。不知道对不对
回复 支持 反对

使用道具 举报

58

主题

6293

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11477
金钱
11477
注册时间
2014-4-1
在线时间
1298 小时
发表于 2016-11-2 15:57:59 | 显示全部楼层

不论输出还是输入,只要不是模拟信号,
都可以加上拉或者下拉电阻,或者什么都不加。
你需要理解的是:上拉电阻、下拉电阻的作用。

回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2016-11-2
在线时间
1 小时
 楼主| 发表于 2016-11-3 10:09:50 | 显示全部楼层
xuande 发表于 2016-11-2 15:57
不论输出还是输入,只要不是模拟信号,
都可以加上拉或者下拉电阻,或者什么都不加。
你需要理解的是: ...

为什么串口的tx和rx都要配置成复用推挽输出呢,而实际的串口一个是tx一个是rx
回复 支持 反对

使用道具 举报

58

主题

6293

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11477
金钱
11477
注册时间
2014-4-1
在线时间
1298 小时
发表于 2016-11-3 11:48:06 | 显示全部楼层

rx是接收功能,输出电路自动被硬件关闭了。
前面已经说过。

回复 支持 反对

使用道具 举报

58

主题

6293

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11477
金钱
11477
注册时间
2014-4-1
在线时间
1298 小时
发表于 2016-11-3 11:50:36 | 显示全部楼层
DavidHan 发表于 2016-11-3 10:09
为什么串口的tx和rx都要配置成复用推挽输出呢,而实际的串口一个是tx一个是rx


rx是接收功能,输出电路自动被硬件关闭了。
前面已经说过。

这时,即使有配置为推挽的语句,也不起作用了。
当然,这些语句不应当出现,误导人。

回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2016-11-2
在线时间
1 小时
 楼主| 发表于 2016-11-3 11:54:31 | 显示全部楼层
本帖最后由 DavidHan 于 2016-11-3 11:55 编辑
xuande 发表于 2016-11-3 11:48
rx是接收功能,输出电路自动被硬件关闭了。
前面已经说过。

很感谢你的及时解答。

rx是接收功能,在GPIO的配置里有体现吗? 请用具体的代码指示一下,哪行代码可以说明 PA10的配置是输入功能。
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2016-11-2
在线时间
1 小时
 楼主| 发表于 2016-11-7 11:43:43 | 显示全部楼层
xuande 发表于 2016-11-3 14:04
只要配置为AF+USART功能,就自动处于接收状态。

明白,多谢热心解答
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-3-1 09:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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