搭建MM32的Keil开发环境

使用的单片机信息如下:

MM32F3277G9P

主频:120M

内存:512KB-FLASH128KB-RAM

屯资料

MM32F3270 库函数和例程 获得MM32F3270_Lib_Samples * 1

MM32 KeilPack 获得MM32_KEIL_Pack.zip * 1

搓开发环境

首先安装MM32_KEIL_Pack中的对应单片机的支持包。

新建一个工程文件夹,命名随意,笔者命名为“MM32Demo”。

搭建易于迁移的开发环境,直接用人家文件里面的库作为依赖肯定是不明智的,所以我们自己把需要的库一一复制到工程文件里面:

随便打开一个官方例程,查看它的依赖目录:

image-20220226122351123.png

显然,我们需要的库文件就在HAL_Lib中,还需要KEIL_Core中的文件供Keil使用。此外,读一读剩下文件中的代码就会发现:

  • USER中的文件是主函数;

  • SYSTEM中的文件是一些系统使用所需的函数,如延时和串口调试信息输出;

  • HARDWARE中是一些硬件层的抽象封装,我们并用不上。

在我们的工程文件夹中建立以下几个文件夹:

image-20220226123556216.png

对我们需要的库文件进行移植:

  • .\MM32F3270_Lib_Samples\Device\CMSIS\KEIL_Core中的文件尽数复制到工程文件夹的Core文件夹中;

  • .\MM32F3270_Lib_Samples\Device\MM32F327x\HAL_Lib中的文件夹和隔壁Include文件夹尽数复制到工程文件夹的Driver文件夹中;

    (由于在使用的过程中,发现还有一些寄存器的文件依赖,所以就把寄存器库函数(即“隔壁Include文件夹”)也一并复制了。

  • .\MM32F3270_Lib_Samples\Device\MM32F327x\Source\KEIL_StartAsm中的文件和.\MM32F3270_Lib_Samples\Device\MM32F327x\Source路径下的.c文件复制到Startup文件夹中;

  • 随便打开一个例程工程文件夹中的SYSTEM文件夹,将以下文件夹复制到工程文件夹的System文件夹中:(如有其他需要自行到例程中寻找复制即可

image-20220226124255626.png

接着,在User文件夹下建立main.c和main.h文件,在里面随便写两句代码:

/**
 * @file main.h
 * @author ZheWana
 * @brief global include
 * @date 2022-02-23
 * 
 */
#ifndef MAIN_H
#define MAIN_H

// Files includes
#include <stdio.h>
#include <string.h>

#include "delay.h"
#include "hal_conf.h"
#include "mm32_device.h"
#include "uart.h"

#include "mm32_reg.h"

#endif
/**
 * @file main.c
 * @author ZheWana
 * @brief main function
 * @date 2022-02-23
 * 
 */
#include "main.h"

int main(void)
{
    DELAY_Init();
    CONSOLE_Init(115200);

    while (1) {
        printf("%d\n", RCC_GetSysClockFreq());
        DELAY_Ms(500);
    }
}

至此,文件的移植工作就完成了,接下来开始组织Keil工程。

打开Keil,新建一个工程(New Project):

image-20220226131438523.png

工程名就叫MM32Demo,工程文件路径选择到我们的工程文件夹的MDK文件夹下,接着选择我们单片机的工程配置:

image-20220226131749986.png

点击OK后会跳出运行环境配置,我们并不需要,所以直接选择OK即可。

自己对文件夹进行重命名并新建几个文件夹:

image-20220226132219474.png

最终得到:

image-20220226132240275.png

然后双击想配置的文件夹,向其中添加我们已经移植好的对应的库文件即可。

以Core文件夹为例,双击Core,调节到我们工程文件夹下的Core中,全选文件进行添加,如图:

image-20220226132440197.png

对于有子文件夹的文件夹,将所有子文件夹中的文件全部添加到该文件夹下即可。

接下来添加库包含路径,方法不赘述,结果如图:

image-20220226133338646.png

设置后顺便将编译器改为AC6,将调试器改为DAP-Link,OK即可。

配置完成,编译,下载,可以在电脑的串口调试助手上看到调试输出的内容。

一点小问题

上述配置做完后,编译是完美过的,但是烧录之后却没有该有的现象,难道是官方的串口重定向做的有问题吗?并不是。

省流助手:在设置项中开启 □ Use MicroLib 即可解决问题,以下均为废话。


开启Debug,多次点击运行,直到程序确实在一直运行之后可以看到串口开始有输出了:

image-20220226134028590.png

但是重新下载程序会发现还是没办法正常运行程序,按下reset按键,毫无反应。

调试时发现Reset_Handler中的寄存器跳转所跳转的地址与我们的主函数入口地址并不一致:

image-20220226135511717.png

开始时觉得这就是问题的症结所在,但是发现自己还是太肤浅了,也算是给自己涨涨知识了:

ARM中__main与main的区别

main和__main的区别

所以入口不一样是很正常的。

再次调试,直接手拉到__main函数的地址看看里面的内容:

image-20220226135654443.png

对比了一下官方能跑的__main:

image-20220226141052172.png

发觉我这编译出的代码好像和人家的不太一样,估计是设置项的锅,换了编译器,换了C版本,最后发现官方开了Use MicroLib,于是我也打开。

编译烧录,一切正常。

于是我又查了查MicroLib是何方神圣,看看官方的说法:

image-20220226141652640.png

只能说:涨知识+1,以及MM32只能兼容缺省C库是我没想到的。

上一篇
下一篇