Skip to content

例程-GPIO

GPIO初始化

void gpio_init (gpio_pin_enum pin, gpio_dir_enum dir, uint8 dat, gpio_mode_enum pinmode)
// 函数简介     gpio 初始化
// 参数说明     pin         选择的引脚 (可选择范围由 zf_driver_gpio.h 内 gpio_pin_enum 枚举值确定)
// 参数说明     mode        引脚的方向 [GPI/GPIO]
// 这里应该是[GPI/GPO]吧
// 参数说明     dat         引脚初始化时设置的电平状态,输出时有效 0:低电平 1:高电平 仅在设置为输出模式时有效
// 参数说明     mode        引脚的模式 (可选择范围由 zf_driver_gpio.h 内 gpio_mode_enum 枚举值确定)
// 返回参数     void
// 使用示例     gpio_init(P00_0, GPO, 1, GPO_PUSH_PULL); // P00_0初始化为GPIO功能、输出模式、输出高电平、推挽输出
// 备注信息     需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能
typedef enum               // 枚举端口方向    此枚举定义不允许用户修改
{
    GPI = 0,               // 定义管脚输入方向
    GPO = 1,               // 定义管脚输出方向
}gpio_dir_enum;
typedef enum               // 枚举端口模式   此枚举定义不允许用户修改
{
    GPI_FLOATING_IN,       // 定义管脚浮空输入
    GPI_PULL_UP    ,       // 定义管脚上拉输入
    GPI_PULL_DOWN  ,       // 定义管脚下拉输入

    GPO_PUSH_PULL  ,       // 定义管脚推挽输出
    GPO_OPEN_DTAIN ,       // 定义管脚开漏输出
}gpio_mode_enum;

GPIO引脚模式

好的,这是它们的简练说明:

  • GPI_FLOATING_IN (浮空输入):

    • 状态: 引脚电平完全由外部决定,内部无上拉或下拉。
    • 特点: 外部未连接时,电平不确定,易受干扰。
  • GPI_PULL_UP (上拉输入):

    • 状态: 内部接一电阻到电源 (VCC)。
    • 特点: 外部未拉低时,默认为高电平。
  • GPI_PULL_DOWN (下拉输入):

    • 状态: 内部接一电阻到地 (GND)。
    • 特点: 外部未拉高时,默认为低电平。
  • GPO_PUSH_PULL (推挽输出):

    • 状态: 能主动输出高电平 (连接到VCC) 和低电平 (连接到GND)。
    • 特点: 驱动能力强,高低电平都确定。
  • GPO_OPEN_DRAIN (开漏输出) (假设 OPEN_DTAINOPEN_DRAIN 的笔误):

    • 状态: 只能主动输出低电平 (连接到GND) 或呈高阻态 (开路)。
    • 特点: 输出高电平需外部上拉电阻。允许多个开漏输出并联(线与)。

GPIO电平获取

uint8 gpio_get_level (gpio_pin_enum pin){
    return IfxPort_getPinState(get_port(pin), pin&0x1f);
}
// 函数简介     gpio 电平获取
// 参数说明     pin         选择的引脚 (可选择范围由 zf_driver_gpio.h 内 gpio_pin_enum 枚举值确定)
// 返回参数     uint8       引脚当前电平
// 使用示例     uint8 status = gpio_get_level(P00_0);// 获取P00_0引脚电平

GPIO输出设置

void gpio_set_level (gpio_pin_enum pin, uint8 dat)
{
    if(dat)
    {
        IfxPort_setPinHigh(get_port(pin), pin&0x1f);
    }
    else
    {
        IfxPort_setPinLow(get_port(pin), pin&0x1f);
    }
}
// 函数简介     gpio 输出设置
// 参数说明     pin         选择的引脚 (可选择范围由 zf_driver_gpio.h 内 gpio_pin_enum 枚举值确定)
// 参数说明     dat         0:低电平 1:高电平
// 返回参数     void
// 使用示例     gpio_set_level(P00_0, 1);// P00_0 输出高电平

GPIO方向设置

void gpio_set_dir (gpio_pin_enum pin, gpio_dir_enum dir, gpio_mode_enum pinmode)
{
    IfxPort_Mode port_mode;
    if(dir == GPI)
    {
        switch(pinmode)
        {
            case GPI_FLOATING_IN:port_mode = IfxPort_Mode_inputNoPullDevice ;       break; // 浮空输入
            case GPI_PULL_DOWN  :port_mode = IfxPort_Mode_inputPullDown     ;       break; // 下拉输入
            default:             port_mode = IfxPort_Mode_inputPullUp       ;       break; // 默认为上拉输入
        }
    }
    else
    {
        switch(pinmode)
        {
            case GPO_OPEN_DTAIN :port_mode = IfxPort_Mode_outputOpenDrainGeneral;   break;// 开漏输出
            default:             port_mode = IfxPort_Mode_outputPushPullGeneral ;   break;// 默认为推挽输出
        }
    }

    IfxPort_setPinMode(get_port(pin), pin&0x1f, port_mode);
}
// 函数简介     gpio 方向设置
// 参数说明     pin         选择的引脚 (可选择范围由 zf_driver_gpio.h 内 gpio_pin_enum 枚举值确定)
// 参数说明     dir         引脚的方向   输出:GPO   输入:GPI
// 参数说明     mode        引脚的模式 (可选择范围由 zf_driver_gpio.h 内 gpio_mode_enum 枚举值确定)
// 返回参数     void
// 使用示例     gpio_dir(P00_0, GPO, GPO_PUSH_PULL);// 设置P00_0为推挽输出模式

