当前位置: 首页 > news >正文

HPM6750系列--第九篇 GPIO详解(基本操作)

一、目的

        在之前的博文中我们主要介绍了不同系统不同开发编译调试环境的配置和操作(命令行方式、Visual Studio Code、Segger Embedded Studio for RISC-V),以帮助大家准备好学习环境为目的,但是未涉及到芯片本身以及外设的讲解。

        从本篇开始我们将逐一介绍一些常用的芯片外设模块(GPIO、串口、SPI、网口等等),首当其中的就是最基础的GPIO操作(设置IO方向,进行IO读写操作)。

HPM6750evkmini

二、介绍

        在先楫官网的文档中对GPIO做了相当详细的描述,大家可以参考阅读,下文会针对官网文档进行一个总结性的说明。

        

        ​​​​​​​先楫半导体icon-default.png?t=N7T8http://www.hpmicro.com/resources/resources.html


        GPIO在系统框图中的位置 
系统框图

 

        HPM6750芯片将整个系统划分为三个电源域(系统电源域、电源管理域、电池备份域)。 

        1.IO控制器说明
IO控制器说明
IOC

通用IO控制器

位于系统电源域

管理PA(0-31)、PB(0-31)、PC(0-31)、PD(0-31)、PE(0-31)、PF(0-10)

PIOC

电源管理域IO控制器,功能和通用IOC一致

管理PY(0-11)

BIOC电池备份域IO控制器,功能和通用IOC一致,管理PZ(0-11)

        PIOC和BIOC可以把电源管理域IO(PY)和电池备份域IO(PZ)中的一个或者多个IO映射到系统电源域,之后这些IO就可以由IOC控制。这个我们在以后章节介绍UART时讲解。

        ​​​​​​​

电源管理域IO GPIO控制选择

        IO控制器主要控制这些参数:

  • 外设复用功能映射
  • 输出回送控制(loopback)
  • 模拟功能配置
  • 电压模式控制
  • 开漏设置
  • 施密特触发器
  • 上下拉配置
  • 驱动能力配置

        每个IOC控制的pin都有两个寄存器参数,分别为叫做FUNC_CTL、PAD_CTL,具体的寄存器字段信息如下:

寄存器字段描述
寄存器名称字段功能
FUNC_CTLALT_SELECT[4:0]

外设复用功能映射选择,具体每个IO的映射关系从芯片手册或者SDK源码中可以查阅

ANALOG[8:8]

引脚切换至模拟输入输出功能开关

LOOPBACK[16:16]

输出回送开关

PAD_CTLDS[2:0]

驱动强度选择

PE[4:4]

内部上下拉功能开关

PS[11:11]

内部上下拉电阻选择

SMT[12:12]

输入施密特触发器使能, 此位只对高速引脚可用

OD[13:13]

开漏输出开关

MS[14:14]

引脚供电电压选择, 此位只对高速引脚可用

关于这些描述可以查看官方文档中更加详细的描述,并且在进行在线调试时我们也可以看到这些信息。

        在SDK中我们可以查看每个IO的复用设置信息,例如下图是PB18这个引脚的复用选项。

PB18复用功能
​​​​​​​

        看过我之前文章的小伙伴肯定也看到过下图中调试窗口中各个外设寄存器信息。 

        有了上面的基本知识后,我们再来看下hpm-sdk中关于IO控制器的定义:

        ​​​​​​​ 

 

        HPM_IOC/HPM_PIOC/HPM_BIOC都是IOC_Type类型的结构体指针,IOC_Type结构体内部又是PAD结构体数组,每个数组元素则对应一个IO引脚,每个引脚都有FUNC_CTL和PAD_CTL寄存器。

        从上图可以看到PB.18引脚对应于IOC_Type中的第32+18=50个引脚,即PAD[50]。


        2.GPIO控制说明

        GPIO控制器包括GPIO0/1、FGPIO0/1、PGPIO、BGPIO,其主要功能:

  • 配置IO作为输入或者输出
  • 读取IO的输入状态
  • 设置IO的输出
  • 原子化操作设置IO输出高、低、翻转

        其中GPIO0/1,PGIO,BGPIO 支持配置 GPIO 中断,FGPIO0 和 FGPIO1 不支持生成中断。

        下图是各个GPIO对应的地址信息:

       


 

        上图定义了GPIO_Type结构体类型,其中包括DI(输入寄存器)、DO(输出寄存器)、OE(输入输出方向寄存器)等等。注意DI/DO/OE等都是结构体数组,分别对应着PA/PB/PC等。

         

        DO结构体数组中又定义了VALUE、SET、CLEAR、TOGGLE寄存器,每个寄存器都是32位,每一个bit代表一个引脚。 

         关于VALUE/SET/CLEAR/TOGGLE寄存器描述如下:

        

         

 

         


        3.读取引脚输入高低电平 
