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

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

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

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

编辑如下代码配置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 的数值是一致的。

我要赚赏金
