打印
[牛人杂谈]

M0/M4 的 GPIO 初始化

[复制链接]
4577|47
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
新唐所有的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和 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 打钩

沙发
稳稳の幸福|  楼主 | 2016-5-15 11:33 | 只看该作者
之后打勾 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,这可以用于板子上有多个电压的情况。

使用特权

评论回复
板凳
稳稳の幸福|  楼主 | 2016-5-15 11:35 | 只看该作者
NUC472 Power Domain详细资料如下图:

M451 Power Domain详细资料如下图:

使用特权

评论回复
地板
稳稳の幸福|  楼主 | 2016-5-15 11:36 | 只看该作者
上面的红框是VBAT的范围,右边的红框是VDDIO的范围。

下面介绍一下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");
  
}

使用特权

评论回复
5
稳稳の幸福|  楼主 | 2016-5-15 11:36 | 只看该作者
GPIO IP有个寄存器叫OFFD(OFFDigital),关闭相应管脚的数字通路的意思。如果某个管脚配置为模拟功能,例如:ADC、DAC、ACMP、SEG、COM、DH1、DH2、V1、V2、V3等功能,这些管脚对应的OFFDbit应该使能,关闭到数字区域的通路,避免内部数字器件不停的打开、关闭而漏电。

使用特权

评论回复
6
lovecat2015| | 2016-5-15 22:40 | 只看该作者
新唐的M3和M4一共有多少个中断源呢?

使用特权

评论回复
7
稳稳の幸福|  楼主 | 2016-5-17 19:56 | 只看该作者
lovecat2015 发表于 2016-5-15 22:40
新唐的M3和M4一共有多少个中断源呢?

你不要管到底有多少中断源,只要知道你需要哪些中断源就行,资源非常丰富,但是几乎没有什么项目能使用全部,可以说一半的都难。

使用特权

评论回复
8
yiyigirl2014| | 2016-5-17 22:05 | 只看该作者
NUC472和 NUC442Vbat 负责 PG.14、PG.15、PA.0 和 PA.1,这些脚由 Vbat 负责供电,所以Vbat一定要有电,即使不接电池也要和 VDD接到一起。

使用特权

评论回复
9
稳稳の幸福|  楼主 | 2016-5-18 19:28 | 只看该作者
理论上GPIO只有四种功能,实际上联系上需要管脚的各种情况,那功能多了去

使用特权

评论回复
10
稳稳の幸福|  楼主 | 2016-5-18 22:12 | 只看该作者
每个IO内部一般都带内部上拉电阻,软件可以打开。一般用于按键,或者I2C不想外部加上拉电阻的情况。原来I2C是不要上拉电阻的。

使用特权

评论回复
11
捉虫天师| | 2016-7-30 16:41 | 只看该作者
不知道备用电池接口内部有没有二极管方式电流倒向

使用特权

评论回复
12
稳稳の幸福|  楼主 | 2016-7-30 16:46 | 只看该作者
善于使用工作方可成为高手。

使用特权

评论回复
13
734774645| | 2016-7-30 18:46 | 只看该作者
对于M051来说
这款MCU有40个通用I/O引脚,并复用为特殊功能引脚。 40个引脚分配在P0, P1, P2, P3 和 P4五个端口
上,每个端口最多8个引脚。每个引脚都是独立的,都有相应的寄存器来控制引脚工作模式与数据。
每个I/O引脚上的I/O类型可由软件独立地配置为输入,输出,开漏或准双向模式。所有的I/O引脚处于准
双向模式,端口数据寄存器Px_DOUT[7:0]的值复位为0x000_00FF。每个I/O引脚配有一个阻值大约为
110KΩ~300KΩ的非常弱的独立的上拉电阻接到VDD上, VDD大小为5.0V 到 2.5V

使用特权

评论回复
14
734774645| | 2016-7-30 18:47 | 只看该作者
输入模式的说明
设置 Px_PMD(PMDn[1:0]) 为00b , Px[n]为输入模式, I/O引脚为三态(高阻态),没有输出驱动能力。
Px_PIN的值反映相应端口引脚的状态。

使用特权

评论回复
15
734774645| | 2016-7-30 18:48 | 只看该作者
输出模式的说明
设置Px_PMD(PMDn[1:0])为 2’b01, Px[n]为输出模式, I/O引脚支持数字输出功能,有拉电流/灌电流能
力。 Px_DOUT 相应位的值被送到相应引脚上。

使用特权