/*** @brief   Read target pin level** @param ptr GPIO base address* @param port Port index* @param pin Pin index** @return Pin status mask*/
static inline uint8_t gpio_read_pin(GPIO_Type *ptr, uint32_t port, uint8_t pin)
{return (ptr->DI[port].VALUE & (1 << pin)) >> pin;
}

        假如我们使用GPIO0读取PB.18的值,应该这样调用

uint8_t val = gpio_read_pin(HPM_GPIO0, GPIO_DI_GPIOB, 18);

 


三、实战

        通过上面的介绍大家应该对GPIO有了一个基本印象,下面我们使用代码调试功能帮助大家加深理解。

cd ~/workspace/work/hpm/hello_world
code .

 

        定位到board_turnoff_rgb_led函数,我们查看PB18引脚的FUNC_CTL默认值为0x0;PAD_CTL默认值为0x1010。

         

        在执行过HPM_IOC->PAD[IOC_PAD_PB18].PAD_CTL = pad_ctl;这行代码后PAD_CTL变成了0x810。

        自此GPIO的基本知识点就讲解完毕,大家对着官方文档和调试器调试代码可以进一步加深理解。

相关文章:

  • Github与Gitlab
  • CentOS 7 部署 dnsmasq
  • jpa 修改信息拦截
  • 信息学奥赛一本通 第二章 顺序结构程序设计 第一、二节C语言非C++
  • 【网络编程】-- 04 UDP
  • Windows mysql5.7 执行查询/开启/测试binlog---简易记录
  • 阿木实验室普罗米修斯项目环境配置
  • Centos7部署SVN
  • 基于CNN+数据增强+残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)+数据集+模型(六)
  • 通过css3的锚定滚动属性,实现分页加载时让滚动条不闪动
  • 【Spring Boot】快速入门
  • Modbus转Profinet网关使用方法
  • 100天精通风控建模(原理+Python实现)——第10天:风控建模中主成分析是什么?怎么实现?
  • 2023-12-14 二叉树的最大深度和二叉树的最小深度以及完全二叉树的节点个数
  • uniapp组件map地图组件使用
  • [PHP内核探索]PHP中的哈希表
  • 2019年如何成为全栈工程师?
  • 78. Subsets
  • Docker: 容器互访的三种方式
  • export和import的用法总结
  • Git同步原始仓库到Fork仓库中
  • js对象的深浅拷贝
  • V4L2视频输入框架概述
  • vue-cli在webpack的配置文件探究
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 飞驰在Mesos的涡轮引擎上
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 基于HAProxy的高性能缓存服务器nuster
  • 简单数学运算程序(不定期更新)
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 普通函数和构造函数的区别
  • 算法-插入排序
  • 一道面试题引发的“血案”
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​secrets --- 生成管理密码的安全随机数​
  • (1)(1.9) MSP (version 4.2)
  • (14)Hive调优——合并小文件
  • (ZT)一个美国文科博士的YardLife
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (附源码)ssm高校实验室 毕业设计 800008
  • (三十五)大数据实战——Superset可视化平台搭建
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • ./configure、make、make install 命令
  • .equals()到底是什么意思?
  • .NET BackgroundWorker
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .net 微服务 服务保护 自动重试 Polly
  • .NET 指南:抽象化实现的基类
  • .Net7 环境安装配置
  • .net项目IIS、VS 附加进程调试
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • ??如何把JavaScript脚本中的参数传到java代码段中
  • @JsonSerialize注解的使用
  • [1525]字符统计2 (哈希)SDUT
  • [2016.7 Day.4] T1 游戏 [正解:二分图 偏解:奇葩贪心+模拟?(不知如何称呼不过居然比std还快)]