我与极海国产芯的三次“碰撞”
在接触极海芯片之前,在大学学习了STC89C51、STM32、NXP系列的芯片,参加工作之后碰上芯片大涨价,公司临时采用HC32华大的芯片,后来遇到一些简单的项目,又接触到极海的芯片APM32F003,也就是极海芯片是我接触到的第五款芯片了,应该算是我是用过MCU中最小的一款了,性能还不错,价格也很适中,官网也很整洁,相关的资料一会就能找到,资料也很全,代理一般也会提供相应的技术支持,体验感相对来说还是很不错的,下面是极海官网截图。
我们公司采用APM32F003F6P6芯片,主要想用它的ADC和SPI功能。 下面就是我跟极海芯片的三次碰撞:
第一次碰撞,公司想做一个多路ADC的采集设备,用了NTC测温,用了AIN4、AIN5和AIN6管脚,一共是2路,1路加热和1路制冷。下面是MCU部分的原理图。
根据官方给的 例程,很快就写好了代码,烧录程序之后,程序在芯片中正常运行,但感觉才读出来的数据有问题,所以想在线调试一下看看哪里出了问题,问题来了,刚打开在线调试按钮是好的,点击开始运行,界面直接就卡死了,一开始我以为是线接触不好,但是后来经过多次仿真之后,每次一点击开始运行,界面准卡死,后来开始考虑到,可能是仿真和芯片有冲突。
一直就是找不到问题,然后挨个屏蔽代码,最后发现屏蔽到ADC初始化函数,程序可以正常仿真了,可以判断是ADC这部分代码的问题了,查了好长时间,发现ADC配置这边也没有什么问题,就很崩溃,然后就更改分频/时钟频率/ADC位数都不管用,最后改到扫描模式,他竟然好使了,也就是下面这部分配置。
此时是将扫描模式改为禁止了,一开始是使能扫描模式,那问题应该找到了,是ADC扫描模式的问题,单次转换模式就没有问题,只要切换到扫描模式就有问题,但是这是为什么呢,只有去翻找数据手册了,他的单次转换是对要转换的通道进行依次转换。
下面是他单次转换,比如转换AIN4通道,他转换就完成了
而我们再来看扫描模式,他竟然是从AIN0开始转换,到你结束的转换通道!!!!!
然后我们惊奇的发现,下载口还是他的ADC转换口之一!!
SWCLK是PD3管脚,也是ADC的AIN3,那问题找到了,就是因为用了扫描模式之后,在仿真的时候会读取AIN3管脚电压导致的仿真卡死,而正常程序运行不仿真没有问题,因为我们实时性要求还可以,因此我们改为单次转换完成切换通道在读取下一个通道,算是解决了这个问题,不知道官方能不能看到这个反馈,有没有方法硬件更改一下,像32他可以禁止JTAG管脚功能之类的,极海可不可以也能做到在仿真的时候把这几个管脚禁止他的功能,这是和极海芯片的第一次碰撞。
第二次碰撞也是跟ADC有关系,是为了读取一个电池的电压,使用采集完成中断来读取的,期间还用了SPI 读取了一个集成按键模块TM1628,一开始读取按键工作还正常,但有次出门之后,回来发现,莫名其妙读回来一个按键被按下的标志位,就很嘛,谁趁着我出门偷偷按了他么吗,问了同事,同事说没人来过我这边,见了鬼了。然后断电重启设备重新运行,过了一会,他又返回一个按键按下标志,这时我意识到,这不像是个有人在搞怪,这TM是有Bug,查看了按键模块通讯频率,最大支持1M啊,我的才500Khz左右,怎么能读取错误,一开始以为是走线的问题,寄生电容太大导致,然后就疯狂降频率,降了频率之后发现错误又出现,看来还不是频率的问题。然后又是挨个屏蔽函数操作,屏蔽到ADC初始化后,通讯正常了,最终发现是ADC采集完成触发中断打断了SPI的读取,修改操作是用检测ADC采集完成的标志位来判断是否读取完成,再切换通道。
第三次碰撞是在一次系统独立看门狗喂狗。
独立看门狗是用的内部RC晶振,这种晶振受温度影响比较大,当初测试是在夏天没有出现过问题,到了冬天之后,可能有的晶振会不稳定,理论内部晶振是128Khz,我们设置做了最大喂狗时间为4ms,已经是最长了时间了,但是系统经常会自动复位,一开始以为外部信号触发的抚慰,但是用示波器抓了波形之后,并不是外部RST管脚导致的芯片复位,那还有一种导致MCU复位的原因就是看门够了,在线调试查看RC内部真正的频率,竟然是132Khz,比128Khz多了一点,但是也不至于程序这么频率复位啊,程序上也没有这么耗时间的地方,但是看门狗肯定是有问题,继续查找看门狗发现设置时间有问题,最后发现确实例程库有问题。
这是例程库看门口的基本历程,在初始化的时候获取了依次LIRC的时钟频率,在我们那块频率不正常的板子上,测得RC频率为130Khz。
而计算重装载值公式在初始化中
计算公式 = 132000/512 ≈ 258
而IWDT_SetReloadCounter这个函数的传参范围为无符号char类型,表示范围为0~255
这就破案了啊,传入258,直接溢出了啊,相当于传入重装载值为2个时钟周期啊!那指定这么点时间肯定来不及喂狗,肯定溢出了啊,这个例程有点相当不严谨,建议官方回去在核实一下,我们这边的解决方法是直接传入0xff解决了。
以上就是和极海芯的三次“碰撞”,其实大家还是要对国产芯多点信心,大家都在成长,都还需要一段时间。
最后希望极海国产芯越做越好。我与极海国产芯的三次“碰撞”