复旦微 FM33A0610EV单片机
1. MCU概述
FM33A0xxEV是针对国网、南网单三相智能电表和海外智能电表的主控MCU,基于ARM Cortex-M0内核设计,集成最大512KB嵌入式闪存和80KB SRAM。价格便宜,单片只需要9元人民币左右。
2. 主要特点
① 拥有32-bit的低功耗定时器,这个做长时间睡眠非常好用。
② 具有LCD段码控制器,适合带断码屏的项目。
③ 低功耗性能在国产芯片里表现很好。
④ 拥有6个普通串口和2个低功耗串口,适合多串口项目
⑤ 独立看门狗无法关闭,上电自动运行,编程需要特别注意!
⑥ 外置32768晶振只要焊接上就自动启用,如果未起振会自动切换到内部32K晶振,编程也需要注意。
⑦ 采用ARM Cortex-M0 内核,很多代码可以参考同内核的其他MCU代码,例如RTOS移植。
3. IAR编译器适配
到复旦微技术论坛(http://www.fmdevelopers.com.cn/)下载“复旦微IAR配置文件”。按如下步骤操作(.代表IAR的安装目录):
① 将“config\debugger\FMSH”复制到“.\arm\config\debugger\”。
② 将“config\devices\FMSH” 复制到“.\arm\devices\”。
③ 将“config\flashloader\FMSH”复制到“.\arm\ flashloader\”。
④ 将“config\linker\FMSH”复制到 “.\arm\linker\”。
4. FreeRTOS移植
可以按照传统方式下载FreeRTOS源码,然后拷贝到对应工程中,并且将对应的M0内核相关的port.c和portasm.s添加到工程中,然后IAR项目包含对应的头文件路径,即可编译通过。
这里想介绍一个更简便的移植方案,利用STM32CubeMX。找到一个Cortex M0内核的STM32,然后在STM32CubeMX下勾选FreeRTOS并且做相应的低功耗以及其他配置,然后生成一个STM32工程,然后将对应的FreeRTOS以及它的封装层拷贝到复旦微单片机对应的工程中。添加对应的头文件包含路径即可移植成功。该方法简单方便,还可以和STM32的项目统一目录排放习惯,而且中间封装层的移植也一步到位。
5. 低功耗移植
FreeRTOS下的低功耗需要配置configUSE_TICKLESS_IDLE为2,vPortSuppressTicksAndSleep函数可以参照STM32低功耗项目移植即可。这里主要关注的是深度睡眠下低功耗定时器的运用以及注意事项。
低功耗启动后,总有一个时刻单片机会被唤醒,这个时候唤醒源就可以分为两类:
1.低功耗定时器定时时间到。
2.其他外部中断源。
对于第1种唤醒源,直接把定时时间作为操作系统时间戳基准的修正值即可,这个没什么值得注意的。而对于第2种唤醒源必须能够根据定时器的计数值来计算从睡眠到唤醒经过的时间。
第2种情况看似也很简单,拿到睡眠前和唤醒后的定时器的计数值做运算好像就可以了,把低功耗定时器做成单周期唤醒模式即可。但是仔细想一下这种情况是有问题的。例如当唤醒后MCU根据定时器中断标志判断未发生中断,那就是外部中断导致的,然后准备去关闭定时器,但是就在关闭语句的执行过程中发生了定时器唤醒中断,此时计数值归零,然后读到计数值为0,睡眠前的计数值也为0,误判为无睡眠时间!想解决这个问题也是可以的,关闭定时器后需要进入临界区进行二次判断。逻辑和代码冗余显然不是好的设计。或者采用先停止定时器,然后退出中断屏蔽模式,看是否产生定时器中断,这种模式的问题是退出屏蔽模式后由中断导致的插入时间无法计算,最终计算得到的补偿值很可能和真实值出入很大。
复旦微的该款MCU可以采用比较模式来规避以上问题。也就是整个处理过程中低功耗定时器一直运行(直到0xFFFFFFFF后才归零),到补偿RTOS时间戳的语句时直接拿出当时的计数值减去睡眠前的计数值即可,补偿完之后才停止定时器计数。这种方案在各种情况下引入的运算误差是最小的,也是最有确定性的。
6. 低功耗测试
经过以上移植后,创建一个简单的任务,翻转一个GPIO口,当翻转时间设置的足够长,测量出来的功耗就很接近深度睡眠下的功耗了,实测3-4uA左右,和手册参数一致。
但是将GPIO的翻转时间减小到500ms后,平均功耗来到了7uA+。这种情况在STM32L4系列单片机上是不存在的(STM32L4 500ms翻转IO的功耗平均下来可以忽略不计)。考虑到该单片机采用的M0内核,并且全速运行下每MHz对应的电流高于STM32L4系列,所以也是可以理解的。更慢的内核导致退出睡眠执行IO翻转到再次进入睡眠的工作时间变长,然后全速运行时每MHz的电流又更高,更长的时间乘以更高的运行时间,必然导致更高的动态运行功耗。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!