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

2023-12-17 04:36

本文主要是介绍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的基本知识点就讲解完毕,大家对着官方文档和调试器调试代码可以进一步加深理解。

这篇关于HPM6750系列--第九篇 GPIO详解(基本操作)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/503073

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Debezium 与 Apache Kafka 的集成方式步骤详解

《Debezium与ApacheKafka的集成方式步骤详解》本文详细介绍了如何将Debezium与ApacheKafka集成,包括集成概述、步骤、注意事项等,通过KafkaConnect,D... 目录一、集成概述二、集成步骤1. 准备 Kafka 环境2. 配置 Kafka Connect3. 安装 D

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

Spring Cloud LoadBalancer 负载均衡详解

《SpringCloudLoadBalancer负载均衡详解》本文介绍了如何在SpringCloud中使用SpringCloudLoadBalancer实现客户端负载均衡,并详细讲解了轮询策略和... 目录1. 在 idea 上运行多个服务2. 问题引入3. 负载均衡4. Spring Cloud Load

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

在 Spring Boot 中使用 @Autowired和 @Bean注解的示例详解

《在SpringBoot中使用@Autowired和@Bean注解的示例详解》本文通过一个示例演示了如何在SpringBoot中使用@Autowired和@Bean注解进行依赖注入和Bean... 目录在 Spring Boot 中使用 @Autowired 和 @Bean 注解示例背景1. 定义 Stud

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I

Go路由注册方法详解

《Go路由注册方法详解》Go语言中,http.NewServeMux()和http.HandleFunc()是两种不同的路由注册方式,前者创建独立的ServeMux实例,适合模块化和分层路由,灵活性高... 目录Go路由注册方法1. 路由注册的方式2. 路由器的独立性3. 灵活性4. 启动服务器的方式5.

Java中八大包装类举例详解(通俗易懂)

《Java中八大包装类举例详解(通俗易懂)》:本文主要介绍Java中的包装类,包括它们的作用、特点、用途以及如何进行装箱和拆箱,包装类还提供了许多实用方法,如转换、获取基本类型值、比较和类型检测,... 目录一、包装类(Wrapper Class)1、简要介绍2、包装类特点3、包装类用途二、装箱和拆箱1、装