新唐所有的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 = ;
/* 将 PB5 配置为输入模式并使能上升沿中断 */
GPIO_SetMode(PB, BIT5, GPIO_PMD_INPUT);
GPIO_EnableInt(PB, , GPIO_INT_RISING); NVIC_EnableIRQ(GPABC_IRQn);
/* 将 PE2 配置为输入模式,打开内部上拉,并使能下降沿中断 */ GPIO_SetMode(PE, BIT2, GPIO_PMD_INPUT); GPIO_ENABLE_PULL_UP(PE, BIT2);
GPIO_EnableInt(PE, , 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, , 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 ^ ;
printf("PB.5 INT occurred. \n");
}
else {
/* 不期望的其它中断 */
A->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 ^ ;
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 ^ ;
/*反转PD.0*/
printf("PA.2 EINT0 occurred. \n");
}
GPIO IP有个寄存器叫OFFD(OFF Digital),关闭相应管脚的数字通路的意思。如果某个管脚配置为模拟功能,例如:ADC、DAC、ACMP、SEG、COM、DH1、DH2、V1、V2、V3等功能,这些管脚对应的OFFD bit应该使能,关闭到数字区域的通路,避免内部数字器件不停的打开、关闭而漏电。
M0 M4之GPIO初始化的更多相关文章
-
M0 M4之UART初始化
新唐的M0/M4 UART都有16级或者64级FIFO,用来缓存UART数据的收/发.例如:如果RX FIFO中断触发级别设为14,UART接收14个字节才会发生RDA(接收数据可得)中断.这样可以降 ...
-
M0 M4之Timer初始化
新唐的定时器一般有很多功能:普通的定时功能,事件计数功能,捕获功能,超时触发ADC等等.大家如果感兴趣可以读一下<NANOB Timer功能介绍以及在弱灌注中的应用.pdf>,虽然各个系列 ...
-
新唐M0 M4系统初始化
系统初始化包含了时钟(clock)初始化和多功能引脚(Multi Function Pin 简称MFP寄存器)配置.void SYS_Init(void) { /* 解锁保护寄存器 */ SYS_Un ...
-
M0 M4时钟控制(一)
时钟控制器为整个芯片提供时钟源,包括系统时钟和所有外围设备时钟.该控制器还通过单独时钟的开或关,时钟源选择和分频器来进行功耗控制.在CPU使能低功耗PDEN(CLK_PWRCTL[7]) 位和Cort ...
-
4412 GPIO初始化
一.GPIO的初始化 • 在内核源码目录下使用命令“ls drivers/gpio/*.o”,可以看到“gpioexynos4”被编译进了内核.通过搜索*.o文件,可以知道内核编译内哪些文件.针对的看 ...
-
GPIO初始化之PB3/PB4/PA13/PA14/PA15引脚的复用--寄存器版本
为了节省IO资源单片机会在一个IO上复用很多功能,一般的单片机用到 一个功能后就能再用两外复用的功能了,这就体现出了STM32 GPIO的强大功能了,我们用重映射的方法把其中一个外设映射到其他IO脚上 ...
-
M0 M4关于库函数的讲解(以时钟为例)
#define CLK_PWRCON_PD_WAIT_CPU_Pos 8 #define CLK_PWRCON_PD_WAIT_CPU_Msk (1ul << CLK_PWRCON_PD_ ...
- 关于新塘 M0 M4添加库文件的说明
-
灵动微电子ARM Cortex M0 MM32F0010 GPIO 的配置驱动LED灯
灵动微电子ARM Cortex M0 MM32F0010 GPIO的配置 目录: 1.前言 2.学习方法简要说明 3.要点提示 4.注意事项 5.MM32F0010系统时钟的配置 6.MM32F001 ...
随机推荐
-
阿里云CentOS6上配置iptables
参考:http://blog.abv.cn/?p=50 阿里云CentOS6默认没有启动iptables 1.检查iptables状态 [root@iZ94jj63a3sZ ~]# service i ...
-
Sql Server中不常用的表运算符之APPLY(1)
写在这个系列的前面: 就像他们的名字一样,作为一个表运算,他们用来运算左表和右表.JOIN也是一个表运算符,不过他太常用了. APPLY: 将右表表达式应用在左表的每一行上. APPLY是Sql200 ...
-
Window 常用命令
Window 常用命令 Ctrl +alt +delete 切换用户 Ctrl +shift+esc 启动任务管理
-
Makefile简介
1.源程序的编译在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器. 下面我们以一个实例来说明如何使用gcc编译器.假设我们有下面一个非常简单的源程序(hello.c):in ...
-
[Java] HashMap详解
转自:http://alex09.iteye.com/blog/539545 HashMap 和 HashSet 是 Java Collection Framework 的两个重要成员,其中 Hash ...
-
记一次T-SQL查询优化 索引的重要性
概述 在一次调优一个项目组件的性能问题时,发现SQL的设计真的是非常的重要,所以写一篇博文来记录总结一下. 环境介绍 这个项目组件是一个Window服务,内部在使用轮循机会在处理一个事件表中的事件,将 ...
-
Allegro PCB -内层分割,比如电源层需要分割几种电源
内层分割,比如电源层需要分割几种电源. (1).点击Display -> Assign Color 在Option中,先取一种颜色作为高亮显示的颜色. (2).在Find中,选Net,点击mor ...
-
[转]SQL SERVER整理索引碎片测试
SQL SERVER整理索引碎片测试 SQL SERVER整理索引的方法也就这么几种,而且老是自作聪明的加入智能判断很不爽,还是比DBMS_ADVISOR差远了: 1SQL SERVER 2000/2 ...
-
Python3 tkinter基础 Checkbutton anchor for生成多个控件并西对齐
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
-
win10 右键菜单很慢的解决方式
本来想用 win7 的,不想花很多时间折腾了.现在新电脑主板硬盘CPU都在排挤 win7 ,真是可怜呀.正题: 新电脑的性能应该还算不错的, 18 年跑分 29w 以上,但在图标上面右键却都要转圈几秒 ...