123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433 |
- /*!
- \file gd32f4xx_gpio.c
- \brief GPIO driver
- \version 2016-08-15, V1.0.0, firmware for GD32F4xx
- \version 2018-12-12, V2.0.0, firmware for GD32F4xx
- \version 2020-09-30, V2.1.0, firmware for GD32F4xx
- */
- /*
- Copyright (c) 2020, GigaDevice Semiconductor Inc.
- Redistribution and use in source and binary forms, with or without modification,
- are permitted provided that the following conditions are met:
- 1. Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
- 3. Neither the name of the copyright holder nor the names of its contributors
- may be used to endorse or promote products derived from this software without
- specific prior written permission.
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
- INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- OF SUCH DAMAGE.
- */
- #include "gd32f4xx_gpio.h"
- /*!
- \brief reset GPIO port
- \param[in] gpio_periph: GPIO port
- only one parameter can be selected which is shown as below:
- \arg GPIOx(x = A,B,C,D,E,F,G,H,I)
- \param[out] none
- \retval none
- */
- void gpio_deinit(uint32_t gpio_periph)
- {
- switch(gpio_periph){
- case GPIOA:
- /* reset GPIOA */
- rcu_periph_reset_enable(RCU_GPIOARST);
- rcu_periph_reset_disable(RCU_GPIOARST);
- break;
- case GPIOB:
- /* reset GPIOB */
- rcu_periph_reset_enable(RCU_GPIOBRST);
- rcu_periph_reset_disable(RCU_GPIOBRST);
- break;
- case GPIOC:
- /* reset GPIOC */
- rcu_periph_reset_enable(RCU_GPIOCRST);
- rcu_periph_reset_disable(RCU_GPIOCRST);
- break;
- case GPIOD:
- /* reset GPIOD */
- rcu_periph_reset_enable(RCU_GPIODRST);
- rcu_periph_reset_disable(RCU_GPIODRST);
- break;
- case GPIOE:
- /* reset GPIOE */
- rcu_periph_reset_enable(RCU_GPIOERST);
- rcu_periph_reset_disable(RCU_GPIOERST);
- break;
- case GPIOF:
- /* reset GPIOF */
- rcu_periph_reset_enable(RCU_GPIOFRST);
- rcu_periph_reset_disable(RCU_GPIOFRST);
- break;
- case GPIOG:
- /* reset GPIOG */
- rcu_periph_reset_enable(RCU_GPIOGRST);
- rcu_periph_reset_disable(RCU_GPIOGRST);
- break;
- case GPIOH:
- /* reset GPIOH */
- rcu_periph_reset_enable(RCU_GPIOHRST);
- rcu_periph_reset_disable(RCU_GPIOHRST);
- break;
- case GPIOI:
- /* reset GPIOI */
- rcu_periph_reset_enable(RCU_GPIOIRST);
- rcu_periph_reset_disable(RCU_GPIOIRST);
- break;
- default:
- break;
- }
- }
- /*!
- \brief set GPIO mode
- \param[in] gpio_periph: GPIO port
- only one parameter can be selected which is shown as below:
- \arg GPIOx(x = A,B,C,D,E,F,G,H,I)
- \param[in] mode: GPIO pin mode
- \arg GPIO_MODE_INPUT: input mode
- \arg GPIO_MODE_OUTPUT: output mode
- \arg GPIO_MODE_AF: alternate function mode
- \arg GPIO_MODE_ANALOG: analog mode
- \param[in] pull_up_down: GPIO pin with pull-up or pull-down resistor
- \arg GPIO_PUPD_NONE: floating mode, no pull-up and pull-down resistors
- \arg GPIO_PUPD_PULLUP: with pull-up resistor
- \arg GPIO_PUPD_PULLDOWN:with pull-down resistor
- \param[in] pin: GPIO pin
- one or more parameters can be selected which are shown as below:
- \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL
- \param[out] none
- \retval none
- */
- void gpio_mode_set(uint32_t gpio_periph, uint32_t mode, uint32_t pull_up_down, uint32_t pin)
- {
- uint16_t i;
- uint32_t ctl, pupd;
- ctl = GPIO_CTL(gpio_periph);
- pupd = GPIO_PUD(gpio_periph);
- for(i = 0U;i < 16U;i++){
- if((1U << i) & pin){
- /* clear the specified pin mode bits */
- ctl &= ~GPIO_MODE_MASK(i);
- /* set the specified pin mode bits */
- ctl |= GPIO_MODE_SET(i, mode);
- /* clear the specified pin pupd bits */
- pupd &= ~GPIO_PUPD_MASK(i);
- /* set the specified pin pupd bits */
- pupd |= GPIO_PUPD_SET(i, pull_up_down);
- }
- }
- GPIO_CTL(gpio_periph) = ctl;
- GPIO_PUD(gpio_periph) = pupd;
- }
- /*!
- \brief set GPIO output type and speed
- \param[in] gpio_periph: GPIO port
- only one parameter can be selected which is shown as below:
- \arg GPIOx(x = A,B,C,D,E,F,G,H,I)
- \param[in] otype: GPIO pin output mode
- \arg GPIO_OTYPE_PP: push pull mode
- \arg GPIO_OTYPE_OD: open drain mode
- \param[in] speed: GPIO pin output max speed
- \arg GPIO_OSPEED_2MHZ: output max speed 2MHz
- \arg GPIO_OSPEED_25MHZ: output max speed 25MHz
- \arg GPIO_OSPEED_50MHZ: output max speed 50MHz
- \arg GPIO_OSPEED_200MHZ: output max speed 200MHz
- \param[in] pin: GPIO pin
- one or more parameters can be selected which are shown as below:
- \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL
- \param[out] none
- \retval none
- */
- void gpio_output_options_set(uint32_t gpio_periph, uint8_t otype, uint32_t speed, uint32_t pin)
- {
- uint16_t i;
- uint32_t ospeedr;
- if(GPIO_OTYPE_OD == otype){
- GPIO_OMODE(gpio_periph) |= (uint32_t)pin;
- }else{
- GPIO_OMODE(gpio_periph) &= (uint32_t)(~pin);
- }
- /* get the specified pin output speed bits value */
- ospeedr = GPIO_OSPD(gpio_periph);
- for(i = 0U;i < 16U;i++){
- if((1U << i) & pin){
- /* clear the specified pin output speed bits */
- ospeedr &= ~GPIO_OSPEED_MASK(i);
- /* set the specified pin output speed bits */
- ospeedr |= GPIO_OSPEED_SET(i,speed);
- }
- }
- GPIO_OSPD(gpio_periph) = ospeedr;
- }
- /*!
- \brief set GPIO pin bit
- \param[in] gpio_periph: GPIO port
- only one parameter can be selected which is shown as below:
- \arg GPIOx(x = A,B,C,D,E,F,G,H,I)
- \param[in] pin: GPIO pin
- one or more parameters can be selected which are shown as below:
- \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL
- \param[out] none
- \retval none
- */
- void gpio_bit_set(uint32_t gpio_periph, uint32_t pin)
- {
- GPIO_BOP(gpio_periph) = (uint32_t)pin;
- }
- /*!
- \brief reset GPIO pin bit
- \param[in] gpio_periph: GPIO port
- only one parameter can be selected which is shown as below:
- \arg GPIOx(x = A,B,C,D,E,F,G,H,I)
- \param[in] pin: GPIO pin
- one or more parameters can be selected which are shown as below:
- \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL
- \param[out] none
- \retval none
- */
- void gpio_bit_reset(uint32_t gpio_periph, uint32_t pin)
- {
- GPIO_BC(gpio_periph) = (uint32_t)pin;
- }
- /*!
- \brief write data to the specified GPIO pin
- \param[in] gpio_periph: GPIO port
- only one parameter can be selected which is shown as below:
- \arg GPIOx(x = A,B,C,D,E,F,G,H,I)
- \param[in] pin: GPIO pin
- one or more parameters can be selected which are shown as below:
- \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL
- \param[in] bit_value: SET or RESET
- \arg RESET: clear the port pin
- \arg SET: set the port pin
- \param[out] none
- \retval none
- */
- void gpio_bit_write(uint32_t gpio_periph, uint32_t pin, bit_status bit_value)
- {
- if(RESET != bit_value){
- GPIO_BOP(gpio_periph) = (uint32_t)pin;
- }else{
- GPIO_BC(gpio_periph) = (uint32_t)pin;
- }
- }
- /*!
- \brief write data to the specified GPIO port
- \param[in] gpio_periph: GPIO port
- only one parameter can be selected which is shown as below:
- \arg GPIOx(x = A,B,C,D,E,F,G,H,I)
- \param[in] data: specify the value to be written to the port output control register
- \param[out] none
- \retval none
- */
- void gpio_port_write(uint32_t gpio_periph, uint16_t data)
- {
- GPIO_OCTL(gpio_periph) = (uint32_t)data;
- }
- /*!
- \brief get GPIO pin input status
- \param[in] gpio_periph: GPIO port
- only one parameter can be selected which is shown as below:
- \arg GPIOx(x = A,B,C,D,E,F,G,H,I)
- \param[in] pin: GPIO pin
- one or more parameters can be selected which are shown as below:
- \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL
- \param[out] none
- \retval input status of GPIO pin: SET or RESET
- */
- FlagStatus gpio_input_bit_get(uint32_t gpio_periph, uint32_t pin)
- {
- if((uint32_t)RESET != (GPIO_ISTAT(gpio_periph)&(pin))){
- return SET;
- }else{
- return RESET;
- }
- }
- /*!
- \brief get GPIO all pins input status
- \param[in] gpio_periph: GPIO port
- only one parameter can be selected which is shown as below:
- \arg GPIOx(x = A,B,C,D,E,F,G,H,I)
- \param[out] none
- \retval input status of GPIO all pins
- */
- uint16_t gpio_input_port_get(uint32_t gpio_periph)
- {
- return ((uint16_t)GPIO_ISTAT(gpio_periph));
- }
- /*!
- \brief get GPIO pin output status
- \param[in] gpio_periph: GPIO port
- only one parameter can be selected which is shown as below:
- \arg GPIOx(x = A,B,C,D,E,F,G,H,I)
- \param[in] pin: GPIO pin
- one or more parameters can be selected which are shown as below:
- \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL
- \param[out] none
- \retval output status of GPIO pin: SET or RESET
- */
- FlagStatus gpio_output_bit_get(uint32_t gpio_periph, uint32_t pin)
- {
- if((uint32_t)RESET !=(GPIO_OCTL(gpio_periph)&(pin))){
- return SET;
- }else{
- return RESET;
- }
- }
- /*!
- \brief get GPIO all pins output status
- \param[in] gpio_periph: GPIO port
- only one parameter can be selected which is shown as below:
- \arg GPIOx(x = A,B,C,D,E,F,G,H,I)
- \param[out] none
- \retval output status of GPIO all pins
- */
- uint16_t gpio_output_port_get(uint32_t gpio_periph)
- {
- return ((uint16_t)GPIO_OCTL(gpio_periph));
- }
- /*!
- \brief set GPIO alternate function
- \param[in] gpio_periph: GPIO port
- only one parameter can be selected which is shown as below:
- \arg GPIOx(x = A,B,C,D,E,F,G,H,I)
- \param[in] alt_func_num: GPIO pin af function
- \arg GPIO_AF_0: SYSTEM
- \arg GPIO_AF_1: TIMER0, TIMER1
- \arg GPIO_AF_2: TIMER2, TIMER3, TIMER4
- \arg GPIO_AF_3: TIMER7, TIMER8, TIMER9, TIMER10
- \arg GPIO_AF_4: I2C0, I2C1, I2C2
- \arg GPIO_AF_5: SPI0, SPI1, SPI2, SPI3, SPI4, SPI5
- \arg GPIO_AF_6: SPI1, SPI2, SAI0
- \arg GPIO_AF_7: USART0, USART1, USART2
- \arg GPIO_AF_8: UART3, UART4, USART5, UART6, UART7
- \arg GPIO_AF_9: CAN0, CAN1, TLI, TIMER11, TIMER12, TIMER13
- \arg GPIO_AF_10: USB_FS, USB_HS
- \arg GPIO_AF_11: ENET
- \arg GPIO_AF_12: EXMC, SDIO, USB_HS
- \arg GPIO_AF_13: DCI
- \arg GPIO_AF_14: TLI
- \arg GPIO_AF_15: EVENTOUT
- \param[in] pin: GPIO pin
- one or more parameters can be selected which are shown as below:
- \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL
- \param[out] none
- \retval none
- */
- void gpio_af_set(uint32_t gpio_periph, uint32_t alt_func_num, uint32_t pin)
- {
- uint16_t i;
- uint32_t afrl, afrh;
- afrl = GPIO_AFSEL0(gpio_periph);
- afrh = GPIO_AFSEL1(gpio_periph);
- for(i = 0U;i < 8U;i++){
- if((1U << i) & pin){
- /* clear the specified pin alternate function bits */
- afrl &= ~GPIO_AFR_MASK(i);
- afrl |= GPIO_AFR_SET(i,alt_func_num);
- }
- }
- for(i = 8U;i < 16U;i++){
- if((1U << i) & pin){
- /* clear the specified pin alternate function bits */
- afrh &= ~GPIO_AFR_MASK(i - 8U);
- afrh |= GPIO_AFR_SET(i - 8U,alt_func_num);
- }
- }
- GPIO_AFSEL0(gpio_periph) = afrl;
- GPIO_AFSEL1(gpio_periph) = afrh;
- }
- /*!
- \brief lock GPIO pin bit
- \param[in] gpio_periph: GPIO port
- only one parameter can be selected which is shown as below:
- \arg GPIOx(x = A,B,C,D,E,F,G,H,I)
- \param[in] pin: GPIO pin
- one or more parameters can be selected which are shown as below:
- \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL
- \param[out] none
- \retval none
- */
- void gpio_pin_lock(uint32_t gpio_periph, uint32_t pin)
- {
- uint32_t lock = 0x00010000U;
- lock |= pin;
- /* lock key writing sequence: write 1->write 0->write 1->read 0->read 1 */
- GPIO_LOCK(gpio_periph) = (uint32_t)lock;
- GPIO_LOCK(gpio_periph) = (uint32_t)pin;
- GPIO_LOCK(gpio_periph) = (uint32_t)lock;
- lock = GPIO_LOCK(gpio_periph);
- lock = GPIO_LOCK(gpio_periph);
- }
- /*!
- \brief toggle GPIO pin status
- \param[in] gpio_periph: GPIO port
- only one parameter can be selected which is shown as below:
- \arg GPIOx(x = A,B,C,D,E,F,G,H,I)
- \param[in] pin: GPIO pin
- one or more parameters can be selected which are shown as below:
- \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL
- \param[out] none
- \retval none
- */
- void gpio_bit_toggle(uint32_t gpio_periph, uint32_t pin)
- {
- GPIO_TG(gpio_periph) = (uint32_t)pin;
- }
- /*!
- \brief toggle GPIO port status
- \param[in] gpio_periph: GPIO port
- only one parameter can be selected which is shown as below:
- \arg GPIOx(x = A,B,C,D,E,F,G,H,I)
- \param[out] none
- \retval none
- */
- void gpio_port_toggle(uint32_t gpio_periph)
- {
- GPIO_TG(gpio_periph) = 0x0000FFFFU;
- }
|