123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344 |
- ////////////////////////////////////////////////////////////////////////////////
- /// @file hal_gpio.c
- /// @author AE TEAM
- /// @brief THIS FILE PROVIDES ALL THE GPIO FIRMWARE FUNCTIONS.
- ////////////////////////////////////////////////////////////////////////////////
- /// @attention
- ///
- /// THE EXISTING FIRMWARE IS ONLY FOR REFERENCE, WHICH IS DESIGNED TO PROVIDE
- /// CUSTOMERS WITH CODING INFORMATION ABOUT THEIR PRODUCTS SO THEY CAN SAVE
- /// TIME. THEREFORE, MINDMOTION SHALL NOT BE LIABLE FOR ANY DIRECT, INDIRECT OR
- /// CONSEQUENTIAL DAMAGES ABOUT ANY CLAIMS ARISING OUT OF THE CONTENT OF SUCH
- /// HARDWARE AND/OR THE USE OF THE CODING INFORMATION CONTAINED HEREIN IN
- /// CONNECTION WITH PRODUCTS MADE BY CUSTOMERS.
- ///
- /// <H2><CENTER>© COPYRIGHT MINDMOTION </CENTER></H2>
- ////////////////////////////////////////////////////////////////////////////////
- // Define to prevent recursive inclusion
- #define _HAL_GPIO_C_
- // Files includes
- #include "reg_exti.h"
- #include "hal_rcc.h"
- #include "hal_gpio.h"
- ////////////////////////////////////////////////////////////////////////////////
- /// @addtogroup MM32_Hardware_Abstract_Layer
- /// @{
- ////////////////////////////////////////////////////////////////////////////////
- /// @addtogroup GPIO_HAL
- /// @{
- ////////////////////////////////////////////////////////////////////////////////
- /// @addtogroup GPIO_Exported_Functions
- /// @{
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Deinitializes the gpio peripheral registers to their default reset
- /// values.
- /// @param gpio: select the GPIO peripheral.
- /// @retval None.
- ////////////////////////////////////////////////////////////////////////////////
- void GPIO_DeInit(GPIO_TypeDef* gpio)
- {
- switch (*(vu32*)&gpio) {
- case (u32)GPIOA:
- RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, DISABLE);
- break;
- case (u32)GPIOB:
- RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOB, DISABLE);
- break;
- case (u32)GPIOC:
- RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOC, DISABLE);
- break;
- case (u32)GPIOD:
- RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOD, DISABLE);
- break;
- case (u32)GPIOE:
- RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOE, DISABLE);
- break;
- default:
- break;
- }
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Deinitializes the Alternate Functions (remap, event control
- /// and EXTI configuration) registers to their default reset values.
- /// @param None.
- /// @retval None.
- ////////////////////////////////////////////////////////////////////////////////
- void GPIO_AFIODeInit()
- {
- GPIOA->AFRL = 0xFFFFFFFF;
- GPIOA->AFRH = 0xF00FFFFF; // PA14:SWCLK, PA13:PSWDIO
- GPIOB->AFRL = 0xFFFFFFFF;
- GPIOB->AFRH = 0xFFFFFFFF;
- GPIOC->AFRL = 0xFFFFFFFF;
- GPIOC->AFRH = 0xFFFFFFFF;
- GPIOD->AFRL = 0xFFFFFFFF;
- GPIOD->AFRH = 0xFFFFFFFF;
- GPIOE->AFRL = 0xFFFFFFFF;
- GPIOE->AFRH = 0xFFFFFFFF;
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Initializes the gpio peripheral according to the specified
- /// parameters in the init_struct.
- /// @param gpio: select the GPIO peripheral.
- /// @param init_struct: pointer to a GPIO_InitTypeDef structure that
- /// contains the configuration information for the specified GPIO
- /// peripheral.
- /// @retval None.
- ////////////////////////////////////////////////////////////////////////////////
- void GPIO_Init(GPIO_TypeDef* gpio, GPIO_InitTypeDef* init_struct)
- {
- u8 idx;
- u8 i;
- u32 tmp;
- __IO u32* reg ;
- // 1x
- u32 dat = init_struct->GPIO_Mode & 0x0F;
- if (init_struct->GPIO_Mode & 0x10)
- dat |= init_struct->GPIO_Speed;
- // 0x
- reg = &gpio->CRL;
- for (i = 0; i < 8; i++) {
- idx = i * 4;
- if ((init_struct->GPIO_Pin) & (1 << i)) {
- *reg = (*reg & ~(0xF << idx)) | (dat << idx);
- }
- }
- reg = &gpio->CRH;
- tmp = init_struct->GPIO_Pin >> 8;
- for (i = 0; i < 8; i++) {
- idx = i * 4;
- if (tmp & (1 << i)) {
- *reg = (*reg & ~(0xF << idx)) | (dat << idx);
- }
- }
- // 2x,4x
- if (init_struct->GPIO_Mode == GPIO_Mode_IPD)
- gpio->BRR |= init_struct->GPIO_Pin;
- else if (init_struct->GPIO_Mode == GPIO_Mode_IPU)
- gpio->BSRR |= init_struct->GPIO_Pin;
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Fills each init_struct member with its default value.
- /// @param init_struct : pointer to a GPIO_InitTypeDef structure
- /// which will be initialized.
- /// @retval : None
- ////////////////////////////////////////////////////////////////////////////////
- void GPIO_StructInit(GPIO_InitTypeDef* init_struct)
- {
- // Reset GPIO init structure parameters values
- init_struct->GPIO_Pin = GPIO_Pin_All;
- init_struct->GPIO_Speed = GPIO_Speed_2MHz;
- init_struct->GPIO_Mode = GPIO_Mode_FLOATING;
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Reads the input data of specified GPIO port pin.
- /// @param gpio: select the GPIO peripheral.
- /// @param pin: specifies the port pin to be read.
- /// This parameter can be GPIO_Pin_x where x can be (0..15).
- /// @retval The input port pin value.
- ////////////////////////////////////////////////////////////////////////////////
- bool GPIO_ReadInputDataBit(GPIO_TypeDef* gpio, u16 pin)
- {
- return ((gpio->IDR & pin)) ? Bit_SET : Bit_RESET;
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Reads all GPIO port pins input data.
- /// @param gpio: select the GPIO peripheral.
- /// @retval GPIO port input data value.
- ////////////////////////////////////////////////////////////////////////////////
- u16 GPIO_ReadInputData(GPIO_TypeDef* gpio)
- {
- return gpio->IDR;
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Reads the output data of specified GPIO port pin.
- /// @param gpio: select the GPIO peripheral.
- /// @param pin: specifies the port bit to be read.
- /// This parameter can be GPIO_Pin_x where x can be (0..15).
- /// @retval The output port pin value.
- ////////////////////////////////////////////////////////////////////////////////
- bool GPIO_ReadOutputDataBit(GPIO_TypeDef* gpio, u16 pin)
- {
- return (gpio->ODR & pin) ? Bit_SET : Bit_RESET;
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Reads all GPIO port pins output data.
- /// @param gpio: select the GPIO peripheral.
- /// @retval GPIO port output data value.
- ////////////////////////////////////////////////////////////////////////////////
- u16 GPIO_ReadOutputData(GPIO_TypeDef* gpio)
- {
- return gpio->ODR;
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Sets the selected GPIO port pin.
- /// @param gpio: where x can be (A..D) to select the GPIO peripheral.
- /// @param pin: specifies the port pins to be written.
- /// This parameter can be any combination of GPIO_Pin_x where x can be
- /// (0..15).
- /// @retval None.
- ////////////////////////////////////////////////////////////////////////////////
- void GPIO_SetBits(GPIO_TypeDef* gpio, u16 pin)
- {
- gpio->BSRR = pin;
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Clears the selected GPIO port bit.
- /// @param gpio: where x can be (A..D) to select the GPIO peripheral.
- /// @param pin: specifies the port pins to be written.
- /// This parameter can be any combination of GPIO_Pin_x where x can be
- /// (0..15).
- /// @retval None.
- ////////////////////////////////////////////////////////////////////////////////
- void GPIO_ResetBits(GPIO_TypeDef* gpio, u16 pin)
- {
- gpio->BRR = pin;
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Sets or clears the selected GPIO port pin.
- /// @param gpio: select the GPIO peripheral.
- /// @param pin: specifies the port bit to be written.
- /// This parameter can be one of GPIO_Pin_x where x can be (0..15).
- /// @param value: specifies the value to be written to the selected bit.
- /// This parameter can be one of the BitAction enum values:
- /// @arg Bit_RESET: to clear the port pin
- /// @arg Bit_SET: to set the port pin
- /// @retval None.
- ////////////////////////////////////////////////////////////////////////////////
- void GPIO_WriteBit(GPIO_TypeDef* gpio, u16 pin, BitAction value)
- {
- (value) ? (gpio->BSRR = pin) : (gpio->BRR = pin);
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Writes data to all GPIO port pins.
- /// @param gpio: where x can be (A..D) to select the GPIO peripheral.
- /// @param value: specifies the value to be written to the port output data
- /// register.
- /// @retval None.
- ////////////////////////////////////////////////////////////////////////////////
- void GPIO_Write(GPIO_TypeDef* gpio, u16 value)
- {
- gpio->ODR = value;
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Locks GPIO Pins configuration.
- /// @param gpio: to select the GPIO peripheral.
- /// @param pin: specifies the port bit to be written.
- /// This parameter can be any combination of GPIO_Pin_x where x can be
- /// (0..15).
- /// @param state: new lock state of the port pin.
- /// This parameter can be: ENABLE or DISABLE.
- /// @retval None.
- ////////////////////////////////////////////////////////////////////////////////
- void GPIO_PinLock(GPIO_TypeDef* gpio, u16 pin, FunctionalState state)
- {
- (state) ? (gpio->LCKR |= pin) : (gpio->LCKR &= ~pin);
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Locks GPIO Pins configuration registers until next system reset.
- /// @param gpio: to select the GPIO peripheral.
- /// @param pin: specifies the port bit to be written.
- /// This parameter can be any combination of GPIO_Pin_x where x can be
- /// (0..15).
- /// @retval None.
- ////////////////////////////////////////////////////////////////////////////////
- void GPIO_PinLockConfig(GPIO_TypeDef* gpio, u16 pin)
- {
- gpio->LCKR = GPIO_LCKR_LCKK | pin;
- gpio->LCKR = pin;
- gpio->LCKR = GPIO_LCKR_LCKK | pin;
- gpio->LCKR;
- gpio->LCKR;
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Enables or disables the port pin remapping.
- /// @param remap: selects the pin to remap.
- /// @param mask: the corresponding remapping mask of the remapping pin.
- /// @param state: new state of the port pin remapping.
- /// This parameter can be: ENABLE or DISABLE.
- /// @retval None.
- ////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Writes data to the specified GPIO data port.
- /// @param gpio: select the GPIO peripheral.
- /// @param pin: specifies the pin for the Alternate function.
- /// This parameter can be GPIO_PinSourcex where x can be (0..15) for
- /// GPIOA, GPIOB, GPIOD and (0..12) for GPIOC .
- /// @param alternate_function: selects the pin to used as Alternate function.
- /// This parameter can be the GPIO_AF_x where x can be (0..7).
- /// @note The pin should be used for Digital IP.
- /// @retval None.
- ////////////////////////////////////////////////////////////////////////////////
- void GPIO_PinAFConfig(GPIO_TypeDef* gpio, u8 pin, u8 alternate_function)
- {
- u8 shift = (pin & 0x07) * 4;
- u32* ptr = (pin < 8) ? (u32*)&gpio->AFRL : (u32*)&gpio->AFRH;
- *ptr = (*ptr & ~(0x0F << shift)) | (alternate_function << shift);
- }
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief Set the remap function and AF function of the GPIO pin.
- /// @param gpio:select the GPIO peripheral.
- /// @param pin: specifies the pin for the Alternate function.
- /// This parameter can be GPIO_Pin_x where x can be (0..15) for
- /// GPIOA, GPIOB, GPIOD and (0..12) for GPIOC .
- /// @param remap: selects the pin to remap.
- /// @param alternate_function: selects the pin to used as Alternate function.
- /// This parameter can be the GPIO_AF_x where x can be (0..7).
- /// @note The pin should be used for Digital IP.
- /// @retval None.
- ////////////////////////////////////////////////////////////////////////////////
- void exGPIO_PinAFConfig(GPIO_TypeDef* gpio, u16 pin, s32 remap, s8 alternate_function)
- {
- u8 i;
- u8 shift;
- u32* ptr;
- if (alternate_function >= 0) {
- for (i = 0; i < 32; i++) {
- if (pin & 0x01) {
- pin = i;
- break;
- }
- pin >>= 1;
- }
- shift = (pin & 0x07) * 4;
- ptr = (pin < 8) ? (u32*)&gpio->AFRL : (u32*)&gpio->AFRH;
- *ptr = (*ptr & ~(0x0F << shift)) | (alternate_function << shift);
- }
- }
- /// @}
- /// @}
- /// @}
|