灵动微FTHR-G0001开箱+Keil5环境搭建+点灯测试
玩家有话说:本次评测产品为灵动微电子FTHR-G0001单片机开发板,一块从iCEasy商城申请的样品开发板,主控MM32G0001,板载CMSIS-DAP下载器,可以直接连接Type-C线下载和调试。详细介绍:上海灵动微电子股份有限公司 (mindmotion.com.cn)
环境搭建
前期准备
安装Keil5 MDK
(这个不用特地教了吧~)
安装MM32G0001的Pack
下载地址:上海灵动微电子股份有限公司 (mindmotion.com.cn)
解压后找到MM32G0001的Pack,双击即可安装
下载官方提供的范例包
下载地址:上海灵动微电子股份有限公司 (mindmotion.com.cn)
我们主要需要其中的库函数
环境正式搭建
整个步骤大致可分为:
- 新建工程
- 复制库函数及启动文件
- 添加源码文件到工程、添加头文件到Path、设置宏定义
- 选择并设置CMSIS-DAP下载器
新建工程前新建一个文件夹,我选择叫_Template_Project的文件夹,这样该工程可以作为模板,以后直接复用
打开Keil5,新建一个Project,位置就是刚才新建的文件夹内,名称随便叫,我选择就叫Project(项目路径及文件尽量不要用中文)
新建完毕后会让你选择芯片的开发包,先前已经安装过,这里选择我们需要的MM32G0001系列的即可
接下来的软件组件界面,这里可以勾选CMSIS的CORE也可以不勾选,因为官方提供的范例包中也提供了CMSIS文件,如果在这里不勾选的话,后面需要手动添加。
打开之前下载的范例包,将里面的Device文件夹复制到项目根目录下
再在项目目录下新建一个User文件夹,这里将来存放我们的程序代码(main.c等)
回到Keil5。为方便管理代码,我选择新建三个组:
- User:存放程序代码
- HAL:存放HAL库的代码
- Startup:存放MM32G0001启动文件等
然后将Device文件夹下的文件依次加入到对应的组中:
- 将_Template_Project\Device\MM32G0001\HAL_Lib内的所有文件加入到HAL组中
- 将_Template_Project\Device\MM32G0001\Source\KEIL_StartAsm下的startup_mm32g0001_keil.s加入到Startup组
- 将_Template_Project\Device\MM32G0001\Source下的system_mm32g0001.c加入到Startup组
接下来就是编写main函数了,我为了方便直接复制了范例包中GPIO/GPIO_LED_Toggle下的所有程序文件,你也可以自行编写。主要是范例程序已经提供好了mm32g0001_it和platform文件,即中断函数定义和一些开发板初始化函数(例如延迟函数等),省去了我们自己编写的时间。
将GPIO/GPIO_LED_Toggle根目录下的所有.c和.h文件复制到User目录下,然后回到Keil5,将这些文件加入到User组中。
整个项目的目录最后大致的结构是这样的
添加所有头文件及宏定义,如下图所示:
我们需要加入USE_STDPERIPH_DRIVER宏定义(步骤②),并将Device目录下及User目录下的所有包含.h文件的目录均加入Path中(步骤��)
切换到Debug选项卡,将下载器选为CMSIS-DAP,进入Setting界面,进入Flash Download选项卡,勾选Reset and Run(这样下载完程序后可以自动复位,运行程序)
点灯测试
如果前面的环境搭建没有问题的话,此处点击编译按钮即可正常编译。
但是如果直接下载程序会发现开发板没有任何反应,因为板载LED对应的GPIO是PA11,官方提供的GPIO_LED_Toggle源码并没有初始化该GPIO,所以修改一下代码gpio_led_toggle.c即可。
编译并下载即可看到板载LED开始闪烁
以下是修改后并精简的代码:
#define _GPIO_LED_TOGGLE_C_
#include <stdio.h>
#include "platform.h"
#include "gpio_led_toggle.h"
void GPIO_Condiv(void){
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE);
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_WriteBit(GPIOA, GPIO_Pin_11, Bit_SET);
}
void GPIO_IO_Toggle(GPIO_TypeDef *GPIOn, uint16_t PINn){
if (Bit_RESET == GPIO_ReadOutputDataBit(GPIOn, PINn))
{
GPIO_SetBits(GPIOn, PINn);
}
else
{
GPIO_ResetBits(GPIOn, PINn);
}
}
void GPIO_LED_Toggle_Sample(void){
GPIO_Condiv();
while (1)
{
GPIO_IO_Toggle(GPIOA, GPIO_Pin_11);
PLATFORM_DelayMS(1000);
}
}