开发环境:
MDK:Keil 5.30
开发板:N32G4FRML-STB 开发板
MCU:N32G4FRMEL7
1 N32G4FRML-STB开发板简介
笔者使用的开发板是国名技术设计的N32G4FRML-STB 开发板。
N32G4FR 系列采用 32 bit ARM Cortex-M4 内核,最高工作主频144MHz,支持浮点运算及 DSP 指令,内置密码算法硬件加速引擎,集成高达512KB加密Flash 存储器,144KB SRAM,可用于安全存储指纹信息,支持主流的半导体指纹及光学传指纹感器,集成丰富的 U(S)ART、I2C、SPI、QSPI、USB、ADC、DAC,SDIO 等通用外设接口。资源非常丰富。
2 使用 Keil 5 开发 N32
目前市面通用的MDK for ARM版本有Keil 4和Keil 5:使用Keil 4建议安装4.74及以上;使用Keil 5建议安装5.20以上版本。笔者的MDK是5.30。
从MDK的官网可以下载得到MDK的安装包,然后安装即可,关于的MDK安装请看笔者的教程。
MDK安装教程
MDK下载地址
安装完成后会自动打开,我们将其关闭。
接下来我们下载N32G4FR的软件支持包。
下载地址:ftp://58.250.18.138
下载好后双击Nationstech.N32G4FR_DFP.1.0.4.pack运行即可:
点击[Next]即可安装完成。
安装成功后,重新打开Keil,则可以在File->Device Database中出现Gigadevice的下拉选项,点击可以查看到相应的型号。
3 新建N32工程
为了方便起见,这里就使用官方的例程。
开发板资料下载地址:https://www.nationstech.com/zlxz304/
开发板资料目前提供以下例子:
这里笔者就用KEIL5制作一个模板,当然也可以使用功能官方的示例程序。
Step1:新建工程并拷贝文件
新建一个文件夹,再文件夹中新建Listing、Output、Project、Readme、User文件夹。
然后将N32G4FR_Firmware_Library文件夹拷贝到工程目录下,在将GPIO文件夹的LedBlink工程的源文件拷贝到User文件夹下,将readme.txt文件拷贝到Readme文件夹下。
Step2: 新建MDK工程
点击桌面 MDK5图标,启动软件,在工具栏 Project->New μVision Project…新建我们的工程文件,我们将新建的工程文件保存在Project文件夹下,名字可以随便取,点击保存。
Step3: 选择主控芯片
然后弹出芯片选择敞口窗口,我用的主控芯片N32G4FRMEL7,主频144MHz,内部512K Flash,144KB SRAM。按如下选择即可。
Step4: 工程文件添加
点击工程管理按钮。
然后依次添加相应的文件。
Step5: MDK 配置选项
点击‘Options for Target’进行配置。
配置Target。
配置Output。
配置Listing。
接下来添加全局宏定义和头文件包含。
最后尝试编译,编译信息如下:
没有提示错误则编译通过。
4 使用NS-Link开发N32
N32部分开发板自带NS-link,可以用电路板上的NS-link调试仿真代码,不带的可外接NS-link模块,具体操作方法如下。
1.第一次使用NS-link插入电脑后,会自动安装驱动。
在Options for Target -> Debug 中选择“CMSIS-DAP Debugger”,只有Keil 4.74以上的版本和Keil 5才支持CMSIS-DAP Debugger选项。
2.在Options for Target -> Debug ->Settings勾选SWJ、 Port选择 SW。右框IDcode会出现”0xXBAXXXXX”。
3.在Options for Target -> Debug ->Settings -> Flash Download中添加N32的flash算法。
4.单击下图的快捷方式“debug”, 即可使用NS-Link进行仿真。
当然啦,也可使用NS-Link下载程序。
下载程序成功后,打印信息如下:
【main.c】
#include "n32g4fr.h"
#include <stdio.h>
#include <stdint.h>
#define ON 1
#define OFF 0
#define LED1(a) if (a) \
GPIO_SetBits(GPIOA,GPIO_PIN_8);\
else \
GPIO_ResetBits(GPIOA,GPIO_PIN_8)
#define LED2(a) if (a) \
GPIO_SetBits(GPIOB,GPIO_PIN_4);\
else \
GPIO_ResetBits(GPIOB,GPIO_PIN_4)
#define LED3(a) if (a) \
GPIO_SetBits(GPIOB,GPIO_PIN_5);\
else \
GPIO_ResetBits(GPIOB,GPIO_PIN_5)
void Delay(uint32_t xms);
void LED_GPIO_Config(void)
{
GPIO_InitType GPIO_InitStructure;
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA, ENABLE);
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.Pin = GPIO_PIN_8;
GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.Pin = GPIO_PIN_4|GPIO_PIN_5;
GPIO_InitPeripheral(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOA, GPIO_PIN_8);
GPIO_SetBits(GPIOB, GPIO_PIN_4|GPIO_PIN_5);
}
int main(void)
{
LED_GPIO_Config();
while(1)
{
LED1( ON );
Delay(0xffffff);
LED1( OFF );
LED2( ON );
Delay(0xffffff);
LED2( OFF );
LED3( ON );
Delay(0xfffFff);
LED3( OFF );
}
}
void Delay( uint32_t nCount)
{
while(nCount--);
}