GPIO翻转电平

void gpio_toggle_level (gpio_pin_enum pin)
{
    IfxPort_togglePin(get_port(pin), pin&0x1f);
}
// 函数简介     gpio 翻转电平
// 参数说明     pin         选择的引脚 (可选择范围由 zf_driver_gpio.h 内 gpio_pin_enum 枚举值确定)
// 返回参数     void
// 使用示例     gpio_toggle_level(P00_0);// P00_0引脚电平翻转

延时函数

void system_delay_ms (uint32 time)
{
    if(time > 40000)
    {
        while(time > 40000)
        {
            system_delay_10ns(4000000000);
            time = time - 40000;
        }
        system_delay_10ns(time * 100000);
    }
    else
    {
        system_delay_10ns(time * 100000);
    }
}
//  函数简介      system 毫秒 延时函数
//  参数说明      time            延时时间  单位:ms
//  返回参数      void
//  使用示例      system_delay_ms(100);  // 延时100毫秒

案例

#include "zf_common_headfile.h"
#pragma section all "cpu0_dsram"

#define LED1                    (P20_9)
#define LED2                    (P20_8)
#define LED3                    (P21_5)
#define LED4                    (P21_4)

#define KEY1                    (P20_6)
#define KEY2                    (P20_7)
#define KEY3                    (P11_2)
#define KEY4                    (P11_3)

#define SWITCH1                 (P33_11)
#define SWITCH2                 (P33_12)

uint16 delay_time = 0;
uint8 led_state = 0;

int core0_main(void)
{
    clock_init();                   // 获取时钟频率<务必保留>
    debug_init();                   // 初始化默认调试串口
    // 此处编写用户代码 例如外设初始化代码等

    gpio_init(LED1, GPO, GPIO_LOW, GPO_PUSH_PULL);          // 初始化 LED1 输出 默认高电平 推挽输出模式
    gpio_init(LED2, GPO, GPIO_HIGH, GPO_PUSH_PULL);         // 初始化 LED2 输出 默认高电平 推挽输出模式
    gpio_init(LED3, GPO, GPIO_LOW, GPO_PUSH_PULL);          // 初始化 LED3 输出 默认高电平 推挽输出模式
    gpio_init(LED4, GPO, GPIO_HIGH, GPO_PUSH_PULL);         // 初始化 LED4 输出 默认高电平 推挽输出模式

    gpio_init(KEY1, GPI, GPIO_HIGH, GPI_PULL_UP);           // 初始化 KEY1 输入 默认高电平 上拉输入
    gpio_init(KEY2, GPI, GPIO_HIGH, GPI_PULL_UP);           // 初始化 KEY2 输入 默认高电平 上拉输入
    gpio_init(KEY3, GPI, GPIO_HIGH, GPI_PULL_UP);           // 初始化 KEY3 输入 默认高电平 上拉输入
    gpio_init(KEY4, GPI, GPIO_HIGH, GPI_PULL_UP);           // 初始化 KEY4 输入 默认高电平 上拉输入

    gpio_init(SWITCH1, GPI, GPIO_HIGH, GPI_PULL_UP);        // 初始化 SWITCH1 输入 默认高电平 上拉输入
    gpio_init(SWITCH2, GPI, GPIO_HIGH, GPI_PULL_UP);        // 初始化 SWITCH2 输入 默认高电平 上拉输入

    // 此处编写用户代码 例如外设初始化代码等
    cpu_wait_event_ready();         // 等待所有核心初始化完毕
    while (TRUE)
    {
        // 此处编写需要循环执行的代码
        delay_time = 300;
        if(gpio_get_level(SWITCH1)) delay_time /= 2;
        if(gpio_get_level(SWITCH2)) delay_time /= 2;
        if( !gpio_get_level(KEY1) || !gpio_get_level(KEY2) || !gpio_get_level(KEY3) || !gpio_get_level(KEY4) )         // 获取 KEYx 电平为低
        {
            gpio_set_level(LED1, led_state);
            gpio_set_level(LED2, led_state);
            gpio_set_level(LED3, led_state);
            gpio_set_level(LED4, led_state);
        }
        else
        {
            gpio_set_level(LED1, led_state);
            gpio_set_level(LED2, !led_state);
            gpio_set_level(LED3, led_state);
            gpio_set_level(LED4, !led_state);
        }
        led_state = !led_state;
        system_delay_ms(delay_time);
        // 此处编写需要循环执行的代码
    }
}

#pragma section all restore