/* * Copyright (c) 2006-2023, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2023-12-02 Meco Man the first version */ #include "drv_gpio.h" #include #include #define GET_GPIOx(pin) ((GPIO_TypeDef *)(rt_uint32_t)(pin & 0xFFFFFFFFULL)) #define GET_GPIOPin(pin) ((uint16_t)(pin >> 32U)) void rt_pin_mode(rt_uint64_t pin, rt_uint8_t mode) { GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_TypeDef *GPIOx = GET_GPIOx(pin); uint16_t GPIO_Pin = GET_GPIOPin(pin); RT_ASSERT(mode == PIN_MODE_OUTPUT || mode == PIN_MODE_INPUT || mode == PIN_MODE_INPUT_PULLUP || mode == PIN_MODE_INPUT_PULLDOWN || mode == PIN_MODE_OUTPUT_OD); switch((rt_ubase_t)GPIOx) { case (rt_ubase_t)GPIOA: __HAL_RCC_GPIOA_CLK_ENABLE(); break; case (rt_ubase_t)GPIOB: __HAL_RCC_GPIOB_CLK_ENABLE(); break; case (rt_ubase_t)GPIOC: __HAL_RCC_GPIOC_CLK_ENABLE(); break; #ifdef GPIOD case (rt_ubase_t)GPIOD: __HAL_RCC_GPIOD_CLK_ENABLE(); break; #endif /* GPIOD */ #ifdef GPIOE case (rt_ubase_t)GPIOE: __HAL_RCC_GPIOE_CLK_ENABLE(); break; #endif /* GPIOE */ #ifdef GPIOF case (rt_ubase_t)GPIOF: __HAL_RCC_GPIOF_CLK_ENABLE(); break; #endif /* GPIOF */ #ifdef GPIOG case (rt_ubase_t)GPIOG: __HAL_RCC_GPIOG_CLK_ENABLE(); break; #endif /* GPIOG */ #ifdef GPIOH case (rt_ubase_t)GPIOH: __HAL_RCC_GPIOH_CLK_ENABLE(); break; #endif /* GPIOH */ #ifdef GPIOI case (rt_ubase_t)GPIOI: __HAL_RCC_GPIOI_CLK_ENABLE(); break; #endif /* GPIOI */ } GPIO_InitStruct.Pin = GPIO_Pin; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; if (mode == PIN_MODE_OUTPUT) { /* output setting */ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; } else if (mode == PIN_MODE_INPUT) { /* input setting: not pull. */ GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; } else if (mode == PIN_MODE_INPUT_PULLUP) { /* input setting: pull up. */ GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; } else if (mode == PIN_MODE_INPUT_PULLDOWN) { /* input setting: pull down. */ GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLDOWN; } else if (mode == PIN_MODE_OUTPUT_OD) { /* output setting: od. */ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; GPIO_InitStruct.Pull = GPIO_NOPULL; } HAL_GPIO_Init(GPIOx, &GPIO_InitStruct); } void rt_pin_write(rt_uint64_t pin, rt_uint8_t value) { GPIO_TypeDef *GPIOx = GET_GPIOx(pin); uint16_t GPIO_Pin = GET_GPIOPin(pin); RT_ASSERT(value == PIN_LOW || value == PIN_HIGH); HAL_GPIO_WritePin(GPIOx, GPIO_Pin, (value == PIN_LOW) ? GPIO_PIN_RESET : GPIO_PIN_SET); } rt_int8_t rt_pin_read(rt_uint64_t pin) { GPIO_TypeDef *GPIOx = GET_GPIOx(pin); uint16_t GPIO_Pin = GET_GPIOPin(pin); return HAL_GPIO_ReadPin(GPIOx, GPIO_Pin) == GPIO_PIN_RESET ? PIN_LOW : PIN_HIGH; }