查看: 2506|回复: 0

GD32 GPIO操作总结 - 如果觉得不错,请顶起,让更多人看到!

[复制链接]
  • TA的每日心情
    慵懒
    2019-12-17 09:34
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2016-2-14 12:58:28 | 显示全部楼层 |阅读模式
    分享到:
    设置IO口DOR寄存器法:输出寄存器法置位和清零bit
    #include <gd32f20x.h>
    #include <gd32f20x_gpio.h>
    int main(void)
    {
                    GPIO_TypeDef * GPIO_X;                        //定义IO口指针
                    GPIO_X = GPIOD;                                        //指向PD口
                    RCC->APB2CCR |= (1<<5);                //使能PD时钟
                    GPIO_X->CTLR2 &= ~(1<<14);        //设置PD.11为输出,最大2M速率
                    GPIO_X->CTLR2 |= (1<<13);   
                    while(1)
                    {
                                    GPIO_X->DOR         |= (1<<11);         //PD.11=1
                                    GPIO_X->DOR         &= ~(1<<11);         //PD.11=0
                    }
                    return 0;
    }
    设置IO口BOR和BCR寄存器法:
    1.BOR端口操作寄存器可对DOR输出寄存器进行1/0设置。
    高16位:CRx=1,对应设置bit=0;
    低16位:BORx=1, 对应设置bit=1;
    如果传给BOR寄存器的“设置值”清零位和位置位都是1时,BORx设置有效!
    2.BCR端口位清零寄存器可对DOR输出寄存器进行清零设置。
    #include <gd32f20x.h>
    #include <gd32f20x_gpio.h>
    int main(void)
    {
                    GPIO_TypeDef * GPIO_X;                        //定义IO口指针
                    GPIO_X = GPIOD;                                        //指向PD口
                    RCC->APB2CCR |= (1<<5);                //使能PD时钟
                    GPIO_X->CTLR2 &= ~(1<<14);        //设置PD.11为输出,最大2M速率
                    GPIO_X->CTLR2 |= (1<<13);   
                    while(1)
                    {
    //                                GPIO_X->BOR         |= (1<<11) + (1<<(11+16));        //PD.11=1
                                    GPIO_X->BOR         |= (1<<11);                //PD.11=1
                                    GPIO_X->BOR         |= (1<<(11+16));        //PD.11=0
                                    GPIO_X->BOR         |= (1<<11);         //PD.11=1
                                    GPIO_X->BCR         |= (1<<11);         //PD.11=0
                    }
                    return 0;
    }
    设置IO口BOR寄存器法:多个位同时操作置位或清零
    #include <gd32f20x.h>
    #include <gd32f20x_gpio.h>
    int main(void)
    {
                    GPIO_TypeDef * GPIO_X;                        //定义IO口指针
                    GPIO_X = GPIOD;                                        //指向PD口
                    RCC->APB2CCR |= (1<<5);                                //使能PD时钟
    GPIO_X->CTLR2 &= ~((1<<14) | (1<<18));        //设置PD.11和PD.12为输出
                    GPIO_X->CTLR2 |= (1<<13) | (1<<17);   
                    while(1)
                    {
                                    GPIO_X->BOR         |= (1<<11) | (1<<(12+16));        //PD.11=1, PD.12=0
                                    GPIO_X->BOR         |= (1<<(11+16)) | (1<<12);        //PD.11=0, PD.12=1
                    }
                    return 0;
    }
    设置IO口置位和复位库函数法:可多个位同时操作
    #include <gd32f20x.h>
    #define LED1 GPIO_PIN_11
    #define LED2 GPIO_PIN_12
    #define LED3 GPIO_PIN_13
    #define LED   (LED1 | LED2 | LED3)
    int main(void)
    {               
                    //初始化LED参数: 端口PD.11, PD.12, PD.13, 输出速率2M, 输出模式推挽输出
                    GPIO_InitPara LED_cf={LED,GPIO_SPEED_2MHZ, GPIO_MODE_OUT_PP};
                    RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_GPIOD,ENABLE);        //使能PD时钟
                    GPIO_Init(GPIOD, &LED_cf);        //初始化PD端口
                    while(1)
                    {
                                    GPIO_SetBits(GPIOD,LED);                //PD.11=1, PD.12=1, PD.13=1               
                                    GPIO_ResetBits(GPIOD, LED);        //PD.11=0, PD.12=0, PD.13=0      
                    }      
                    return 0;
    }
    设置IO口写位库函数法: 可多个位同时操作置位或清零
    #include <gd32f20x.h>
    #define LED1 GPIO_PIN_11
    #define LED2 GPIO_PIN_12
    #define LED3 GPIO_PIN_13
    #define LED   (LED1 | LED2 | LED3)
    int main(void)
    {               
                    //初始化LED参数: 端口PD.11, PD.12, PD.13, 输出速率2M, 输出模式推挽输出
                    GPIO_InitPara LED_cf={LED,GPIO_SPEED_2MHZ, GPIO_MODE_OUT_PP};
                    RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_GPIOD,ENABLE);        //使能PD时钟
                    GPIO_Init(GPIOD, &LED_cf);        //初始化PD端口
                    while(1)
                    {
                                    GPIO_WriteBit(GPIOD, LED, Bit_SET);                //PD.11=1, PD.12=1, PD.13=1      
                                    GPIO_WriteBit(GPIOD, LED, Bit_RESET);        //PD.11=0, PD.12=0, PD.13=0      
                                    GPIO_WriteBit(GPIOD, LED1, 1);                //PD.11=1, PD.12=0, PD.13=0               
                                    GPIO_WriteBit(GPIOD, LED1, 0);                //PD.11=0, PD.12=0, PD.13=0      
                    }      
                    return 0;
    }
    设置IO口写端口库函数法: 可多个位同时操作置位和清零
    #include <gd32f20x.h>
    #define LED1 GPIO_PIN_11
    #define LED2 GPIO_PIN_12
    #define LED3 GPIO_PIN_13
    #define LED                (LED1 | LED2 | LED3)
    int main(void)
    {               
                    //初始化LED参数: 端口PD.11, PD.12, PD.13, 输出速率2M, 输出模式推挽输出
                    GPIO_InitPara LED_cf={LED,GPIO_SPEED_2MHZ, GPIO_MODE_OUT_PP};
                    RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_GPIOD,ENABLE);        //使能PD时钟
                    GPIO_Init(GPIOD, &LED_cf);        //初始化PD端口
                    while(1)
                    {
                            GPIO_WritePort(GPIOD, GPIOD->DOR | LED);        //PD.11=1, PD.12=1, PD.13=1
                            GPIO_WritePort(GPIOD, GPIOD->DOR & (~LED));        //PD.11=0, PD.12=0, PD.13=0
                            GPIO_WritePort(GPIOD, (GPIOD->DOR | LED1) & (~LED2));//PD.11=1, PD.12=0, PD.13=0
                            GPIO_WritePort(GPIOD, (~LED1) & (GPIOD->DOR | LED2));//PD.11=0, PD.12=1, PD.13=0
                    }      
                    return 0;
    }
    位绑定操作法:
    #include <gd32f20x.h>
    #define LED1 GPIO_PIN_11
    #define LED2 GPIO_PIN_12
    #define LED3 GPIO_PIN_13
    #define LED                (LED1 | LED2 | LED3)
    int main(void)
    {               
                    //初始化LED参数: 端口PD.11, PD.12, PD.13, 输出速率2M, 输出模式推挽输出
                    GPIO_InitPara LED_cf={LED,GPIO_SPEED_2MHZ, GPIO_MODE_OUT_PP};
                    RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_GPIOD,ENABLE);        //使能PD时钟
                    GPIO_Init(GPIOD, &LED_cf);        //初始化PD端口
                    while(1)
                    {
                                    (*((u32*)0x422281AC))=1;        //PD.11=1
                                    (*((u32*)0x422281AC))=0;        //PD.11=0
                                    (*((u32*)0x422281B0))=1;        //PD.12=1
                                    (*((u32*)0x422281B0))=0;        //PD.12=0
                                    (*((u32*)0x422281B4))=1;        //PD.13=1
                                    (*((u32*)0x422281B4))=0;        //PD.13=0
                    }      
                    return 0;
    }
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /5 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-12-19 23:27 , Processed in 0.115935 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.