zoukankan      html  css  js  c++  java
  • 漫谈LiteOS之开发板-GPIO(基于GD32450i-EVAL)

    【摘要】 本文主要从GPIO的定义、工作模式、特色、工作场合、以及GD32450i-EVAL开发板的引脚、对应的寄存器以及GPIO的流水灯示例对GPIO加以介绍,希望对你有所帮助。

    1定义

        GPIO(Gennral-purpose input/output)通用型输入输出,即“IO”口、引脚。既然通用也就是说它是芯片上一个干什么都行的引脚。

    2 GD32450i-EVAL引脚说明

        如图1所示GD32450i-EVAL开发板一共有140(16 * 8 + 12)个通用I/O引脚,PA-PI共9 组,其中PA-PH8组中每组有0-15共16个引脚,外加PI0-PI11共12个引脚。

    3 GPIO 工作模式

        输入、输出(推挽或开漏)、外设备用功能、模拟模式。而且都可以配置为上拉、下拉、或无上拉/下拉。除了模拟模式外,都具备大电流驱动能力。

    4 功能

        GPIO主要功能都是依托于寄存器实现,每个通用I/O端口都可以通过控制寄存器配置为输入、输出、备用功能或模拟方式。当选择备用功能时,引脚通过AF使能来选择,当端口配置为输出时,可以通过GPIO输出模式寄存器配置为推挽或开漏模式。输出端口的最大速度可以通过GPIO输出速度寄存器配置,每个端口可以通过上下拉寄存器配置为浮空、上拉、下拉功能。

    4.1 主要寄存器

        (1)#define GPIO_CTL(gpiox)         REG32((gpiox) + 0x00U)      端口控制寄存器

        (2)#define GPIO_OMODE(gpiox)  REG32((gpiox) + 0x04U)      端口输出模式寄存器

        (3)#define GPIO_OSPD(gpiox)       REG32((gpiox) + 0x08U)      端口输出速度寄存器

        (4)#define GPIO_PUD(gpiox)         REG32((gpiox) + 0x0CU)      端口上拉/下拉寄存器

        (5)#define GPIO_ISTAT(gpiox)      REG32((gpiox) + 0x10U)       端口输入状态寄存器

        (6)#define GPIO_OCTL(gpiox)      REG32((gpiox) + 0x14U)       端口输出状态寄存器

        (7)#define GPIO_BOP(gpiox)         REG32((gpiox) + 0x18U)       端口位操作寄存器

        (8)#define GPIO_LOCK(gpiox)      REG32((gpiox) + 0x1CU)      端口配置锁定寄存器:

        (9)#define GPIO_AFSEL0(gpiox)   REG32((gpiox) + 0x20U)      备用功能选择寄存器0

        (10)#define GPIO_AFSEL1(gpiox) REG32((gpiox) + 0x24U)      备用功能选择寄存器1

        (11)#define GPIO_BC(gpiox)         REG32((gpiox) + 0x28U)       位清除寄存器

        (12)#define GPIO_TG(gpiox)         REG32((gpiox) + 0x2CU)       端口位翻转寄存器

    4.2 对应特性

        (1)输入/输出方向控制。

        (2)施密特触发器输入功能使能控制。

        (3)每个引脚都具有弱上拉/下拉功能。

        (4)推挽/开漏输出使能控制。

        (5)置位/复位输出使能。

        (6)输出驱动速度选择。

        (7)模拟输入/输出配置。

        (8)备用功能输入/输出配置。

        (9)端口锁定配置。

        (10)单周期输出翻转功能。

    5 应用场景

        (1)上拉、下拉输入:检测外部信号,如按键等。

        (2)浮空输入模式:由于输入阻抗较大一般用作标准通信协议的I2C、USART的接收端。

        (3)普通推挽输出:输出电平为0和3.3v的场合。

        (4)普通开漏输出:电平不匹配的场合,如需输出5V高电平,需要外部添加上拉电阻,电源5V,GPIO设置为开漏模式,当输出高阻态时,由上拉电阻和电源向外输出5V电平。

        (5)复用模式:根据对应的复用功能选择。

        注意:使用任意一种开漏模式都需要接上拉电阻。

    6 示例

        以流水灯为例,使用GPIO来控制LED灯,GD32450i-EVAL开发板上有三个LED灯,设置间隔200毫秒,循环点亮,然后一起熄灭,循环此过程。

         首先初始化LED时钟,之后配置LED的GPIO引脚,配置好引脚之后对LED灯进行点亮、延时、熄灭即可。

        void  gd_eval_led_init (led_typedef_enum lednum)
    
        {
    
              // 使能LED时钟
    
        eriph_clock_enable(GPIO_CLK[lednum]);
    
        // 设置GPIO模式
    
        gpio_mode_set(GPIO_PORT[lednum], GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,GPIO_PIN[lednum]);
    
        // 设置GPIO输出以及速度
    
            gpio_output_options_set(GPIO_PORT[lednum], GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN[lednum]);
    
             //  操作位清除寄存器
    
            GPIO_BC(GPIO_PORT[lednum]) = GPIO_PIN[lednum];
    
        }

     实现上述对于LED灯的初始化,之后只需要对LED灯和时钟进行操作即可,灯亮使能位操作寄存器,灯灭使能位清除寄存器即可。

        while(1){
    
                gd_eval_led_on(LED1);
    
                delay_1ms(200);
    
                gd_eval_led_on(LED2);
    
                delay_1ms(200);
    
                gd_eval_led_on(LED3);
    
                delay_1ms(200);       
    
                gd_eval_led_off(LED1);
    
                gd_eval_led_off(LED2);
    
                gd_eval_led_off(LED3);
    
                delay_1ms(200);
    
            }

    实验效果如图2所示,具体见附件。

    目录主文链接:https://bbs.huaweicloud.com/blogs/124244

    流水灯视频.rar

    作者:星辰27

  • 相关阅读:
    JavaScript 【引用类型】RegExp类型
    JavaScript【引用类型】Function 类型
    JavaScript【引用方法】归并方法
    JavaScript【引用方法】迭代方法
    JavaScript【引用方法】位置方法
    【华为云技术分享】MongoDB经典故障系列一:数据库频繁启动失败怎么办?
    【华为云技术分享】Python面试的一些心得,与Python练习题分享
    【华为云技术分享】Linux内核发展史 (1)
    【华为云技术分享】Spring Boot 最流行的 16 条实践解读!
    【华为云技术分享】opensuse使用zypper安装软件
  • 原文地址:https://www.cnblogs.com/huaweicloud/p/11861199.html
Copyright © 2011-2022 走看看