• 基于N32G45的按键驱动


    基于N32G45的按键驱动

    1.N32G45简介

      N32G45系列集成了最新一代嵌入式ARM Cortex™-M4F处理器,在Cortex™-M3内核的基础上强化了运算能力、新增加了浮点运算处理单元(FPU)、DSP和并行计算指令,提供1.25DMIPS/MHz的优异性能。同时其高效的信号处理能力与Cortex-M系列处理器的低功耗,低成本和易于使用的优点组合,用以满足需要控制和信号处理混合能力且易于使用的应用场景。
      ARM Cortex™-M4F 32位精简指令集处理器具有优异的代码效率,通常采用8位和16位器件的存储器空间即可发挥ARM内核的高性能。

    2.N32外设功能

      高达 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)
      在这里插入图片描述

    3.N32命名规则

    在这里插入图片描述

    3.基于N32G457VEL7开发板介绍

      N32G45XVL-STB 开发板用于国民技术股份有限公司高性能 32 位 N32G45XVL 系列芯片的样片开发。基于ARM架构的Cortex-M4F内核,时钟频率为144MHZ,存储空间flash大小为512KB,运行空间Sram大小为144KB
      支持串口下载,Jlink下载仿真、USB下载以及CMSIS-DAP下载仿真。板子本身自带CMSIS-DAP接口电路。
    在这里插入图片描述

    • 开发板原理图如下
      在这里插入图片描述

    4.基于N32G45的按键操作

      关于N32G45的工程创建可查看帖子: https://bbs.elecfans.com/jishu_2320004_1_1.html
      1.要实现按键驱动可分为三个步骤:1.开时钟;2配置GPIO口;3.上下拉。
      接下来,我们先看下按键的硬件接口,原理图如下:
    在这里插入图片描述
      根据原理图可知,按键的硬件接口为:
        S1 —PA4
        S2 —PA5
        S3 —PA6
       有了硬件接口,我们即可按照3步操作即可。

    • 开时钟
         要开启时钟,我们可以先看下N32G45的系统构架,系统构架框图如下:
      在这里插入图片描述
        根据系统构架框图可以看出,整个内核结构分为三条总线:AHB、APB2、APB1。其中AHB总线时钟频率为144MHZ,APB2上时钟总线为72MHZ、APB1上时钟总线为36MHZ。根据按键原理图,我们只需要开启PA时钟即可。
      在这里插入图片描述
    /*1.开时钟*/
    RCC->APB2PCLKEN|=1<<2;//PA
    
    • 1
    • 2
    • 配置GPIO口

      对应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口配置如下:
      /*配置GPIO口*/
      GPIOA->PL_CFG&=0xF000FFFF;
      GPIOA->PL_CFG|=0x08880000;//上拉/下拉输入模式
    
    • 1
    • 2
    • 3

    注意:由于按键是做检测,判断按键是否按下,所以按键模式配置需要设置为输入模式。

    • 上下拉

      上下拉操作,即设置初始化的电平状态。可通过GPIO_POD或者GPIO_PBSC实现。
      根据按键硬件原理图,按键按下为低电平,要想正常检测到按键是否按下,则需要产生一个由高电平到低电平的跳变过程,因此按键需要设置为上拉模式
    在这里插入图片描述

      GPIOA->POD|=0x7<<4;//上拉,将PA4~PA6设置为高电平
    
    • 1

    4.1 按键检测

      为方便后续按键使用,我们可以单独封装一个按键检测函数,通过返回值确定哪个按键按下。

    /***************检测按键函数*************
    **硬件接口: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;//没有按键按下
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    4.2 按键控制LED灯

      通过任意一个按键,实现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;
        }
      }    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 实现效果如下:

      按下按键所有的LED点亮,再按一次按键所有的LED熄灭。
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    使用synchronized 加锁你加对了么?
    YOLOv5量化调优
    第07章 循环神经网络
    linux下Qt的pro文件
    课程表系列
    梳理RWKV 4,5(Eagle),6(Finch)架构的区别以及个人理解和建议
    刷新AI作图速度,最快的开源Stable Diffusion出炉
    php单独使用laravel数据库
    10年经验测试经理跳槽,5面成功拿下大厂 P7 Offer,真是麻雀啄了牛屁股,雀氏牛皮呀
    spring 事务源码剖析
  • 原文地址:https://blog.csdn.net/weixin_44453694/article/details/128169616