GD32F303的GPIO口配置为AF输入会导致电平改变,最终无法触发

[复制链接]
138|10
 楼主 | 2018-11-8 13:57 | 显示全部楼层 |阅读模式
本帖最后由 liangzheng63 于 2018-11-8 15:43 编辑

我在使用TIMER和SPI的时候,需要将IO口配置为AF模式,即该IO口连向了TIMER外设或SPI外设。

  • 当使用TIMER的输入引脚TIMERx_ETI(TIMER的外部触发引脚)输入电平时,配置不同的GPIO口速度会导致TIMERx_ETI线上的电平发生不同变化,最后甚至无法正常触发TIMERx的事件。
  • 当我把SPI的配置为从模式,即SCK也为输入时,将SCK与TIMERxETI相连(即外部的信号来同时控制SCK与TIMERxETI),会导致线上的电平更低,最终无法使用。
  • 甚至在只配置IO口的情况下(即不初始化SPI和TIMER),该情况也是一模一样的

如图所示:原始信号(高电平为3.32V):


一、当GPIO口配置为50MHz
  • 外部信号只连接SCK或TIMERxETI(高电平为1.17V):
  • 外部信号同时连接SCK和TIMERxETI(高电平为0.54V):

二、当GPIO口配置为10MHz
  • 外部信号只连接SCK或TIMERxETI(高电平为2.35V):
  • 外部信号同时连接SCK和TIMERxETI(高电平为0.98V):

三、当GPIO口配置为2MHz
  • 外部信号只连接SCK或TIMERxETI(高电平为3.13V):
  • 外部信号同时连接SCK和TIMERxETI(高电平为2.92V):


测试芯片使用的是GD32F303CC,我感到很是奇怪,为什么AF电路会钳低输入电平呢,这将会导致在外部信号根本不能触发AF电路的电平改变,而在使用STM32F303的时候不会发生这种事情,这问题也真是比较刁难,找了好久才找到原来和AF电路配置的速率相关。

可从测试结果看出来,要想完成外部信号同时控制从机SCK,TIMERxETI的话,在10MHz下是无法完成的,只能在2MHz下来完成。那么,毕竟从机SCK、TIMERxETI都是AF输入接口,是否配置的频率会影响施密特触发的结果?


问题:
  • 修改AF速率,会拉低电平的原因是?
  • 10MHz的外部输入接于2MHz的AF输入配置下是否有风险?
  • 有更好的解决方案让电平不被接低,从而正常工作触发的吗?

希望GD的工程师能看到,或碰过这个问题的水友能提提建议
测试代码:



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
| 2018-11-8 14:19 | 显示全部楼层
AF模式是什么模式呀

评论

liangzheng63 2018-11-8 14:49 回复TA
Alternate Function,就是将IO口配置到外设上去了 
| 2018-11-8 14:28 | 显示全部楼层
本帖最后由 GONGO 于 2018-11-8 15:05 编辑

修改一下,看一下 user manual 中的寄存器配置,
CTL0[1:0] = 改成 In input mode(Floating input / Input with pull-up / pull-down) 选一种,

MD0[1:0] = 必须是 00 ,代表输入,其他都是输出模式




你把模式配成了输出模式当然不行了!


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主 | 2018-11-8 14:48 | 显示全部楼层
GONGO 发表于 2018-11-8 14:28
修改一下,把模式改成 In input mode(Floating input / Input with pull-up / pull-down)看一下 user man ...

不是的,我配置的就是AFIO output,指的输入是指配置成该模式后与外设相连,外设将该引脚视为输入引脚,就像帖子里最后一个图的Alternate Function Input一样
 楼主 | 2018-11-8 15:41 | 显示全部楼层
本帖最后由 liangzheng63 于 2018-11-8 17:13 编辑
GONGO 发表于 2018-11-8 14:28
修改一下,看一下 user manual 中的寄存器配置,
CTL0[1:0] = 改成 In input mode(Floating input / Inpu ...

问题解决了,谢谢 GONGO和王工!

看 GONGO 的画重点才发现了这个异处,GD32F303里是叫AFIO output 的,这个规则与GD32F103、STM32F103是相同的,即只有确定外设使用该IO口输出,才将其配置为Alternate function output mode,如果外设为输入时,则需配置为Input mode。

而STM32F303是这样描述的:

叫做Alternate function mode,只要是和外设要使用的IO口,配置为该Alternate function mode将IO交给外设管理,应该是当外设使用该IO口作为输入时,会在外设内部切断输出线路。

出现帖子里的原因就是我将STM32F303其配置成了Alternate function mode,将代码转到GD32F303上时,该寄存器位又对应了Alternate function output mode,导致输入信号与外设的输出线共线,才出现了上面这些滑稽的测试。

STM32F303寄存器异变的太多了,我没愣神,真是一字之差啊,还以为GD32F303可以像STM32F103向GD32F103替换一样,浪费了一天多时间找问题,算是给后来的人提个醒吧。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
| 2018-11-8 16:24 | 显示全部楼层
感觉是不是寄存器的配置有问题呀
| 2018-11-8 16:26 | 显示全部楼层
有没有可能跟外部硬件连接也有关系啊

评论

liangzheng63 2018-11-8 17:14 回复TA
没有,这就是最小电路测出来的,确实是配置的问题,STM32F303与GD32F303寄存器差别太大 
 楼主 | 2018-11-8 17:18 | 显示全部楼层
xiaoqizi 发表于 2018-11-8 16:24
感觉是不是寄存器的配置有问题呀

恩,就是寄存器的问题,STM32的寄存器规则变得多,有些特别小的点就很难注意到差别,且GD32F303与STM32F303差别还是挺大的
| 2018-11-10 18:16 | 显示全部楼层
这个用示波器的来监控的就很一目了然了的
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

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