/** ****************************************************************************** * @file plib035_gpio.c * * @brief Файл содержит реализацию функций для работы с GPIO * * @author НИИЭТ, Богдан Колбов * ****************************************************************************** * @attention * * ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО * ГАРАНТИЙ, ЯВНО ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ ГАРАНТИИ ТОВАРНОЙ * ПРИГОДНОСТИ, СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И ОТСУТСТВИЯ * НАРУШЕНИЙ, НО НЕ ОГРАНИЧИВАЯСЬ ИМИ. ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ * ПРЕДНАЗНАЧЕНО ДЛЯ ОЗНАКОМИТЕЛЬНЫХ ЦЕЛЕЙ И НАПРАВЛЕНО ТОЛЬКО НА * ПРЕДОСТАВЛЕНИЕ ДОПОЛНИТЕЛЬНОЙ ИНФОРМАЦИИ О ПРОДУКТЕ, С ЦЕЛЬЮ СОХРАНИТЬ ВРЕМЯ * ПОТРЕБИТЕЛЮ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ * ОТВЕТСТВЕННОСТИ ПО КАКИМ-ЛИБО ИСКАМ, ЗА ПРЯМОЙ ИЛИ КОСВЕННЫЙ УЩЕРБ, ИЛИ * ПО ИНЫМ ТРЕБОВАНИЯМ, ВОЗНИКШИМ ИЗ-ЗА ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ * ИЛИ ИНЫХ ДЕЙСТВИЙ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ. * *

© 2018 ОАО "НИИЭТ"

****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ #include "plib035_gpio.h" /** @addtogroup Peripheral * @{ */ /** @addtogroup GPIO * @{ */ /** @defgroup GPIO_Private Приватные данные * @{ */ /** @defgroup GPIO_Private_Defines Приватные константы * @{ */ /** * @} */ /** @defgroup GPIO_Private_Functions Приватные функции * @{ */ /** * @brief Записывает необходимое 2-битное значение режима в регистр порта для всех выбранных пинов * @param Reg Указатель на изменяемый регистр * @param Pin Выбор пинов. Любая совокупность значений GPIO_Pin_x (@ref GPIO_Pin_Define). * @param Val Конфигурация пинов (2-битное значение) * @retval void */ static void GPIO_ModeConfig(volatile uint32_t* Reg, uint32_t Pin, uint32_t Val) { uint32_t reg_temp = *Reg; for (uint32_t i = 0; i < 16; i++) { if (Pin & (1 << i)) { reg_temp &= ~(0x3UL << i * 0x2UL); reg_temp |= Val << i * 0x2UL; } } *Reg = reg_temp; } /** * @brief Настройка режима работы выходного каскада * @param GPIOx Выбор порта, где x=A|B * @param Pin Выбор пинов. Любая совокупность значений GPIO_Pin_x (@ref GPIO_Pin_Define). * @param OutMode Режим работы * @retval void */ void GPIO_OutModeConfig(GPIO_TypeDef* GPIOx, uint32_t Pin, GPIO_OutMode_TypeDef OutMode) { assert_param(IS_GPIO_PERIPH(GPIOx)); assert_param(IS_GPIO_PIN(Pin)); assert_param(IS_GPIO_OUT_MODE(OutMode)); GPIO_ModeConfig(&(GPIOx->OUTMODE), Pin, (uint32_t)OutMode); } /** * @brief Настройка режима работы входа * @param GPIOx Выбор порта, где x=A|B * @param Pin Выбор пинов. Любая совокупность значений GPIO_Pin_x (@ref GPIO_Pin_Define). * @param InMode Режим работы * @retval void */ void GPIO_InModeConfig(GPIO_TypeDef* GPIOx, uint32_t Pin, GPIO_InMode_TypeDef InMode) { assert_param(IS_GPIO_PERIPH(GPIOx)); assert_param(IS_GPIO_PIN(Pin)); assert_param(IS_GPIO_IN_MODE(InMode)); GPIO_ModeConfig(&(GPIOx->INMODE), Pin, (uint32_t)InMode); } /** * @brief Настройка режима работы подтяжек пинов * @param GPIOx Выбор порта, где x=A|B * @param Pin Выбор пинов. Любая совокупность значений GPIO_Pin_x (@ref GPIO_Pin_Define). * @param PullMode Режим работы * @retval void */ void GPIO_PullModeConfig(GPIO_TypeDef* GPIOx, uint32_t Pin, GPIO_PullMode_TypeDef PullMode) { assert_param(IS_GPIO_PERIPH(GPIOx)); assert_param(IS_GPIO_PIN(Pin)); assert_param(IS_GPIO_PULL_MODE(PullMode)); GPIO_ModeConfig(&(GPIOx->PULLMODE), Pin, (uint32_t)PullMode); } /** * @brief Настройка нагрузочной способности и скорости переключения пинов * @param GPIOx Выбор порта, где x=A|B * @param Pin Выбор пинов. Любая совокупность значений GPIO_Pin_x (@ref GPIO_Pin_Define). * @param DriveMode Режим работы * @retval void */ void GPIO_DriveModeConfig(GPIO_TypeDef* GPIOx, uint32_t Pin, GPIO_DriveMode_TypeDef DriveMode) { assert_param(IS_GPIO_PERIPH(GPIOx)); assert_param(IS_GPIO_PIN(Pin)); assert_param(IS_GPIO_DRIVE_MODE(DriveMode)); GPIO_ModeConfig(&(GPIOx->DRIVEMODE), Pin, (uint32_t)DriveMode); } /** * @brief Устанавливает все регистры выбранного GPIOx значениями по умолчанию * @param GPIOx Выбор порта, где x=A|B * @retval void */ void GPIO_DeInit(GPIO_TypeDef* GPIOx) { uint32_t GPIO_rst; assert_param(IS_GPIO_PERIPH(GPIOx)); if (GPIOx == GPIOA) GPIO_rst = RCU_AHBRst_GPIOA; else /* (GPIOx == GPIOB) */ GPIO_rst = RCU_AHBRst_GPIOB; RCU_AHBRstCmd(GPIO_rst, DISABLE); RCU_AHBRstCmd(GPIO_rst, ENABLE); } /** * @brief Инициализирует модуль GPIOx согласно параметрам структуры InitStruct. * Порт не начнет функционировать, пока не будет разрешена цифровая работа пина @ref GPIO_DigitalCmd . * @param GPIOx Выбор порта, где x=A|B * @param InitStruct Указатель на структуру типа @ref GPIO_Init_TypeDef, * которая содержит конфигурационную информацию * @retval void */ void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_Init_TypeDef* InitStruct) { GPIO_OutCmd(GPIOx, InitStruct->Pin, InitStruct->Out); GPIO_AltFuncCmd(GPIOx, InitStruct->Pin, InitStruct->AltFunc); GPIO_OutModeConfig(GPIOx, InitStruct->Pin, InitStruct->OutMode); GPIO_InModeConfig(GPIOx, InitStruct->Pin, InitStruct->InMode); GPIO_PullModeConfig(GPIOx, InitStruct->Pin, InitStruct->PullMode); GPIO_DriveModeConfig(GPIOx, InitStruct->Pin, InitStruct->DriveMode); GPIO_DigitalCmd(GPIOx, InitStruct->Pin, InitStruct->Digital); } /** * @brief Заполнение каждого члена структуры InitStruct значениями по умолчанию * @param InitStruct Указатель на структуру типа @ref GPIO_Init_TypeDef, * которую необходимо проинициализировать * @retval void */ void GPIO_StructInit(GPIO_Init_TypeDef* InitStruct) { InitStruct->Pin = GPIO_Pin_All; InitStruct->Out = DISABLE; InitStruct->AltFunc = DISABLE; InitStruct->OutMode = GPIO_OutMode_PP; InitStruct->InMode = GPIO_InMode_Schmitt; InitStruct->PullMode = GPIO_PullMode_Disable; InitStruct->DriveMode = GPIO_DriveMode_HighFast; InitStruct->Digital = DISABLE; } /** * @} */ /** * @} */ /** * @} */ /** * @} */ /******************* (C) COPYRIGHT 2018 NIIET *****END OF FILE****/