这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 行业应用 » 汽车电子 » 【S32K3XX】GPIO输入输出配置方式使用

共1条 1/1 1 跳转至

【S32K3XX】GPIO输入输出配置方式使用

高工
2026-02-03 12:56:36     打赏

【简介】

             S32K3 芯片的GPIO 在之前的贴中介绍过GPIO 的配置使用(【S32K3XX】SIUL2 之 GPIO 功能使用)及 GPIO中断的配置使用方式(【S32K3XX】S32DS 中断管理),对于S32K3 的的GPIO 还有个特殊的用法可以同时配置为“输出/输入”的工作方式。

在S32DS 配置GPIO的时候可以配置为“输入/输出”的配置,对应配置如下:

image.png

对于配置为“input/output”的配置pad 的电平会缓存中input buffer 中,输出的电平会缓存在 output buffer 中,我们可以从input buffer 中读取输出的电平状态。

image.png

可以通过寄存器使能“input/output”buffer 功能。

image.png

对应的S32DS的配置中回开启上述的配置。

image.png

   编辑如下代码配置PTC1 为输出,然后读取input buffer 的数值是否和设置的一致。

static Siul2_Dio_Ip_GpioType * get_dio_base(uint16_t pin_number)
{
    const Siul2_Dio_Ip_GpioType * dio[] = {PTA_L_HALF, PTA_H_HALF,
                                           PTB_L_HALF, PTB_H_HALF,
                                           PTC_L_HALF, PTC_H_HALF,
                                           PTD_L_HALF, PTD_H_HALF,
                                           PTE_L_HALF, PTE_H_HALF,
                                           PTF_L_HALF, PTF_H_HALF,
                                           PTG_L_HALF, PTG_H_HALF};

    if(pin_number > 16 * sizeof(dio)/sizeof(dio[0]) - 1)
    {
        return NULL;
    }
    else
    {
        return (Siul2_Dio_Ip_GpioType *)dio[pin_number / 16];
    }
}

unsigned int gpio(char argc, char **argv)
{
    uint8_t pin_number;
    Siul2_Dio_Ip_GpioType * dio;

    if(argc == 3 && 0 == strcmp(argv[1],"set"))
    {
        pin_number = (uint8_t)myatoi(argv[2]);
        dio = get_dio_base(pin_number);
        if( dio )
            Siul2_Dio_Ip_SetPins(dio, (Siul2_Dio_Ip_PinsChannelType)(1U << (pin_number % 16U)));
    }
    else if(argc == 3 && 0 == strcmp(argv[1],"clr"))
    {
        pin_number = (uint8_t)myatoi(argv[2]);
        dio = get_dio_base(pin_number);
        if( dio )
            Siul2_Dio_Ip_ClearPins(dio, (Siul2_Dio_Ip_PinsChannelType)(1U << (pin_number % 16U)));
    }
    else if(argc == 3 && 0 == strcmp(argv[1],"get"))
    {
        pin_number = (uint8_t)myatoi(argv[2]);
        dio = get_dio_base(pin_number);
        if( dio )
        {
            Siul2_Dio_Ip_PinsLevelType level = Siul2_Dio_Ip_ReadPin(dio, (Siul2_Dio_Ip_PinsChannelType)(pin_number % 16U));
            PRINTF("pin %d level: %d\r\n", pin_number, level);
        }
    }
    else
    {
        PRINTF("Usage: gpio set/clr/get pin_number\r\n");
    }
    return 0;
}


本地设置gpio 为高和低之后读取input buffer 的数值和输出的output buffer 的数值是一致的。

image.png

           


共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]