CQ,这里是下行路轨上的C70E敞车~这段时间我于2025年1月2日在Iceasy商城申请了一片MM32-F0121-OB开发板板卡。收到货后第一时间对其进行了开箱,并在群友的帮助下新建出了自己的工程。本人软件水平稀烂,我看测评文章及Blibli视频中没有很详细的对于这个芯片新建工程的介绍,所以!本文对该款芯片新建一个工程模板进行指北,希望可以帮助到和我一样的菜鸟同志~

简单介绍一下这块板子上的例程:将到达的开发板使用 USB 连接到电脑,此时电脑会出现一个MM32-LINK的虚拟U盘;此时打开电脑上的在线串口即可接收串口调试信息,第一次在输出ADC信息前会显示当前板卡序列号、EEPROM及Flash芯片的读写测试;在按下开发板上的K1或K2即可开始 ADC 采样,采样到的数据将实时发送到电脑,其中STA指示灯开始闪烁代表数据正在交互;再次按下K1或K2即可停止采样出厂固件可以 ADC 采样板载的可调电位器,将采样到的值通过串口输出。
如果你需要将板子恢复到出厂设置的话,可以在网址为:https://chendudo.github.io/webusb/examples/firmware/web.html 进行下载及更新。这里主要对板卡新建一个自己的工程进行讲解。
一、 从MM32官方下载支持包及例程包
MM32F0121的PACK包从官网:https://www.mindmotion.com.cn/support/software/keil_pack 进行下载。
MM32F0121的支持资料从官网:https://www.mindmotion.com.cn/support/development_tools/evaluation_boards/miniboard/mm32f0121c6p/进行下载。

二、 用下载好的文件新建工程并移植到相应文件夹
1.先安装KEIL的芯片支持包,打开下载好的“MM32_KEIL_Pack_2.25”压缩包并解压名字为” MindMotion.MM32F0120_DFP.0.9.3.pack”的文件,双击在KEIL中安装即可自动将MM32F0121的支持包安装进软件。
2.在桌面新建一个文件夹,鉴于它是模板工程,我就命名它为“MM32F0121_MODE”。
3.打开新建好的文件夹并且再次新建两个文件夹,分别为”Start”,”USER”;开始移植需要的所有文件。
4.解压” LibSamples_MM32F0120_V0.12.4”,将” LibSamples_MM32F0120_V0.12.4\Device\MM32F0120”路径下的” HAL_Lib”文件夹直接复制到我们自己建立的文件夹下(复制库文件)。
4-1.将” LibSamples_MM32F0120_V0.12.4\Device\MM32F0120\Include”路径下文件全选放置到Start文件夹(复制启动文件)。
4-2.将” LibSamples_MM32F0120_V0.12.4\Device\MM32F0120\Source\KEIL_StartAsm”路径下文件全选复制到Start文件夹(复制KEIL软件芯片.S启动文件)。
4-3.将” LibSamples_MM32F0120_V0.12.4\Device\MM32F0120\Source” 路径下“system_mm32f0120.c”文件全选复制到Start文件夹(复制KEIL软件芯片.C文件)。
4-4.将” LibSamples_MM32F0120_V0.12.4\Device\CMSIS\Core\Include” 路径下文件全选复制到Start文件夹(复制芯片内核文件)。
5.打开KEIL,并且新建一个工程,需要将工程建立在刚刚新建的文件夹中,工程名和文件夹名一致。,选择芯片时选择“MM32F0121C6PV”再点击OK。
6.点开“option for Target”,在Target中把编译器改成5,并勾选“Use MicroLIB”;在C/C++中的Define中加入“USE_STDPERIPH_DRIVER”这句话,不加默认使用寄存器开发,我们用固件库开发必须加上这句话!!在Debug中将调试器改为DAP-LINK,并勾选复位后运行再点击OK即可。
7.再次点开 “option for Target”,在include pats中添加上刚刚新建几个文件夹的路径,并点击OK即可。
8.点开 “Manage Projects Items”,在Groups里新建刚刚新建几个文件夹的组,并将组内文件添加进去,我们会在UESR文件夹及路径新建并且将main.c文件添加。
9.测试 将我写的测试代码copy进main.c文件,可以编译后烧录,检查烧录后板子上蓝灯是否闪烁。若出现闪烁则代表你的第一个MM32模板工程建立成功了!

