打印
[技术问答]

新唐芯片学习笔记——GPIO

[复制链接]
1609|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
新唐芯片学习笔记——GPIO
概述
NuMicro®NUC029 最多有40个通用I/O引脚,这些引脚和其它功能共享。40个引脚分为6个端口,分别命名为P0, P1, P2, P3, P4和P5,每个端口最多有8个引脚。每个引脚都是独立的,都有相应的寄存器来控制引脚工作模式与数据。每个引脚的I/O类型可由软件独立地配置为输入,输出,开漏或准双向模式。每个I/O引脚配有一个非常弱的独立的上拉电阻,VDD从5.0V 到 2.5V时,内部弱上拉电阻阻值大约为110千欧~300千欧。

特性
-4 种 I/O 模式:
准双向
推挽输出
开漏输出
输入模式带高阻

触发输入模式由Px_MFP[23:16]中的Px_TYPE[15:0]选择

每个I/O 引脚都可以作为中断源,支持边沿/电平触发

所有I/O引脚复位后的默认模式由CIOINI(CONFIG[10])决定

NUC029xAN:
如果 CIOINI 为 0,所有GPIO引脚在芯片复位后为输入三态模式
如果 CIOINI 为 1,所有GPIO引脚在芯片复位后为准双向模式(默认)
在复位后,所有引脚的I/O模式都保持为准双向模式,且每个端口数据寄存器
Px_DOUT[7:0]的值复位为0x000_00FF。

标题功能描述 :
输入模式
设置 Px_PMD(PMDn[1:0]) 为00’b ,Px.n为输入模式,I/O引脚为三态(高阻态),没有输出驱动能力。Px_PIN 的值反映相应端口引脚的状态。
推挽输出模式
设置Px_PMD(PMDn[1:0])为 01’b,Px.n为推挽输出模式,I/O引脚支持数字输出功能,有拉电流/灌电流能力。Px_DOUT[n] 相应位的值被送到相应引脚上

开漏输出模式
设置 Px_PMD(PMDn[1:0])为 10’b,Px.n为开漏模式,I/O支持数字输出功能,但仅有灌电流能力,
为了把I/O引脚拉到高电平状态,需要外接一颗上拉电阻。 如果Px_DOUT[n] 相应位的值为“0”,引
脚上输出低电平. 如果Px_DOUT[n] 相应位的值为“1”, 该引脚由外部上拉电阻控制输出高电平。



使用特权

评论回复
沙发
HuangHongLun|  楼主 | 2021-7-25 09:34 | 只看该作者
准双向模式
设置Px_PMD(PMDn[1:0]) 为 11’b,Px.n引脚为准双向模式,I/O同时支持数字输出和输入功能,但拉电流仅达数百uA。 要实现数字输入功能,需要先将Px_DOUT[n] 相应位置1。若Px_DOUT[n]相应位为”0”,引脚上输出为“低电平”。 若Px_DOUT[n]相应位为”1”,该引脚将检查引脚值,若引脚值为高,没有任何动作,若引脚值为低,该引脚将驱动2个时钟周期的强拉电流,然后关闭强输出驱动,然后引脚状态由内部上拉电阻控制。 需注意的是,准双向模式拉电流的能力只有200uA到30uA,其中VDD由5.0 V 到 2.5 V。

使用特权

评论回复
板凳
HuangHongLun|  楼主 | 2021-7-25 09:35 | 只看该作者
GPIO 中断和唤醒功能
通过设置Px_IEN 和 Px_IMD寄存器,每个GPIO引脚都可以设置为中断源。有5种类型的中断条件可以选择:低电平触发、高电平触发、下降沿触发、上升沿触发、上升和下降沿都触发。对于边沿触发,用户可以使能输入信号去抖动功能来避免由干扰导致的不期望的中断发生。de-bounce 时钟源和采样周期可以由DBNCECON 寄存器设定。
四种模式:
GPIO_PMD_INPUT           输入模式
GPIO_PMD_OUTPUT          输出模式(推挽输出,有电流驱动能力)
GPIO_PMD_OPEN_DRAIN      开漏输出模式
GPIO_PMD_QUASI           准双向模式

