• 开发GD32遇到的坑B点


    前言

    更换工作回到了智能家居行业,使用了GD32F103CB这个芯片,几年前用过stm32。公司的同事都在使用stm32的库函数来开发GD32的芯片,我就觉得特别的别扭,然后我就将公司项目独自使用了gd32的库函数,毕竟配套还是好的,而且还有一个有点就是,gd的主频可以达到相同类型的芯片108M,stm32的只有72M。但是更换的过程中,那种煎熬也是令人难忘的。下面就记录几个特殊的地方把。

    问题1:

    智能家居行业需要的按键特别多,因此会使用矩阵方式的按键。矩阵按键,那就要说下了,2*4的6个PIN脚,组合成8个按键,4行两列方式。这就需要随时更改PIN脚的输入输出模式,随时切换。不要在意字体好不好看哦
    如图:
    在这里插入图片描述
    两列永远是输入状态,然后4行,4行先全部设置为输入状态,然后,把PB10设置为输出模式,当PB10设置为高电平后,读取PA5的状态,如果读取到高电平 ,那么证明key1被按下了,然后在把4行都设置为输入状态,在把PA6设置为输出,紧接着设置为高电平,读取PA5的状态,如果是高点平,证明按键key2被按下,其余按键都是这么来弄。
    stm32上面,没问题,但是当我移植到GD32上面就出问题了。
    在这里插入图片描述
    如图,箭头所指的那个语句在stm32上面不会存在,但是如果在GD32上面不加,就出问题了,不加上拉低,当第二个按键检测的时候,虽然按了key1,但是key2同样会检测到,也就是说电平在设置了输入以后,会依旧保持高电平,而且这个现象只会在PB端口上面出现,下面的按键都是PA端口就不会出现问题,你说气人不。

    问题2:

    PB12作为定时器引脚,这个在stm32上面也存在
    只是解决发了时间比较多,在此记录下。
    我们的灯要做可调节灯光的,采取的是可控硅方式控制。这个时候就需要对220V进行过零检测。而选择的引脚就是PB12.这个引脚配置为中断引脚。下面图片是正确的写法。下面我来说下
    在这里插入图片描述
    首先为了排除干扰,将整体代码全部注释,只留下过零检测外部中断引脚的方式。查看数据手册,发现PB12,不是什么特殊引脚,不用重映射之类的内容。第一个,开PB端口的定时器,设置为输入引脚,绑定中断线。一切OK。但是给了过零,竟然不进入中断函数,疑惑之后测试PB10,一摸一样的配置,PB10 完美运行,这就尴尬了不是。继续查看手册,PB10,PB12,都没有特殊的引脚。最后经过一系列的测试,竟然发现要打开AFIO的时钟。查找资料” STM32 的所有 GPIO 都引入到 EXTI 外部中断线上,使得所有的 GPIO 都能作为外部中断的输入源。所以如果把 GPIO 用作 EXTI 外部中断时,还需要开启 AFIO 时钟。“

    https://blog.csdn.net/weixin_46323814/article/details/125606876网友对PB12引脚做为外部中断引脚说明配置
    最后问题解决了。
    特别说下,当你不开AFIO时钟的时候,触发外部中断有时候也是可以的,偶尔成功,当我触碰中断引脚用手摸一下,晃动一下,都会进来中断。写代码都写出迷信了。

    问题3:

    因为我们的调灯采取的是可控硅方式,通过检测过零,通过曲线方式控制模拟的PWM波形。这个时候需要开一个定时器,要非常准确的,而且必须大约在10US,注意了是微秒。然后我依旧拿的是GD32的库使用,同事使用的是STM32的库,没有出现问题,但是我来使用GD库就出问题了。你说说气人不。搞得好像就只有我能够遇到这种奇葩问题,多次这种感觉,怀疑自己能力,要被辞退了都。
    进入正题,因为定时器非常的快。这个时候要特别注意抢占时间的NVIC的问题了,我拿到的是官方的demo.
    特别注意下面这个图:
    在这里插入图片描述
    这个是我修改后的,原来这个滴答定时器的优先级设置的是0,0是最高的意思。首先我们要明白,滴答定时器就是一个普通在不能普通的定时器,不太准确的延时了,可以使用下,如果一要排序了,比如串口中断优先级了,那么这个滴答时钟,一定是最低的,但是demo竟然给最高,一个不注意就拿来主义了,之后不会关注。
    我们的项目使用了4个定时器+一个串口,都设置了优先级,唯独没注意这个滴答时钟的。结果出现了奇葩时间。只留下过零检测程序,然后程序内容是上升沿打开引脚高电平,下降沿打开引脚低电平,按照过零电路来说,最后进入上升沿和下降沿的次数一定是一样的,但是结果测试就是不一样,上升沿次数进入的越来越多,下降沿之间拉开差距了,通过示波器发现,及其不均衡,但是等待2分钟后,波形就稳定了,偶尔出现不一致,给你感觉这个芯片太垃圾了。经过一系列的分析,最后锁定滴答定时器的优先级问题。给的太高了。
    然后我就查看stm32为什么没问题他给的是多少:
    如图:
    在这里插入图片描述
    看看人家给的多低呀,就得这么干,这就是stm32不出问题的原因。
    如果你做的项目平时对时许要求不那么严格,发现不了这些问题,我是i因为做灯控,如果差了一点点,灯光就会晃动。因此发现的。在此记录下。
    说实话不太敢用GD的库了,但是也理解毕竟国产要发展STM32的库在中国10几年已经被无数人挖坑填坑了。
    接下来看看继续有什么坑可以遇到,在继续分享记录把。

  • 相关阅读:
    德事以灵活的解决方案,应对疫情常态化时期的企业办公选址
    【蓝桥杯Web】第十三届蓝桥杯(Web 应用开发)省赛真题
    罗丹明聚乙二醇叠氮,Rhodamine-PEG-N3,N3-PEG-Rhodamine,罗丹明PEG叠氮,叠氮PEG罗丹明,叠氮聚乙二醇罗丹明
    Fabric.js 拖拽顶点修改多边形形状
    Ribbon负载均衡
    jmeter-进阶02
    java的入门学习
    Arduino与Proteus仿真-Nokia5110 LCD界面菜单仿真
    开发区块链DApp应用,引领数字经济新潮流
    恒创科技:无法与服务器建立安全连接怎么解决?
  • 原文地址:https://blog.csdn.net/qq_14820081/article/details/126690551