N32G45系列集成了最新一代嵌入式ARM Cortex™-M4F处理器,在Cortex™-M3内核的基础上强化了运算能力、新增加了浮点运算处理单元(FPU)、DSP和并行计算指令,提供1.25DMIPS/MHz的优异性能。同时其高效的信号处理能力与Cortex-M系列处理器的低功耗,低成本和易于使用的优点组合,用以满足需要控制和信号处理混合能力且易于使用的应用场景。
ARM Cortex™-M4F 32位精简指令集处理器具有优异的代码效率,通常采用8位和16位器件的存储器空间即可发挥ARM内核的高性能。
高达 512KByte 片内 Flash,支持加密存储、多用户分区管理及数据保护,支持硬件 ECC 校验,10万次擦写次数,10 年数据保持。
144KByte 片内 SRAM(包含 16KByte Retention RAM),Retention RAM 支持硬件奇偶校验。
N32G45XVL-STB 开发板用于国民技术股份有限公司高性能 32 位 N32G45XVL 系列芯片的样片开发。基于ARM架构的Cortex-M4F内核,时钟频率为144MHZ,存储空间flash大小为512KB,运行空间Sram大小为144KB。
支持串口下载,Jlink下载仿真、USB下载以及CMSIS-DAP下载仿真。板子本身自带CMSIS-DAP接口电路。
关于N32G45的工程创建可查看帖子: https://bbs.elecfans.com/jishu_2320004_1_1.html
1.要实现按键驱动可分为三个步骤:1.开时钟;2配置GPIO口;3.上下拉。
接下来,我们先看下按键的硬件接口,原理图如下:
根据原理图可知,按键的硬件接口为:
S1 —PA4
S2 —PA5
S3 —PA6
有了硬件接口,我们即可按照3步操作即可。
/*1.开时钟*/
RCC->APB2PCLKEN|=1<<2;//PA
对应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 端口可由软件分别配置成以下模式:
■ 输入浮空
■ 输入上拉
■ 输入下拉
■ 模拟功能
■ 开漏输出
■ 推挽输出
■ 推挽复用功能
■ 开漏复用功能
对应按键,我们需要配置的模式为推挽输出。
端口模式配置寄存器:
/*配置GPIO口*/GPIOA->PL_CFG&=0xF000FFFF;GPIOA->PL_CFG|=0x08880000;//上拉/下拉输入模式
注意:由于按键是做检测,判断按键是否按下,所以按键模式配置需要设置为输入模式。
上下拉操作,即设置初始化的电平状态。可通过GPIO_POD或者GPIO_PBSC实现。
根据按键硬件原理图,按键按下为低电平,要想正常检测到按键是否按下,则需要产生一个由高电平到低电平的跳变过程,因此按键需要设置为上拉模式。
GPIOA->POD|=0x7<<4;//上拉,将PA4~PA6设置为高电平
为方便后续按键使用,我们可以单独封装一个按键检测函数,通过返回值确定哪个按键按下。
/***************检测按键函数*************
**硬件接口:KEY1 --PA0 按下为高电平
** KEY2 --PA1 按下为低电平
** KEY3 --PA4按下为低电平
** KEY4 --PA5按下为低电平
**返回值:KEY1按下 --返回1
** KEY2按下 --返回2
** KEY3按下 --返回3
** KEY4按下 --返回4
**没有按键按下:返回0
**注:该函数一次只能检测一个按键是否按下
**作者:IT_阿水
******************************************/
u8 Key_Scan(void)
{static u8 stat=0;//按键按下标志位if((!KEY1 || !KEY2 || !KEY3) && (stat==0))//是否有按键按下{Delay_Ms(20);//延时消抖stat=1;//表示有按键按下if(KEY1==0)return 1;else if(KEY2==0)return 2;else if(KEY3==0)return 3;}else{if(KEY1 && KEY2 && KEY3 )stat=0;//是否所有按键都松开}return 0;//没有按键按下
}
通过任意一个按键,实现LED的亮灭。
#include "n32g45x.h"
#include "led.h"
#include "key.h"
#include "delay.h"
int main()
{u8 key_val;LED_Init();KEY_Init();while(1){key_val=Key_Scan();if(key_val){LED_D1=!LED_D1;LED_D2=!LED_D2;LED_D3=!LED_D3;}}
}
按下按键所有的LED点亮,再按一次按键所有的LED熄灭。