发新帖本帖赏金 100.00元(功能说明)我要提问
返回列表
打印
[MM32生态]

国产替代过程的经历,不吐槽,就是干

[复制链接]
7295|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

#申请原创#    @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)


使用特权

评论回复

打赏榜单

21小跑堂 打赏了 100.00 元 2022-04-21
理由:恭喜通过原创文章审核!请多多加油哦!

评论
21小跑堂 2022-4-21 16:02 回复TA
所涉知识点对于刚转入灵动的工程师帮助较大,作者上传了自己的基础例程和API说明,实际作用很强,但是官方的例程库其实可以直接使用,API说明的转化过程介绍不够详细,可移植性有待加强。 
沙发
lidi911| | 2022-4-21 20:03 | 只看该作者
哈哈,干就完了。

使用特权

评论回复
板凳
麻花油条| | 2022-4-26 15:04 | 只看该作者
哈哈,鼓足干劲加油干

使用特权

评论回复
地板
tpgf| | 2022-5-4 08:35 | 只看该作者
其实这也是国产兴起的必然过程

使用特权

评论回复
5
nawu| | 2022-5-4 08:47 | 只看该作者
慢慢来吧 好在有楼主这样的大能在

使用特权

评论回复
6
zljiu| | 2022-5-4 08:59 | 只看该作者
不能要求国产一下子就跟国际大品牌一样的啊

使用特权

评论回复
7
gwsan| | 2022-5-4 09:40 | 只看该作者
progen工具是免费的吗

使用特权

评论回复
8
qcliu| | 2022-5-4 09:54 | 只看该作者
支持楼主选用国产

使用特权

评论回复
9
aoyi| | 2022-5-4 10:00 | 只看该作者
如果国产普及了 就不存在这个问题了

使用特权

评论回复
10
mutable| | 2022-5-5 15:13 | 只看该作者
厉害啊,最近灵动的原创好多啊

使用特权

评论回复
11
kiwis66| | 2022-5-14 19:20 | 只看该作者
就是干,干就完了,所有的借口都是推辞

使用特权

评论回复
12
duo点| | 2022-5-17 10:53 | 只看该作者
国产芯片存在的问题的确还太多了,真正要替换起来也许会碰到很多问题

使用特权

评论回复
13
星辰大海不退缩| | 2022-10-15 15:36 | 只看该作者
本帖最后由 星辰大海不退缩 于 2022-10-15 15:37 编辑

确实挺好的,图文并茂,很容易理解,过程中发生的问题应该多总结分享一下,赞

使用特权

评论回复
14
天意无罪| | 2022-10-16 10:43 | 只看该作者
写得详细,反手一个赞,论坛现在就是缺少这种有干货的主题帖了。

使用特权

评论回复
发新帖 本帖赏金 100.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

204

帖子

10

粉丝