123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583 |
- #include "gd32f30x_gpio.h"
- #define AFIO_EXTI_SOURCE_MASK ((uint8_t)0x03U)
- #define AFIO_EXTI_SOURCE_FIELDS ((uint8_t)0x04U)
- #define LSB_16BIT_MASK ((uint16_t)0xFFFFU)
- #define PCF_POSITION_MASK ((uint32_t)0x000F0000U)
- #define PCF_SWJCFG_MASK ((uint32_t)0xF8FFFFFFU)
- #define PCF_LOCATION1_MASK ((uint32_t)0x00200000U)
- #define PCF_LOCATION2_MASK ((uint32_t)0x00100000U)
- #define AFIO_PCF1_FIELDS ((uint32_t)0x80000000U)
- #define GPIO_OUTPUT_PORT_OFFSET ((uint32_t)4U)
- void gpio_deinit(uint32_t gpio_periph)
- {
- switch(gpio_periph){
- case GPIOA:
-
- rcu_periph_reset_enable(RCU_GPIOARST);
- rcu_periph_reset_disable(RCU_GPIOARST);
- break;
- case GPIOB:
-
- rcu_periph_reset_enable(RCU_GPIOBRST);
- rcu_periph_reset_disable(RCU_GPIOBRST);
- break;
- case GPIOC:
-
- rcu_periph_reset_enable(RCU_GPIOCRST);
- rcu_periph_reset_disable(RCU_GPIOCRST);
- break;
- case GPIOD:
-
- rcu_periph_reset_enable(RCU_GPIODRST);
- rcu_periph_reset_disable(RCU_GPIODRST);
- break;
- case GPIOE:
-
- rcu_periph_reset_enable(RCU_GPIOERST);
- rcu_periph_reset_disable(RCU_GPIOERST);
- break;
- case GPIOF:
-
- rcu_periph_reset_enable(RCU_GPIOFRST);
- rcu_periph_reset_disable(RCU_GPIOFRST);
- break;
- case GPIOG:
-
- rcu_periph_reset_enable(RCU_GPIOGRST);
- rcu_periph_reset_disable(RCU_GPIOGRST);
- break;
- default:
- break;
- }
- }
- void gpio_afio_deinit(void)
- {
- rcu_periph_reset_enable(RCU_AFRST);
- rcu_periph_reset_disable(RCU_AFRST);
- }
- void gpio_init(uint32_t gpio_periph, uint32_t mode, uint32_t speed, uint32_t pin)
- {
- uint16_t i;
- uint32_t temp_mode = 0U;
- uint32_t reg = 0U;
-
- temp_mode = (uint32_t)(mode & ((uint32_t)0x0FU));
-
-
- if(((uint32_t)0x00U) != ((uint32_t)mode & ((uint32_t)0x10U))){
-
- if(GPIO_OSPEED_MAX == (uint32_t)speed){
- temp_mode |= (uint32_t)0x03U;
-
- GPIOx_SPD(gpio_periph) |= (uint32_t)pin ;
- }else{
-
- temp_mode |= (uint32_t)speed;
- }
- }
-
- for(i = 0U;i < 8U;i++){
- if((1U << i) & pin){
- reg = GPIO_CTL0(gpio_periph);
-
-
- reg &= ~GPIO_MODE_MASK(i);
-
- reg |= GPIO_MODE_SET(i, temp_mode);
-
-
- if(GPIO_MODE_IPD == mode){
-
- GPIO_BC(gpio_periph) = (uint32_t)((1U << i) & pin);
- }else{
-
- if(GPIO_MODE_IPU == mode){
- GPIO_BOP(gpio_periph) = (uint32_t)((1U << i) & pin);
- }
- }
-
- GPIO_CTL0(gpio_periph) = reg;
- }
- }
-
- for(i = 8U;i < 16U;i++){
- if((1U << i) & pin){
- reg = GPIO_CTL1(gpio_periph);
-
-
- reg &= ~GPIO_MODE_MASK(i - 8U);
-
- reg |= GPIO_MODE_SET(i - 8U, temp_mode);
-
-
- if(GPIO_MODE_IPD == mode){
-
- GPIO_BC(gpio_periph) = (uint32_t)((1U << i) & pin);
- }else{
-
- if(GPIO_MODE_IPU == mode){
- GPIO_BOP(gpio_periph) = (uint32_t)((1U << i) & pin);
- }
- }
-
- GPIO_CTL1(gpio_periph) = reg;
- }
- }
- }
- void gpio_bit_set(uint32_t gpio_periph,uint32_t pin)
- {
- GPIO_BOP(gpio_periph) = (uint32_t)pin;
- }
- void gpio_bit_reset(uint32_t gpio_periph,uint32_t pin)
- {
- GPIO_BC(gpio_periph) = (uint32_t)pin;
- }
- 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;
- }
- }
- void gpio_port_write(uint32_t gpio_periph,uint16_t data)
- {
- GPIO_OCTL(gpio_periph) = (uint32_t)data;
- }
- 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;
- }
- }
- uint16_t gpio_input_port_get(uint32_t gpio_periph)
- {
- return (uint16_t)(GPIO_ISTAT(gpio_periph));
- }
- 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;
- }
- }
- uint16_t gpio_output_port_get(uint32_t gpio_periph)
- {
- return ((uint16_t)GPIO_OCTL(gpio_periph));
- }
- void gpio_pin_remap_config(uint32_t remap, ControlStatus newvalue)
- {
- uint32_t remap1 = 0U, remap2 = 0U, temp_reg = 0U, temp_mask = 0U;
- if(((uint32_t)0x80000000U) == (remap & 0x80000000U)){
-
- temp_reg = AFIO_PCF1;
- }else{
-
- temp_reg = AFIO_PCF0;
- }
- temp_mask = (remap & PCF_POSITION_MASK) >> 0x10U;
- remap1 = remap & LSB_16BIT_MASK;
-
- if((PCF_LOCATION1_MASK | PCF_LOCATION2_MASK) == (remap & (PCF_LOCATION1_MASK | PCF_LOCATION2_MASK))){
- temp_reg &= PCF_SWJCFG_MASK;
- AFIO_PCF0 &= PCF_SWJCFG_MASK;
- }else if(PCF_LOCATION2_MASK == (remap & PCF_LOCATION2_MASK)){
- remap2 = ((uint32_t)0x03U) << temp_mask;
- temp_reg &= ~remap2;
- temp_reg |= ~PCF_SWJCFG_MASK;
- }else{
- temp_reg &= ~(remap1 << ((remap >> 0x15U)*0x10U));
- temp_reg |= ~PCF_SWJCFG_MASK;
- }
-
-
- if(DISABLE != newvalue){
- temp_reg |= (remap1 << ((remap >> 0x15U)*0x10U));
- }
-
- if(AFIO_PCF1_FIELDS == (remap & AFIO_PCF1_FIELDS)){
-
- AFIO_PCF1 = temp_reg;
- }else{
-
- AFIO_PCF0 = temp_reg;
- }
- }
- #ifdef GD32F30X_CL
- void gpio_ethernet_phy_select(uint32_t enet_sel)
- {
-
- AFIO_PCF0 &= (uint32_t)(~AFIO_PCF0_ENET_PHY_SEL);
-
- AFIO_PCF0 |= (uint32_t)enet_sel;
- }
- #endif
- void gpio_exti_source_select(uint8_t output_port, uint8_t output_pin)
- {
- uint32_t source = 0U;
- source = ((uint32_t)0x0FU) << (AFIO_EXTI_SOURCE_FIELDS * (output_pin & AFIO_EXTI_SOURCE_MASK));
-
- if(GPIO_PIN_SOURCE_4 > output_pin){
-
- AFIO_EXTISS0 &= ~source;
- AFIO_EXTISS0 |= (((uint32_t)output_port) << (AFIO_EXTI_SOURCE_FIELDS * (output_pin & AFIO_EXTI_SOURCE_MASK)));
- }else if(GPIO_PIN_SOURCE_8 > output_pin){
-
- AFIO_EXTISS1 &= ~source;
- AFIO_EXTISS1 |= (((uint32_t)output_port) << (AFIO_EXTI_SOURCE_FIELDS * (output_pin & AFIO_EXTI_SOURCE_MASK)));
- }else if(GPIO_PIN_SOURCE_12 > output_pin){
-
- AFIO_EXTISS2 &= ~source;
- AFIO_EXTISS2 |= (((uint32_t)output_port) << (AFIO_EXTI_SOURCE_FIELDS * (output_pin & AFIO_EXTI_SOURCE_MASK)));
- }else{
-
- AFIO_EXTISS3 &= ~source;
- AFIO_EXTISS3 |= (((uint32_t)output_port) << (AFIO_EXTI_SOURCE_FIELDS * (output_pin & AFIO_EXTI_SOURCE_MASK)));
- }
- }
- void gpio_event_output_config(uint8_t output_port, uint8_t output_pin)
- {
- uint32_t reg = 0U;
- reg = AFIO_EC;
-
-
- reg &= (uint32_t)(~(AFIO_EC_PORT|AFIO_EC_PIN));
-
- reg |= (uint32_t)((uint32_t)output_port << GPIO_OUTPUT_PORT_OFFSET);
- reg |= (uint32_t)output_pin;
-
- AFIO_EC = reg;
- }
- void gpio_event_output_enable(void)
- {
- AFIO_EC |= AFIO_EC_EOE;
- }
- void gpio_event_output_disable(void)
- {
- AFIO_EC &= (uint32_t)(~AFIO_EC_EOE);
- }
- void gpio_pin_lock(uint32_t gpio_periph,uint32_t pin)
- {
- uint32_t lock = 0x00010000U;
- lock |= pin;
-
- 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);
- }
- void gpio_compensation_config(uint32_t compensation)
- {
- uint32_t reg;
- reg = AFIO_CPSCTL;
-
- reg &= ~AFIO_CPSCTL_CPS_EN;
- AFIO_CPSCTL = (reg | compensation);
- }
- FlagStatus gpio_compensation_flag_get(void)
- {
- if(((uint32_t)RESET) != (AFIO_CPSCTL & AFIO_CPSCTL_CPS_RDY)){
- return SET;
- }else{
- return RESET;
- }
- }
|