评论回复
16
734774645| | 2016-7-30 18:49 | 只看该作者
开漏模式的说明
设置 Px_PMD(PMDn[1:0])为 2’b10, Px[n]为开漏模式, I/O支持数字输出功能,但仅有灌电流能力, 为
了把I/O引脚拉到高电平状态,需要外接一颗上拉电阻. 如果Px_DOUT相应位bit [n]的值为“0”,引脚上输
出低电平. 如果Px_DOUT 相应位bit [n]的值为“1”, 该引脚输出为高电平,由内部上拉电阻或外部上拉电
阻控制。

使用特权

评论回复
17
734774645| | 2016-7-30 18:51 | 只看该作者
准双向模式的说明
设置Px_PMD(PMDn[1:0]) 为 2’b11, Px[n]引脚为准双向模式, I/O同时支持数字输出和输入功能,但拉
电流仅达数百uA. 要实现数字输入,需要先将Px_DOUT 相应位置1。准双向输出是80C51及其派生产品
所共有的模式。若Px_DOUT相应位bit[n]为”0”, 引脚上输出为“低电平”. 若Px_DOUT相应位bit[n]为”1”, 该
引脚将核对引脚值. 若引脚值为高,没有任何动作,若引脚值为低, 该引脚置为强高2个时钟周期,然后
禁用强输出驱动,引脚状态由内部上拉电阻控制。注: 准双向模式的拉电流能力仅有200uA到30uA(相应
VDD的电压从5.0V到2.5V)

使用特权

评论回复
18
734774645| | 2016-7-30 18:55 | 只看该作者
NuMicro M451 系列拥有 87 个通用 I / O 引脚。这 87 个引脚被安排在 6 组口命名为 PA、PB,PC,PD,PE、PF。PA、PB,PC,PD
各 16 个引脚在端口;PE 有 15 个引脚在端口;PF 有 8 个引脚在端口。87 个引脚是独立的,每个引脚都有相应的寄存器位控制自身的
功能和数据。
每个 I/O 引脚可以配置软件分别作为输入、推挽式输出、开漏输出或准双向模式。每个 I/O 引脚都牵引着约为 110kΩ~300k
Ω弱上拉电阻。

使用特权

评论回复
19
734774645| | 2016-7-30 18:57 | 只看该作者
输入模式
输入模式需要设置 Px_MODE[2n+1:2n]为 0,此时引脚没有驱动能力,当前状态为高阻状态,此时 Px_PIN[n]的值反应了当
前引脚的电平。

推挽输出模式
推挽输出模式需要设置 Px_MODE[2n+1:2n]为 1,此时引脚具有输出高低电平的功能,如图 6.1.1,并具有吸收反向电流的能
力。Px_PIN[n]的值对应当前引脚输出的是高电平还是低电平。

推挽电路是两个参数相同的三极管或 MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对
称的功率开关管每次只有一个导通,所以导通损耗小、效率高。
输出既可以向负载灌电流,也可以从负载抽取电流。推挽式输出既提高电路的负载能力,又提高开关速度。

使用特权

评论回复
20
734774645| | 2016-7-30 18:58 | 只看该作者
开漏输出模式
开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相
对强(一般 20mA 以内)。
开漏形式的电路有以下几个特点:
 利用外部电路的驱动能力,减少 IC 内部的驱动。当 IC 内部 MOSFET 导通时,驱动电流是从外部的 VCC 流经上拉电阻,MOSFET
到 GND。IC 内部仅需很小的栅极驱动电流。
 一般来说,开漏是用来连接不同电平的器件,匹配电平用的,因为开漏引脚不连接外部的上拉电阻时,只能输出低电平,如果需
要同时具备输出高电平的功能,则需要接上拉电阻,很好的一个优点是通过改变上拉电源的电压,便可以改变传输电平。比如加
上上拉电阻就可以提供 TTL/CMOS 电平输出等。 (上拉电阻的阻值决定了逻辑电平转换的沿的速度。阻值越大,速度越低功耗越
小,所以负载电阻的选择要兼顾功耗和速度。 )
 开漏模式提供了灵活的输出方式,但是也有其弱点,就是带来上升沿的延时。因为上升沿是通过外接上拉无源电阻对负载充电,
所以当电阻选择小时延时就小,但功耗大;反之延时大功耗小。
 可以将多个开漏输出的引脚,连接到一条线上。通过一只上拉电阻,在不增加任何器件的情况下,形成“与逻辑”关系。这也是
I2C,SMBus 等总线判断总线占用状态的原理

使用特权

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

本版积分规则

163

主题

3105

帖子

8

粉丝