三、 板卡的一些小建议
这一段是我使用了一些开发板之后的一些建议鉴于本人软件水平稀烂,我就想从这个板卡的硬件上点评几句,如果MM32的官方工程师可以看见的话,这里就简单的“班门弄斧”一下,仅仅个人观点可供后续板卡的参考。
1.板子上的GPIO都得到了引出,板卡性能也很强大,外设和板载资源看来也是一个标准甚至高配的板卡设计,我觉得,如果可以像MM32羽毛板一样,设计一个可以将MM32-LINK引出给其它芯片烧录的调试器接口会更好一些,可以不用设计掰断槽,但预留引出条件的那种;板卡上核心部分到烧录器及外设资源间使用了非常小的0欧姆电阻间隔开,这里我觉得可以把电阻封装换成烙铁可以操作的0603封装,以方便我们这些业余爱好者可以轻松将各级电路间断开。

2.板卡如果是对标ST公司的芯片的话,我觉得可以把板卡设计成类似Nucleo的板卡样式,又或者在后期专门为这块板卡设计一些扩展板,以更加方便用户可以快速完成验证及使用。如果这个板卡有迭代的话,建议板子上配备一组Arduino UNO接口,毕竟这种接口可以适配的盾板更多,可以让MM32这个芯片更好被开发者使用。
文章的最后,感谢ICEASY商城及MM32灵动公司,可以给我提供这次测评机会,我也会在接下来使用这块板卡做一些有意思的小项目,同时,祝各位同志春节快乐!新的一年,调试没有BUG,试车编译全通过!
附录:MM32点灯用代码块
#include "mm32_device.h"
#include <stdio.h>
#include "hal_conf.h" //包含必备头文件
volatile uint32_t PLATFORM_DelayTick;
/* Exported functions *************************************************************************************************/
void PLATFORM_InitDelay(void);
void PLATFORM_DelayMS(uint32_t Millisecond);
void PLATFORM_InitLED(void);
void SysTick_Handler(void);
void PLATFORM_InitDelay(void)//延时
初始化(SysTick定时器)
{
RCC_ClocksTypeDef RCC_Clocks;
RCC_GetClocksFreq(&RCC_Clocks);
if (SysTick_Config(RCC_Clocks.HCLK_Frequency / 1000))
{
while (1)
{
}
}
NVIC_SetPriority(SysTick_IRQn, 0x0);
}
void PLATFORM_DelayMS(uint32_t Millisecond)
{
PLATFORM_DelayTick = Millisecond;
while (0 != PLATFORM_DelayTick)
{
}
}
void SysTick_Handler(void)
{
if (0 != PLATFORM_DelayTick)
{
PLATFORM_DelayTick--;
}
}
void PLATFORM_InitLED(void)//初始化板载LED灯
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOB, ENABLE);
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStruct);
RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOC, ENABLE);
GPIO_WriteBit(GPIOB, GPIO_Pin_15, Bit_SET);
GPIO_WriteBit(GPIOB, GPIO_Pin_14, Bit_SET);
}
int main(void) { //主函数
PLATFORM_InitDelay();
PLATFORM_InitLED();
while(1){
GPIO_WriteBit(GPIOB, GPIO_Pin_14, Bit_RESET);
GPIO_WriteBit(GPIOB, GPIO_Pin_15, Bit_SET);
PLATFORM_DelayMS(500);
GPIO_WriteBit(GPIOB, GPIO_Pin_14, Bit_SET);
GPIO_WriteBit(GPIOB, GPIO_Pin_15, Bit_RESET);
PLATFORM_DelayMS(500);
}
}
