• M0 M4之GPIO初始化


    新唐所有的M0/M4芯片基本上所有的IO都可以发生中断,为了符合大家的习惯还是有所谓的外部中断EINT0和EINT1。有2跟GPIO脚可以配置为EINT0功能和EINT1功能,分别将发生EINT0中断和EINT1中断。其它的IO脚也会导致发生中断,但是为很多IO共用一个向量的方式,例如:PA/PB/PC共用中断号4,PD/PE/PF共用中断号5。
    每个IO内部一般都带内部上拉电阻,软件可以打开。一般用于按键,或者I2C不想外部加上拉电阻的情况。
    每个IO都有边沿中断消抖功能,一般用作按键的时候或者外部输入信号会抖动的情况下需要打开。
    NUC472/NUC442和M451的IO比较特别,它们有多个Power Domain,就是所有的IO的供电电压可以不同,在使用时一定要注意。

     NUC472和NUC442 Vbat负责PG.14、PG.15、PA.0和PA.1,这些脚由Vbat负责供电,所以Vbat一定要有电,即使不接电池也要和VDD接到一起。另外PG.14和PG.15默认为晶振功能用于外接32K晶振,如果想改为GPIO需要修改Config area。我们一般用ICP tool修改Config area,因为Config area修改之后需要复位才能起做用。用USB线将Nu-Link和目标板接到PC上,打开ICP tool,连接到目标板。点击Settings,然后如红色框所示,将”Work as GPIO” 打勾

    之后打勾Config,点击Start就修改成功了

    M451有Vbat、VDDIO和VDD 共3个power domain。Vbat负责PF0 ~ PF2,VDDIO负责PE.8 ~ PE.13
    并且Vbat和VDD以及VDDIO 这3个电压可以不同,例如:VDD给5V, VDDIO可以给3V,Vbat可以给3.6V,这可以用于板子上有多个电压的情况。
    NUC472 Power Domain详细资料如下图:

    M451 Power Domain详细资料如下图:

    下面介绍一下IO的初始化,IO初始化无非就是将IO设为输入/输出/开漏/准双向等模式,然后toggle IO,或者读IO的状态。另外也可能配置中断。

    Void GPIO_Init() {
     /* PB.0 配置为输出,PD.4 配置为输入模式 */
     GPIO_SetMode(PB, BIT0, GPIO_PMD_OUTPUT); 
    GPIO_SetMode(PD, BIT4, GPIO_PMD_INPUT);
     /* PD.0 配置为输出*/ 
    GPIO_SetMode(PD, BIT0, GPIO_PMD_OUTPUT); 
    /*从PB0输出0*/ 
    PB0 = 0;
     /* 将 PB5 配置为输入模式并使能上升沿中断 */ 
    GPIO_SetMode(PB, BIT5, GPIO_PMD_INPUT); 
    GPIO_EnableInt(PB, 5, GPIO_INT_RISING); NVIC_EnableIRQ(GPABC_IRQn);
    /* 将 PE2 配置为输入模式,打开内部上拉,并使能下降沿中断 */ GPIO_SetMode(PE, BIT2, GPIO_PMD_INPUT); GPIO_ENABLE_PULL_UP(PE, BIT2);
     GPIO_EnableInt(PE, 2, GPIO_INT_FALLING); NVIC_EnableIRQ(GPDEF_IRQn);
     /* 将 PA2 配置为 EINT0 引脚,并使能下降沿中断 */
     SYS->PA_L_MFP = (SYS->PA_L_MFP & ~ SYS_PA_L_MFP_PA2_MFP_Msk) | SYS_PA_L_MFP_PA2_MFP_EINT0; GPIO_SetMode(PA, BIT2, GPIO_PMD_INPUT); 
    GPIO_EnableEINT0(PA, 2, GPIO_INT_FALLING); NVIC_EnableIRQ(EINT0_IRQn); 
    /* 使能消抖功能并选择消抖采样周期。因为PB.5和PE.2以及PA.2都使能了中断,所以最好打开消抖功能 */ GPIO_SET_DEBOUNCE_TIME(GPIO_DBCLKSRC_HCLK, GPIO_DBCLKSEL_1);
    GPIO_ENABLE_DEBOUNCE(PB, BIT5); 
    GPIO_ENABLE_DEBOUNCE(PE, BIT2); 
    GPIO_ENABLE_DEBOUNCE(PA, BIT2); }
    void GPABC_IRQHandler(void) { 
    /* 检查是否发生PB.5 中断 */ 
    if (PB->ISRC & BIT5) { 
    PB->ISRC = BIT5;
    /*清除PB.5中断标志*/
     PD0 = PD0 ^ 1;
     printf("PB.5 INT occurred. 
    "); 
    } 
    else { 
    /* 不期望的其它中断 */ 
    A->ISRC = PA->ISRC; 
    PB->ISRC = PB->ISRC; 
    PC->ISRC = PC->ISRC; 
    printf("Un-expected interrupts. 
    ");
     }
     }
    void GPDEF_IRQHandler(void) {
     /*检查是否发生PE.2 中断*/
     if (PE->ISRC & BIT2) { 
    PE->ISRC = BIT2; 
    PD0 = PD0 ^ 1;
    printf("PE.2 INT occurred. 
    "); 
    } 
    else {
    /* 不期望的其它中断 */ 
    PD->ISRC = PD->ISRC; 
    PE->ISRC = PE->ISRC; 
    PF->ISRC = PF->ISRC; 
    printf("Un-expected interrupts. 
    ");
    } 
    } 
    void EINT0_IRQHandler(void) {
     /* 清除 PA.2中断标志 */ 
    PA->ISRC = BIT2;
     PD0 = PD0 ^ 1;
    /*反转PD.0*/ 
    printf("PA.2 EINT0 occurred. 
    "); 
    }

    GPIO IP有个寄存器叫OFFD(OFF Digital),关闭相应管脚的数字通路的意思。如果某个管脚配置为模拟功能,例如:ADC、DAC、ACMP、SEG、COM、DH1、DH2、V1、V2、V3等功能,这些管脚对应的OFFD bit应该使能,关闭到数字区域的通路,避免内部数字器件不停的打开、关闭而漏电。

  • 相关阅读:
    VUE 网页端改成桌面端(Electron)
    GitHub 的使用(用Git完成代码提交)
    Entity Framework Code Firest 连接Sqlserver数据库(增删改查)
    C# 微信小程序支付(ASP.NET Core WebApi )
    Entity Framework Code Firest 连接Postgresql数据库
    ASP.NET Core 实现 MQTT通讯协议 Demo(开源库:MQTTnet)
    ASP.NET Core WebApi + EF Core(实现增删改查,使用Swagger测试API)
    Redis不同数据类型的的数据结构实现
    C#通过Redis实现分布式锁
    网络爬虫基本原理(一)
  • 原文地址:https://www.cnblogs.com/zhugeanran/p/8677560.html
Copyright © 2020-2023  润新知