打印
[牛人杂谈]

GPIO使用注意事项

[复制链接]
3107|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
新唐所有的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的供电电压可以不同,在使用时一定要注意。

沙发
xixi2017|  楼主 | 2017-4-16 20:38 | 只看该作者
Ø  NUC472和 NUC442Vbat 负责 PG.14、PG.15、PA.0 和 PA.1,这些脚由 Vbat 负责供电,所以
Vbat一定要有电,即使不接电池也要和 VDD接到一起。另外 PG.14和 PG.15默认为晶振功能用于外接 32K晶振,如果想改为 GPIO需要修改 Configarea。我们一般用 ICPtool 修改 Configarea,因为 Configarea 修改之后需要复位才能起做用。用 USB线将 Nu-Link和目标板接到 PC上,打开 ICPtool,连接到目标板。点击 Settings,然后如红色框所示,将”Workas GPIO”打钩
之后打勾 Config,点击 Start 就修改成功了


使用特权

评论回复
板凳
xixi2017|  楼主 | 2017-4-16 20:39 | 只看该作者
Ø  M451有 Vbat、VDDIO 和 VDD 共 3 个 power domain。Vbat 负责 PF0 ~ PF2,VDDIO 负责
PE.8 ~ PE.13
并且 Vbat VDD 以及 VDDIO 3 个电压可以不同,例如:VDD 5V VDDIO 可以给 3VVbat 可以给 3.6V,这可以用于板子上有多个电压的情况。


使用特权

评论回复
地板
xixi2017|  楼主 | 2017-4-16 20:40 | 只看该作者
NUC472 Power Domain详细资料如下图:

使用特权

评论回复
5
xixi2017|  楼主 | 2017-4-16 20:42 | 只看该作者
M451 Power Domain详细资料如下图:

上面的红框是VBAT的范围,右边的红框是VDDIO的范围。

使用特权

评论回复
6
xixi2017|  楼主 | 2017-4-16 20:43 | 只看该作者
下面介绍一下IO的初始化,IO初始化无非就是将IO设为输入/输出/开漏/准双向等模式,然后反转
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. \n");

    } else {
        /* 不期望的其它中断 */
        PA->ISRC = PA->ISRC;
        PB->ISRC = PB->ISRC;         PC->ISRC = PC->ISRC;         printf("Un-expected interrupts. \n");
    }
}  void GPDEF_IRQHandler(void)
{
    /*检查是否发生PE.2 中断*/
    if (PE->ISRC & BIT2) {
        PE->ISRC = BIT2;         PD0 = PD0 ^ 1;         printf("PE.2 INT occurred. \n");
    } else {
        /* 不期望的其它中断 */
        PD->ISRC = PD->ISRC;
        PE->ISRC = PE->ISRC;         PF->ISRC = PF->ISRC;         printf("Un-expected interrupts. \n");
    } } void EINT0_IRQHandler(void)
{
    /* 清除 PA.2中断标志 */
    PA->ISRC = BIT2;
    PD0 = PD0 ^ 1;/*反转PD.0*/     printf("PA.2 EINT0 occurred. \n");
}


使用特权

评论回复
7
xixi2017|  楼主 | 2017-4-16 20:44 | 只看该作者
GPIO IP有个寄存器叫OFFD(OFF Digital),关闭相应管脚的数字通路的意思。如果某个管脚配置为模拟功能,例如:ADC、DAC、ACMP、SEG、COM、DH1、DH2、V1、V2、V3等功能,这些管脚对应的OFFD bit应该使能,关闭到数字区域的通路,避免内部数字器件不停的打开、关闭而漏电。

使用特权

评论回复
8
稳稳の幸福| | 2017-4-16 22:04 | 只看该作者
EINT0和EINT这种从51继承过来的中断是独立的, 不需要与别的端口共享中断入口,是最快的IO中断。

使用特权

评论回复
9
zhuomuniao110| | 2017-4-16 23:13 | 只看该作者
找了好久的欠压复位终于找到设置的地方了。。。。

使用特权

评论回复
10
q1120847309| | 2017-4-17 14:48 | 只看该作者
年会活动的策划方式虽是完美的现场布置和氛围烘托,可是,更重要的则是年会活动现场的一切管理事项要安排到位,才可以保证庆典活动有条不紊的举办。比如,周年庆典活动现场的乐队管理,警卫人员管理,礼仪团队的管理和安排,支持人的邀请,媒体到位,以及节目彩排等等。大家可以来看看3w.nianhuich.com/[/url]。

使用特权

评论回复
11
文少涂| | 2017-4-17 16:53 | 只看该作者
感觉全部都好专业,能带带我么,

使用特权

评论回复
12
huangcunxiake| | 2017-4-17 17:04 | 只看该作者
GPIO讲解的好专业,第一次这么专业的看明白这个还有这么设置的。

使用特权

评论回复
13
huangcunxiake| | 2017-4-17 17:05 | 只看该作者
原来一些管脚不是在代码里设置的,难怪怎么弄都不对,谢谢楼主分享。

使用特权

评论回复
14
zhuomuniao110| | 2017-4-18 00:02 | 只看该作者
I2C不想外部加上拉电阻的情况,就是IIC的时候不需要上拉?

使用特权

评论回复
15
ljp123gl| | 2018-10-22 14:50 | 只看该作者
“每个IO内部一般都带内部上拉电阻,软件可以打开。”如何打开IO内部上拉电阻呢?
UART的RX脚是否可以打开内部上拉电阻?

使用特权

评论回复
16
xixi2017|  楼主 | 2018-10-29 17:38 | 只看该作者
ljp123gl 发表于 2018-10-22 14:50
“每个IO内部一般都带内部上拉电阻,软件可以打开。”如何打开IO内部上拉电阻呢?
UART的RX脚是否可以打开 ...

你配置成UART模式就行了,其他的该配置的就自动搞的。

使用特权

评论回复
17
eyu66| | 2019-10-25 14:35 | 只看该作者
xixi2017 发表于 2017-4-16 20:38
Ø  NUC472和 NUC442Vbat 负责 PG.14、PG.15、PA.0 和 PA.1,这些脚由 Vbat 负责供电,所以Vbat一定要有电 ...

请问用ICP修改配置后(比如晶振脚用做PGIO),是一直有效还是断电重启就会恢复默认值?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

132

主题

1791

帖子

1

粉丝