#申请原创# @21小跑堂
整体概览
闲暇之余,看到版内有工程师朋友在选择 MM32 MCU 作为首选国产替代料时,还没开始就打算放弃了。了解到可能是因为官网的配套资料更新太慢,要么是没有 UM 手册,要么是没有库例程,“手中无米,心中慌乱” 的感觉大家都懂的。那怎么办?放弃吗?看到官方介绍的一些产品信息后还是想再试试的。接下来分享一些经验,让大家掌握一些套路去弥补官方的不足,能尽快完成替代项目。我将内容主要分为以下几点:
- 获取灵动微资料的一些管用途径
- 生态资源方面国产替代遇到的痛点及解法
- 以 MM32F0020B1T 为例谈库例程
- 用 Multi-Timer 中间件去开发项目
- 附件内容
- 参考资源
一、获取灵动微产品资料的一些管用途径
灵动微官网:https://www.mindmotion.com.cn/
能获取到关于芯片的已有官方发布资料,包括一些芯片手册、工具包以及库例程,还有一些应用说明笔记资料,有些新出来的产品配套资料不是很完整但基本够用。另外,其实能够从中挖掘出一些其它信息,比如说:官方座机号、官方邮箱、官方技术 QQ 群等,还可以直接留言。基本上这是最直接有效的一条路。
灵动微官方技术支持QQ群:294016370
这个应该是官方自己工程师维护的,已经有小两千多号人在里面了,人才济济呀,众人拾柴火焰高嘛!想从中获取到对自己有价值的东西应该不难,我一般会直接从群分享文件夹入手,看看是否有技术资料的积淀。不过有个不好的现象就是国产替代热浪犹在,群里太多炒货的声音打乱了本应该是技术探讨的一片和谐,还是希望官方能够维护好秩序。
其它途径:
包括直接电话前台要求转接技术(我就是这么干的,然后与技术沟通了一下自己项目和公司情况后给我了销售电话,销售为我分配了代理商提供了一些想要的资料和板子),包括从一些社区论坛活动中学习和搜集信息(比如 21IC 官方贴吧本版,其它的不便于在此多说),包括灵动微的官方微信公众号(他们一直有做技术分享,积累了很多案例),还包括向周边认识的工程师朋友或者一些技术博主虚心讨教。只要心够绝,办法总比困难多。大家还有其它途径也可以留言回复哟!
二、生态资源方面国产替代遇到的痛点及解法
资料包中没有 GCC 开发环境教程:
因为很多公司仍旧坚持使用免费的环境,对于土豪版的 KEIL 和 IAR 只能看不能摸,所以还是需要 GCC 支持。国产替代的痛点中,编译器和开发环境首当其冲,遇到这个问题时千万别担心,可以参考我前面 2 篇经验贴的介绍,希望能够帮到一些。
- https://bbs.21ic.com/icview-3213464-1-1.html
- https://bbs.21ic.com/icview-3214270-1-1.html
不确定能够用什么调试烧录器:
很多比较古老的 IDE 和工具都逐渐被人淡忘,但依旧有人坚持在用,配套调试和烧录器一般都会有官方工具支持的,实在不想熟悉官方东西的话用 J-Link 和 DAP 挺好的,只要是 ARM Cotex M 系列内核的使用 SWD 口的单片机都能够支持,还可以按照之前分享的经验贴配置一些插件包,让上位机工具适配。
- https://bbs.21ic.com/icview-3212446-1-1.html
没有标准原理图库和封装库:
作为一个偏爱走捷径(喜欢偷懒)的硬件工程师,一般都习惯于直接拿官方的硬件库应用到自己 PCB 设计中,但遇到官方因为版权问题而不能提供的情况时就只能另谋他路了。一般做法是去找同类型 同封装的被替代料的资源,或者直接在立创 EDA 中寻找开源作者分享的,注意最好找介绍比较齐全且有成功打板经验的作者。另外大家也可以关注一下 华秋 DFM 工具,在硬件设计时可能派上用场。
没有库例程帮助文档:
偏爱使用库去做开发的朋友第一步应该就是需要熟悉原厂的库,先得从 API 层面作为切入口,但目前大多国产厂商都不会提供官方的帮助说明文档,大概率也跟版权有关吧。但这应该难不倒熟悉 ST 的我们,只要他们的库是按照行业规范来编写的,我们就可以使用 Doxygen 自己生成,自己动手丰衣足食!
其它痛点:
没有完整方案,没有自己的算法库,没有丰富的功能模块使用教程,更没有自己的 “全家桶” …… 怎么办? 我们是大自然的搬运工,我们可以学习(参考和移植)外国大厂成熟的资源。国产 MCU 发展,路漫漫……
三、以 MM32F0020B1T 为例谈库例程
由于接触 MM32F0020 系列产品时间比较早,也通过上面有效途径获取到了开发者适用的 demo 板、库例程。一般而言,开发板原理图可以作为最小系统的参考设计:
刚拿到例程包的时候,发现没有库的 API 帮助说明,于是就用 Doxygen 制作了一个:
由于需要输出 .chm 格式的帮助文档,需要使用到微软官方的 hhc.exe 工具,这里配置好后保存了一份 doxygen 配置文件,之后打开可视化工具后就可以直接导入配置了。由于库不大,整个过程很快就可以生成输出最终想要的说明文档了,如下图的样式:
由于官方编写的注释不是特别规范,所以有很多地方存在格式问题,不过可以初步借助它进行 API 运用了,跟 ST 的标准库风格很像很像,用起来也不会觉得太陌生。一般库例程包含了各个外设的使用范例,另外还会包含一个模板工程,这里也需要自己制作一个,下章节介绍过程。这里展示一下最终库例程的样子:
包含了芯片的启动文件以及底层驱动库,各个外设的应用实例,版本迭代说明,API 帮助文档以及 Doxygen 配置文件,还附带了一个清除中间过程文件的 .bat 脚本。
四、用 Multi-Timer 中间件去开发项目
Multi_Timer 是一个极其轻量的开源软件定时器组件,只要 MCU 容量够用,就可以无限拓展成为 N 个定时器,这在一定程度上方便了定时器资源较少的 MCU,但一般老工程师会说:"我可以只用一个定时器,用计数器+标志位的方式也可以实现出 N 个定时器,资源少我也可以充分利用定时器"。是的没错,但 Multi_Timer 对比老工程师方法的优势在哪里呢?它可以取代传统的标志位+计数器的判断方式,让程序看起来更加优雅更加好维护。于是乎,决定将其用于 MM32F0020 的模板工程中。
- Multi_Timer [color=rgba(0, 0, 0, 0.75)]项目的仓库地址:https://github.com/0x1abin/MultiTimer
下载组件的源码后添加到一个新建的模板工程中,主要实现多定时任务的注册、定时任务的回调函数实现、多定时任务轮调以及在 Systick 1ms 中断服务函数中进行计数器的自增,实现代码如下:
// Define to prevent recursive inclusion
#define _MAIN_C_
// Files includes
#include "led.h"
#include "delay.h"
#include "uart.h"
#include "MultiTimer.h"
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup MM32_Example_Layer
/// @{
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup MAIN
/// @{
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup MAIN_Exported_Constants
/// @{
Timer Task_Timer1, Task_Timer2 ;
/*用multi_timer创建的定时器1定时时间 单位:ms*/
#define TIMER_TIMEOUT_10MS 1000
/*用multi_timer创建的定时器2定时时间 单位:ms*/
#define TIMER_TIMEOUT_1S 2500
/*multi_timer回调函数1调用*/
void MultiTimer1_Callback(void)
{
/* 系统每间隔1000毫秒 LED灯电平翻转 */
LED1_TOGGLE();
LED2_TOGGLE();
LED3_TOGGLE();
LED4_TOGGLE();
}
/*multi_timer回调函数2调用*/
void MultiTimer2_Callback(void)
{
/*系统每间隔2500毫秒 串口打印信息*/
printf("LED is blinking ...\r\n\r\n");
}
////////////////////////////////////////////////////////////////////////////////
/// [url=home.php?mod=space&uid=247401]@brief[/url] This function is main entrance.
/// @param None.
/// @retval 0.
////////////////////////////////////////////////////////////////////////////////
s32 main(void)
{
LED_Init();
DELAY_Init();
CONSOLE_Init(115200);
#ifndef __GNUC__
printf("\r\n\r\n MM32F0020B1T %s %s\r\n\r\n", __DATE__, __TIME__);
#endif
/*multi_timer 多定时任务创建*/
MultiTimer_Init(&Task_Timer1, MultiTimer1_Callback, TIMER_TIMEOUT_10MS, TIMER_TIMEOUT_10MS);
MultiTimer_Init(&Task_Timer2, MultiTimer2_Callback, TIMER_TIMEOUT_1S, TIMER_TIMEOUT_1S);
MultiTimer_Start(&Task_Timer1);
MultiTimer_Start(&Task_Timer2);
/*multi_timer计数器自增 MultiTimer_Ticks(); 放在 Systick 中断 1ms进一次*/
while (1)
{
/*multi_timer 多定时任务轮调*/
MultiTimer_Loop();
}
}
////////////////////////////////////////////////////////////////////////////////
/// @brief SysTick_Handler is call from interrupt map
/// [url=home.php?mod=space&uid=536309]@NOTE[/url] Call delay count function.
/// @param None.
/// @retval None.
////////////////////////////////////////////////////////////////////////////////
void SysTick_Handler(void)
{
/*multi_timer计数器自增*/
MultiTimer_Ticks();
TimingDelayDecrement();
}
另外,在用到 KEIL 导入 IAR 工程工具时,实际操作过程中发现导入到 IAR 工程中初始的包含文件路径格式需要手动修改,这点需要注意:
实际测试移植好的多定时任务模板工程,开发板串口每 2.5s 输出打印信息,LED 会每 1s 周期闪烁:
模板工程还运用了上篇帖子中的 progen 工具进行配置,经验来看,2KB RAM 的 MM320020 还是不要用 GCC 编译了,或者自行修改编译参数完成优化。
到这,基本分享完了我使用一颗新的国产 MCU 中途遇到的一些痛点,以及对应会思考要怎么绕开眼前的困难,希望能对正在使用国产 MCU 的你有所帮助,毕竟,能导入国产料还是能为公司产品赢得较大降本的,能为老板省钱的工程师会受老板重用的!
五、附件内容
- MM32F0020B1T 核心板原理图 —— 1. MM32F0020B1T_CoreBoard_SCH.pdf
- MM32F0020 的库例程 —— 2. MM32F0020_Lib_Samples.zip
六、参考资源
本文创作参阅学习了以下资源,在此声明感谢!
- https://blog.csdn.net/whw8007/article/details/9099215/
- https://mp.weixin.qq.com/s/Itvogwvu8EkoKkw7XEw75w
1. MM32F0020B1T_CoreBoard_SCH.pdf
(119.61 KB)
2. MM32F0020_Lib_Samples.zip
(3.81 MB)
|
所涉知识点对于刚转入灵动的工程师帮助较大,作者上传了自己的基础例程和API说明,实际作用很强,但是官方的例程库其实可以直接使用,API说明的转化过程介绍不够详细,可移植性有待加强。