1.N32G45简介
N32G45系列集成了最新一代嵌入式ARM Cortex™-M4F处理器,在Cortex™-M3内核的基础上强化了运算能力、新增加了浮点运算处理单元(FPU)、DSP和并行计算指令,提供1.25DMIPS/MHz的优异性能。同时其高效的信号处理能力与Cortex-M系列处理器的低功耗,低成本和易于使用的优点组合,用以满足需要控制和信号处理混合能力且易于使用的应用场景。
ARM Cortex™-M4F 32位精简指令集处理器具有优异的代码效率,通常采用8位和16位器件的存储器空间即可发挥ARM内核的高性能。
=注:Cortex™-M4F向下兼容Cortex-M3代码。=
-
高达 512KByte 片内 Flash,支持加密存储、多用户分区管理及数据保护,支持硬件 ECC 校验,10万次擦写次数,10 年数据保持。
-
144KByte 片内 SRAM(包含 16KByte Retention RAM),Retention RAM 支持硬件奇偶校验。
通讯接口 ― 7 个 U(S)ART 接口, 最高速率达 4.5 Mbps,其中 3 个 USART 接口(支持 1xISO7816,1xIrDA, LIN),4 个 UART 接口
― 3 个 SPI 接口,速度高达 36 MHz,其中 2 个支持 I2S
― 1 个 QSPI 接口,速率高达 144 Mbps
― 4 个 I2C 接口,速率高达 1 MHz,主从模式可配,从机模式下支持双地址响应
― 1 个 USB2.0 Full speed Device 接口
― 2 个 CAN 2.0A/B 总线接口
― 1 个 SDIO 接口,支持 SD/MMC 格式
-
ADC模拟接口
――――2 个 12bit 5Msps 高速 ADC,多种精度可配置,6bit 模式下采样率高达 9Msps,多达 18 路外部单端输入通道,支持差分模式
――2 个 12bit DAC,采样率 1Msps
――支持外部输入独立参考电压源
――所有模拟接口支持 1.8~3.6V 全电压工作
-
最大支持 97 个支持复用功能的 GPIOs,大多数 GPIO 支持 5V 耐压.
-
2个高速 DMA 控制器,每个控制器支持 8 通道,通道源地址及目的地址任意可配
-
RTC 实时时钟,支持闰年万年历,闹钟事件,周期性唤醒,支持内外部时钟校准
-
定时计数器
――2 个 16bit 高级定时计数器,支持输入捕获、输出比较、PWM 输出以及正交编码输入等功能,最高控制精度 6.9nS。每个定时器有 4 个独立的通道,其中 3 个通道支持 6 路互补 PWM 输出
――4 个 16bit 通用定时计数器, 每个定时器有 4 个独立通道,支持输入捕获/输出比较/PWM 输出
――2 个 16bit 基础定时计数器
――1x 24bit SysTick
――1x 7bit 窗口看门狗(WWDG)
――1x 12bit 独立看门狗( IWDG)
1.2 N32命名规则
2.基于N32G457VEL7开发板介绍
N32G45XVL-STB 开发板用于国民技术股份有限公司高性能 32 位 N32G45XVL 系列芯片的样片开发。基于ARM架构的Cortex-M4F内核,时钟频率为144MHZ,存储空间flash大小为512KB,运行空间Sram大小为144KB。
支持串口下载,Jlink下载仿真、USB下载以及CMSIS-DAP下载仿真。板子本身自带CMSIS-DAP接口电路。
-
开发板原理图如下
3.基于N32G45工程搭建
1.若想要搭建N32G45开发板工程,则需要下载一份芯片匹配的固件库,相关资料可自行到国名科技官网下载,这里则不展开说明,相关资料包可在文章最后链接获取。
2.双击pack包安装KEIL需要的芯片库,安装成功即可在KEIL下进行开发。
3.创建工程目录,在固件库中拷贝必要的依赖文件到CORE目录下。
4.打开KEIL软件,选择新建工程,选择芯片型号为N32G457VEL7。
5.创建分组,将添加的依赖文件加入到分组中。
6.添加头文件路径。
7.创建工程入口函数main.c,添加以下代码。
#include "n32g45x.h"
int main()
{
while(1);
}
8.编译工程,查看工程是否创建成功,若提示信息如下则便是工程创建成功。至此,一个新的工程创建到此结束。
4.LED驱动
1.实现LED驱动可分为三个步骤:1.开时钟;2配置GPIO口;3.上下拉。
要开启时钟,我们可以先看下N32G45的系统构架,系统构架框图如下:
根据系统构架框图可以看出,整个内核结构分为三条总线:AHB、APB2、APB1。其中AHB总线时钟频率为144MHZ,APB2上时钟总线为72MHZ、APB1上时钟总线为36MHZ。我们需要完成LED灯的驱动,就时钟找到LED的时钟接口,开启相应的时钟源。
接下来,我们需要参考开发板原理图,找到LED灯接CPU的那个硬件接口上。LED硬件原理图如下:
根据原理图我们可以看出D1对应的硬件接口为PA8,D2对应的硬件接口为PB4,D3的硬件接口为PB5。因此我们需要开启的时钟为GPIOA和GPIOB。
相应的时钟接口寄存器如下:
根据用户手册可以看到,PA和PB时钟在PAB2CLKEN的第二位和第三位上,配置如下:
RCC->APB2PCLKEN|=1<<2;
RCC->APB2PCLKEN|=1<<3;
对应GPIO端口配置,我们需要参考用户手册的第7章节。
GPIO( General purpose input/output) 即通用型 I/O, AFIO( Alternate-function input/output) 即复用功能 I/O。芯片最多支持 97 个 GPIO,共被分为 7 组(GPIOA/GPIOB/GPIOC/GPIOD/GPIOE/GPIOF/GPIOG),每组 16个端口( F 组共 10 个, G 组共 7 个)。 GPIO 端口和其他的复用外设共用引脚,用户可以根据需求灵活配置。每个 GPIO 引脚都可以独立配置成输出、输入或复用的外设功能端口。除了模拟功能引脚外,其他的 GPIO引脚都有大电流通过能力。
GPIO 端口可由软件分别配置成以下模式:
■ 输入浮空
■ 输入上拉
■ 输入下拉
■ 模拟功能
■ 开漏输出
■ 推挽输出
■ 推挽复用功能
■ 开漏复用功能
对应LED灯,我们需要配置的模式为推挽输出。
端口模式配置寄存器:
PA8,PB4,PB5配置如下:
AFIO->RMP_CFG&=~(0x7<<24);
AFIO->RMP_CFG|=1<<24;
GPIOA->PH_CFG&=0xFFFFFFF0;
GPIOA->PH_CFG|=0x00000003;
GPIOB->PL_CFG&=0xFF00FFFF;
GPIOB->PL_CFG|=0x00330000;
注意:由于PB4默认是用于SWD接口,若需要用着普通IO使用,则需要开启AFIO时钟,设置PB4为普通IO。
配置代码如下:
AFIO->RMP_CFG&=~(0x7<<24);
AFIO->RMP_CFG|=1<<24;//将PB4设置为普通IO
- 上下拉
上下拉操作,即设置初始化的电平状态。可通过GPIO_POD或者GPIO_PBSC实现。
GPIO_POD寄存器如下:
GPIO_PBSC寄存器如下:
当然,也可以使用位带操作实现。本例程将以位带操作方式实现上下拉,相关资料可参考Cortex-M4权威指南,这里则不展开叙述。实现如下:
#define BITBAND(addr,bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr) *((volatile unsigned long *) (addr))
#define GPIOA_ODR_ADDR (0x40010800+0x0C)
#define GPIOA_IDR_ADDR (0x40010800+0x08)
#define GPIOB_ODR_ADDR (0x40010C00+0x0C)
#define GPIOB_IDR_ADDR (0x40010C00+0x08)
#define PAout(x) MEM_ADDR(BITBAND(GPIOA_ODR_ADDR,x))
#define PAin(x) MEM_ADDR(BITBAND(GPIOA_IDR_ADDR,x))
#define PBout(x) MEM_ADDR(BITBAND(GPIOB_ODR_ADDR,x))
#define PBin(x) MEM_ADDR(BITBAND(GPIOB_IDR_ADDR,x))
#define LED_D1 PAout(8)
#define LED_D2 PBout(4)
#define LED_D3 PBout(5)
LED整体配置代码如下:
void LED_Init(void)
{
RCC->APB2PCLKEN|=1<<2;
RCC->APB2PCLKEN|=1<<3;
RCC->APB2PCLKEN|=1<<0;
AFIO->RMP_CFG&=~(0x7<<24);
AFIO->RMP_CFG|=1<<24;
GPIOA->PH_CFG&=0xFFFFFFF0;
GPIOA->PH_CFG|=0x00000003;
GPIOB->PL_CFG&=0xFF00FFFF;
GPIOB->PL_CFG|=0x00330000;
LED_D1=0;
LED_D2=0;
LED_D3=0;
}
最后,实现500ms完成LED闪烁一次,代码实现如下:
#include "n32g45x.h"
#include "led.h"
#include "delay.h"
int main()
{
LED_Init();
while(1)
{
LED_D1=!LED_D1;
LED_D2=!LED_D2;
LED_D3=!LED_D3;
Delay_Ms(1000);
}
}
运行效果: