返回列表 发新帖我要提问本帖赏金: 300.00元(功能说明)

[APM32F0] 极海国产芯|我与极海国产芯的三次“碰撞”

[复制链接]
1527|4
 楼主| woai32lala 发表于 2022-11-26 12:37 | 显示全部楼层 |阅读模式
本帖最后由 woai32lala 于 2022-11-30 11:55 编辑

我与极海国产芯的三次“碰撞”
    在接触极海芯片之前,在大学学习了STC89C51、STM32、NXP系列的芯片,参加工作之后碰上芯片大涨价,公司临时采用HC32华大的芯片,后来遇到一些简单的项目,又接触到极海的芯片APM32F003,也就是极海芯片是我接触到的第五款芯片了,应该算是我是用过MCU中最小的一款了,性能还不错,价格也很适中,官网也很整洁,相关的资料一会就能找到,资料也很全,代理一般也会提供相应的技术支持,体验感相对来说还是很不错的,下面是极海官网截图。

681a3afdaf3332434f014cc7d27a82d2
      我们公司采用APM32F003F6P6芯片,主要想用它的ADC和SPI功能。    下面就是我跟极海芯片的三次碰撞:   
      第一次碰撞,公司想做一个多路ADC的采集设备,用了NTC测温,用了AIN4、AIN5和AIN6管脚,一共是2路,1路加热和1路制冷。下面是MCU部分的原理图。

ec092bbfa13aab932c94705c0198b65e      

      根据官方给的 例程,很快就写好了代码,烧录程序之后,程序在芯片中正常运行,但感觉才读出来的数据有问题,所以想在线调试一下看看哪里出了问题,问题来了,刚打开在线调试按钮是好的,点击开始运行,界面直接就卡死了,一开始我以为是线接触不好,但是后来经过多次仿真之后,每次一点击开始运行,界面准卡死,后来开始考虑到,可能是仿真和芯片有冲突。     

      一直就是找不到问题,然后挨个屏蔽代码,最后发现屏蔽到ADC初始化函数,程序可以正常仿真了,可以判断是ADC这部分代码的问题了,查了好长时间,发现ADC配置这边也没有什么问题,就很崩溃,然后就更改分频/时钟频率/ADC位数都不管用,最后改到扫描模式,他竟然好使了,也就是下面这部分配置。

7d8359457d5e253fcd7dcd863c6845e2
此时是将扫描模式改为禁止了,一开始是使能扫描模式,那问题应该找到了,是ADC扫描模式的问题,单次转换模式就没有问题,只要切换到扫描模式就有问题,但是这是为什么呢,只有去翻找数据手册了,他的单次转换是对要转换的通道进行依次转换。

      下面是他单次转换,比如转换AIN4通道,他转换就完成了

29a7d8ec83ecc0bc74a3488a77868994
      而我们再来看扫描模式,他竟然是从AIN0开始转换,到你结束的转换通道!!!!!

9f3220f49a16b2dd4be147f1c5963bc0
      然后我们惊奇的发现,下载口还是他的ADC转换口之一!!

a52650bb403c7d7f7e9296244e59b231
       SWCLK是PD3管脚,也是ADC的AIN3,那问题找到了,就是因为用了扫描模式之后,在仿真的时候会读取AIN3管脚电压导致的仿真卡死,而正常程序运行不仿真没有问题,因为我们实时性要求还可以,因此我们改为单次转换完成切换通道在读取下一个通道,算是解决了这个问题,不知道官方能不能看到这个反馈,有没有方法硬件更改一下,像32他可以禁止JTAG管脚功能之类的,极海可不可以也能做到在仿真的时候把这几个管脚禁止他的功能,这是和极海芯片的第一次碰撞。

      第二次碰撞也是跟ADC有关系,是为了读取一个电池的电压,使用采集完成中断来读取的,期间还用了SPI 读取了一个集成按键模块TM1628,一开始读取按键工作还正常,但有次出门之后,回来发现,莫名其妙读回来一个按键被按下的标志位,就很嘛,谁趁着我出门偷偷按了他么吗,问了同事,同事说没人来过我这边,见了鬼了。然后断电重启设备重新运行,过了一会,他又返回一个按键按下标志,这时我意识到,这不像是个有人在搞怪,这TM是有Bug,查看了按键模块通讯频率,最大支持1M啊,我的才500Khz左右,怎么能读取错误,一开始以为是走线的问题,寄生电容太大导致,然后就疯狂降频率,降了频率之后发现错误又出现,看来还不是频率的问题。然后又是挨个屏蔽函数操作,屏蔽到ADC初始化后,通讯正常了,最终发现是ADC采集完成触发中断打断了SPI的读取,修改操作是用检测ADC采集完成的标志位来判断是否读取完成,再切换通道。

fc89a56ceb229b026b588b95f40edbce
      第三次碰撞是在一次系统独立看门狗喂狗。
独立看门狗是用的内部RC晶振,这种晶振受温度影响比较大,当初测试是在夏天没有出现过问题,到了冬天之后,可能有的晶振会不稳定,理论内部晶振是128Khz,我们设置做了最大喂狗时间为4ms,已经是最长了时间了,但是系统经常会自动复位,一开始以为外部信号触发的抚慰,但是用示波器抓了波形之后,并不是外部RST管脚导致的芯片复位,那还有一种导致MCU复位的原因就是看门够了,在线调试查看RC内部真正的频率,竟然是132Khz,比128Khz多了一点,但是也不至于程序这么频率复位啊,程序上也没有这么耗时间的地方,但是看门狗肯定是有问题,继续查找看门狗发现设置时间有问题,最后发现确实例程库有问题。
      这是例程库看门口的基本历程,在初始化的时候获取了依次LIRC的时钟频率,在我们那块频率不正常的板子上,测得RC频率为130Khz。

ed3ee9fe15c493bde8fbed8470623948
而计算重装载值公式在初始化中
9785d62a3f173ff4c85ae4248cfbdf53
061150495191575389bf7a6376d84e23
     计算公式 = 132000/512 ≈ 258
      而IWDT_SetReloadCounter这个函数的传参范围为无符号char类型,表示范围为0~255
这就破案了啊,传入258,直接溢出了啊,相当于传入重装载值为2个时钟周期啊!那指定这么点时间肯定来不及喂狗,肯定溢出了啊,这个例程有点相当不严谨,建议官方回去在核实一下,我们这边的解决方法是直接传入0xff解决了。
      以上就是和极海芯的三次“碰撞”,其实大家还是要对国产芯多点信心,大家都在成长,都还需要一段时间。
      最后希望极海国产芯越做越好。我与极海国产芯的三次“碰撞”

打赏榜单

Gfan 打赏了 300.00 元 2022-12-05
理由:恭喜获得极海国产芯悬赏贴活动的“最佳国产芯文博主”称号,感谢您的支持,期待下次的干货分享哦!

beyikyo 发表于 2022-11-30 10:31 | 显示全部楼层
支持一波!写的真的很认真
 楼主| woai32lala 发表于 2022-11-30 10:41 | 显示全部楼层
beyikyo 发表于 2022-11-30 10:31
支持一波!写的真的很认真

谢谢,虽然国产还有某些bug,还是要多多多支持国产
两只袜子 发表于 2022-12-1 14:56 来自手机 | 显示全部楼层
是的,支持支持国产才能给国更多的发展空间。
Gfan 发表于 2022-12-5 14:00 | 显示全部楼层
感谢您的支持与分享!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

108

主题

559

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部