中断:
GPIO_INT_RISING         上升沿触发
GPIO_INT_FALLING        下降沿触发
GPIO_INT_BOTH_EDGE      上升下降沿触发
GPIO_INT_HIGH           高电平触发
GPIO_INT_LOW            低电平触发

函数描述:用于设置指定的GPIO操作模式
参数:  port        端口P0, P1, P2, P3 or P4.
参数:  u32PinMask  具体引脚BIT0 ~ BIT7.
参数:  u32Mode     四种模式
void GPIO_SetMode(GPIO_T *port, uint32_t u32PinMask, uint32_t u32Mode)

函数描述:使能GPIO中断
参数:   port            P0, P1, P2, P3 or P4.
参数:   u32Pin          引脚号码0 ~ 7
参数:   u32IntAttribs   中断触发
void GPIO_EnableInt(GPIO_T *port, uint32_t u32Pin, uint32_t u32IntAttribs)

函数描述:失能GPIO中断
参数:   port            P0, P1, P2, P3 or P4.
参数:   u32Pin          引脚号码0 ~ 7
void GPIO_DisableInt(GPIO_T *port, uint32_t u32Pin)
函数描述:获取GPIO中断标志
GPIO_GET_INT_FLAG(port, u32PinMask)

函数描述:清除GPIO中断标志
GPIO_CLR_INT_FLAG(port, u32PinMask)

函数描述:失能中断消抖功能
GPIO_DISABLE_DEBOUNCE(port, u32PinMask)

函数描述:使能中断消抖功能
GPIO_ENABLE_DEBOUNCE(port, u32PinMask)

函数描述:设置消抖采样采样周期、时间
GPIO_SET_DEBOUNCE_TIME(u32ClkSrc, u32ClkSel)



//初始化
Void GPIO_Init()
{
        /* P10 配置为输出,P24 配置为输入模式 */
        GPIO_SetMode(P1, 0, GPIO_PMD_OUTPUT);
        GPIO_SetMode(P2, 4, GPIO_PMD_INPUT);
        /* P10 配置为输出*/
        GPIO_SetMode(P1, 0, GPIO_PMD_OUTPUT);
       
        /*从P10输出0*/
        P10 = 0;

   /*如果P11为低电平,P12输出高电平*/
        if(P11 == 0)
                P12 = 1;
       
        /* 将 P25 配置为输入模式并使能上升沿中断 */
        GPIO_SetMode(P2, 5, GPIO_PMD_INPUT);
        GPIO_EnableInt(P2, 5, GPIO_INT_RISING);
        NVIC_EnableIRQ(GPIO_P2P3P4_IRQn);
       
        /*  将 P12 配置为输入模式,打开内部上拉,并使能下降沿中断 */
        GPIO_SetMode(P1, 2, GPIO_PMD_INPUT);
       
        GPIO_EnableInt(P1, 2, GPIO_INT_FALLING);
        NVIC_EnableIRQ(GPIO_P0P1_IRQn);
        }
       
        //中断服务函数
        void GPIOP2P3P4_IRQHandler()
        {
                if(GPIO_GET_INT_FLAG(P2, BIT0))
                {
                        GPIO_CLR_INT_FLAG(BIT0);
                       
                }
                else//清除其他端口不必要的中断
                {
                P2->ISRC = P2->ISRC;
                P3->ISRC = P3->ISRC;
                P4->ISRC = P4->ISRC;
                }
        }

使用特权

评论回复
地板
huahuagg| | 2021-7-25 15:37 | 只看该作者
输出实际上就是给数据锁存器送数据。

使用特权

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

本版积分规则

50

主题

440

帖子

2

粉丝