[牛人杂谈] GPIO使用注意事项

[复制链接]
3539|16
 楼主| xixi2017 发表于 2017-4-16 20:34 | 显示全部楼层 |阅读模式
新唐所有的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”打钩
QQ截图20170416203747.png
之后打勾 Config,点击 Start 就修改成功了
QQ截图20170416203823.png


 楼主| 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详细资料如下图:
1111111.png
 楼主| xixi2017 发表于 2017-4-16 20:42 | 显示全部楼层
M451 Power Domain详细资料如下图:
2222.png
上面的红框是VBAT的范围,右边的红框是VDDIO的范围。
 楼主| xixi2017 发表于 2017-4-16 20:43 | 显示全部楼层
下面介绍一下IO的初始化,IO初始化无非就是将IO设为输入/输出/开漏/准双向等模式,然后反转
IO输出,或者读IO的状态。另外也可能配置为中断。
  1. Void GPIO_Init() {
  2. /* PB.0 配置为输出,PD.4 配置为输入模式 */
  3.     GPIO_SetMode(PB, BIT0, GPIO_PMD_OUTPUT);     GPIO_SetMode(PD, BIT4, GPIO_PMD_INPUT);
  4. /* PD.0 配置为输出*/
  5.     GPIO_SetMode(PD, BIT0, GPIO_PMD_OUTPUT);
  6. /*从PB0输出0*/
  7. PB0 = 0;
  8. /* 将 PB5 配置为输入模式并使能上升沿中断 */
  9. GPIO_SetMode(PB, BIT5, GPIO_PMD_INPUT);
  10. GPIO_EnableInt(PB, 5, GPIO_INT_RISING);
  11. NVIC_EnableIRQ(GPABC_IRQn);

  12. /*  将 PE2 配置为输入模式,打开内部上拉,并使能下降沿中断 */
  13. GPIO_SetMode(PE, BIT2, GPIO_PMD_INPUT);
  14. GPIO_ENABLE_PULL_UP(PE, BIT2);
  15. GPIO_EnableInt(PE, 2, GPIO_INT_FALLING);
  16. NVIC_EnableIRQ(GPDEF_IRQn);

  17. /* 将 PA2 配置为 EINT0 引脚,并使能下降沿中断 */
  18. SYS->PA_L_MFP = (SYS->PA_L_MFP & ~ SYS_PA_L_MFP_PA2_MFP_Msk) |
  19. SYS_PA_L_MFP_PA2_MFP_EINT0;
  20. GPIO_SetMode(PA, BIT2, GPIO_PMD_INPUT);
  21. GPIO_EnableEINT0(PA, 2, GPIO_INT_FALLING);
  22. NVIC_EnableIRQ(EINT0_IRQn);
  23. /* 使能消抖功能并选择消抖采样周期。因为PB.5和PE.2以及PA.2都使能了中断,所以最好打开消抖功能 */
  24. GPIO_SET_DEBOUNCE_TIME(GPIO_DBCLKSRC_HCLK, GPIO_DBCLKSEL_1);
  25. GPIO_ENABLE_DEBOUNCE(PB, BIT5);
  26. GPIO_ENABLE_DEBOUNCE(PE, BIT2);
  27. GPIO_ENABLE_DEBOUNCE(PA, BIT2);
  28. } void GPABC_IRQHandler(void)
  29. {
  30.     /* 检查是否发生PB.5 中断 */
  31.     if (PB->ISRC & BIT5) {
  32.         PB->ISRC = BIT5;/*清除PB.5中断标志*/     
  33. PD0 = PD0 ^ 1;
  34.         printf("PB.5 INT occurred. \n");

  35.     } else {
  36.         /* 不期望的其它中断 */
  37.         PA->ISRC = PA->ISRC;
  38.         PB->ISRC = PB->ISRC;         PC->ISRC = PC->ISRC;         printf("Un-expected interrupts. \n");
  39.     }
  40. }  void GPDEF_IRQHandler(void)
  41. {
  42.     /*检查是否发生PE.2 中断*/
  43.     if (PE->ISRC & BIT2) {
  44.         PE->ISRC = BIT2;         PD0 = PD0 ^ 1;         printf("PE.2 INT occurred. \n");
  45.     } else {
  46.         /* 不期望的其它中断 */
  47.         PD->ISRC = PD->ISRC;
  48.         PE->ISRC = PE->ISRC;         PF->ISRC = PF->ISRC;         printf("Un-expected interrupts. \n");
  49.     } } void EINT0_IRQHandler(void)
  50. {
  51.     /* 清除 PA.2中断标志 */
  52.     PA->ISRC = BIT2;
  53.     PD0 = PD0 ^ 1;/*反转PD.0*/     printf("PA.2 EINT0 occurred. \n");
  54. }


 楼主| xixi2017 发表于 2017-4-16 20:44 | 显示全部楼层
GPIO IP有个寄存器叫OFFD(OFF Digital),关闭相应管脚的数字通路的意思。如果某个管脚配置为模拟功能,例如:ADC、DAC、ACMP、SEG、COM、DH1、DH2、V1、V2、V3等功能,这些管脚对应的OFFD bit应该使能,关闭到数字区域的通路,避免内部数字器件不停的打开、关闭而漏电。
稳稳の幸福 发表于 2017-4-16 22:04 | 显示全部楼层
EINT0和EINT这种从51继承过来的中断是独立的, 不需要与别的端口共享中断入口,是最快的IO中断。
zhuomuniao110 发表于 2017-4-16 23:13 | 显示全部楼层
找了好久的欠压复位终于找到设置的地方了。。。。
q1120847309 发表于 2017-4-17 14:48 | 显示全部楼层
年会活动的策划方式虽是完美的现场布置和氛围烘托,可是,更重要的则是年会活动现场的一切管理事项要安排到位,才可以保证庆典活动有条不紊的举办。比如,周年庆典活动现场的乐队管理,警卫人员管理,礼仪团队的管理和安排,支持人的邀请,媒体到位,以及节目彩排等等。大家可以来看看3w.nianhuich.com/[/url]。
文少涂 发表于 2017-4-17 16:53 | 显示全部楼层
感觉全部都好专业,能带带我么,
huangcunxiake 发表于 2017-4-17 17:04 | 显示全部楼层
GPIO讲解的好专业,第一次这么专业的看明白这个还有这么设置的。
huangcunxiake 发表于 2017-4-17 17:05 | 显示全部楼层
原来一些管脚不是在代码里设置的,难怪怎么弄都不对,谢谢楼主分享。
zhuomuniao110 发表于 2017-4-18 00:02 | 显示全部楼层
I2C不想外部加上拉电阻的情况,就是IIC的时候不需要上拉?
ljp123gl 发表于 2018-10-22 14:50 | 显示全部楼层
“每个IO内部一般都带内部上拉电阻,软件可以打开。”如何打开IO内部上拉电阻呢?
UART的RX脚是否可以打开内部上拉电阻?
 楼主| xixi2017 发表于 2018-10-29 17:38 | 显示全部楼层
ljp123gl 发表于 2018-10-22 14:50
“每个IO内部一般都带内部上拉电阻,软件可以打开。”如何打开IO内部上拉电阻呢?
UART的RX脚是否可以打开 ...

你配置成UART模式就行了,其他的该配置的就自动搞的。
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),是一直有效还是断电重启就会恢复默认值?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

145

主题

2034

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部