RT1064学习笔记(4)--GPIO中断例程(GPIO Interrupt Demo)

RT1064之GPIO中断例程

Ps:本例程主要作用是,展示如何使用GPIO Interrupt以及GPIO中断的概念
主板为:逐飞RT1064 + 母板

一,GPIO中断简介(基于RT1052)

RT1052 拥有 5 组 GPIO,每组 GPIO 拥有 32 个 GPIO 输入输出引脚,每个输入输出引脚都能够触发中断。 RT1052 并没有为每个输入输出引脚分配一个中断号,而是为每组GPIO 分配两个中断编号,其中低 16 个输入输出引脚(GPIOx_n, x 取 1 到 5, n 取 0 到 15)共用一个中断编号,高 16 个输入输出引脚使用另外一个中断编号。

二,GPIO端口介绍

//gpio的中断函数名称为GPIO2_Combined_16_31_IRQHandler,定义在isr.c文件内
//GPIO0表示A端口 RT没有这个端口
//GPIO1表示B端口
//GPIO2表示C端口 0_15表示C0-C15 IO口的中断响应都由这个中断函数管理 16_31表示C16-C31 IO口的中断响应都由这个中断函数管理
//GPIO3表示D端口
//GPIO4表示E端口 RT1064该端口全部IO被SDRAM占用
//GPIO5表示F端口 RT仅有三个端口,但是功能特殊核心板并未引出

二,GPIO库函数介绍

1)gpio_init()函数使用

/-------------------------------------------------------------------------------------------------------------------
//  @brief      GPIO初始化
//  @param      pin         选择的引脚 (可选择范围由 common.h 内PIN_enum枚举值确定)
//  @param      dir         引脚的方向   输出:GPO   输入:GPI
//  @param      dat         引脚初始化时设置的电平状态,输出时有效 0:低电平 1:高电平
//  @param      pinconf     引脚配置(可设置参数由zf_iomuxc.h文件内PINCONF_enum枚举值确定,多个条件使用 | 相或)
//  @return     void
//  Sample usage:           gpio_init(D0, GPO, 1, GPIO_PIN_CONFIG);//D0初始化为GPIO功能、输出模式、输出高电平、上拉47K IO速度100MHZ 驱动强度R0
//-------------------------------------------------------------------------------------------------------------------
void gpio_init(PIN_enum pin, GPIODIR_enum dir, uint8 dat, uint32 pinconf)

2)gpio_interrupt_init()函数


//-------------------------------------------------------------------------------------------------------------------
//  @brief      GPIO 外部中断初始化
//  @param      pin         选择的引脚 (可选择范围由 common.h 内PIN_enum枚举值确定)
//  @param      trigger     中断触发方式 选择范围参见h文件TRIGGER_enum枚举
//  @param      pinconf     引脚配置 (可设置参数由zf_iomuxc.h文件内PINCONF_enum枚举值确定,多个条件使用 | 相或)
//  @return     void        
//  Sample usage:           gpio_interrupt_init(D0,RISING,GPIO_INT_CONFIG);//D0上升沿中断
//-------------------------------------------------------------------------------------------------------------------
void gpio_interrupt_init(PIN_enum pin, TRIGGER_enum trigger, uint32 pinconf)

3)设置中断优先级

   NVIC_SetPriority(GPIO2_Combined_16_31_IRQn,15);        
 //设置中断优先级 范围0-15 越小优先级越高
 

4)gpio_toggle()设置优先级


//-------------------------------------------------------------------------------------------------------------------
//  @brief      GPIO 翻转
//  @param      pin         选择的引脚 (可选择范围由 common.h 内PIN_enum枚举值确定)
//  @return     void        
//  Sample usage:           gpio_toggle(D0);//D0引脚电平翻转
//-------------------------------------------------------------------------------------------------------------------
void gpio_toggle(PIN_enum pin)
{
    GPIO_PortToggle(PORTPTR[pin>>5],1<<(pin&0x1f));
}
三,while(1)循环中代码
  while(1)
    {
        gpio_toggle(C17);//设置引脚电平为高电平
        systick_delay_ms(100);
        
    }
四,整体代码与运行结果展示

#include "headfile.h"


uint8 gpio_status;
int main(void)
{
    DisableGlobalIRQ();
    board_init();   //务必保留,本函数用于初始化MPU 时钟 调试串口
    
    
    //初始化GPIO C17 为输出 默认输出低电平 使用默认引脚配置GPIO_PIN_CONFIG
    gpio_init(C17,GPO,0,GPIO_PIN_CONFIG);
    
    //初始化GPIO C16 中断模式 使用默认引脚配置GPIO_INT_CONFIG
    gpio_interrupt_init(C16,RISING,GPIO_INT_CONFIG);
    NVIC_SetPriority(GPIO2_Combined_16_31_IRQn,15);         //设置中断优先级 范围0-15 越小优先级越高
    
    EnableGlobalIRQ(0);
    
    
    //将C16 C17使用杜邦线链接起来然后在线调试查看gpio_int_test变量
    //变量会持续增加
    
    //gpio的中断函数名称为GPIO2_Combined_16_31_IRQHandler,定义在isr.c文件内
    //GPIO0表示A端口  RT没有这个端口
    //GPIO1表示B端口
    //GPIO2表示C端口  0_15表示C0-C15 IO口的中断响应都由这个中断函数管理  16_31表示C16-C31 IO口的中断响应都由这个中断函数管理
    //GPIO3表示D端口
    //GPIO4表示E端口  RT1064该端口全部IO被SDRAM占用
    //GPIO5表示F端口  RT仅有三个端口,但是功能特殊核心板并未引出
    
    while(1)
    {
        gpio_toggle(C17);//设置引脚电平为高电平
        systick_delay_ms(100);
        
    }

    
}


2) 将C16 C17使用杜邦线链接起来然后在线调试查看gpio_int_test变量,变量会持续增加

RT1064学习笔记(4)--GPIO中断例程(GPIO Interrupt Demo)_第1张图片

你可能感兴趣的:(RT1064学习笔记)