【CH32】| 02——常用外设 | GPIO

news2024/10/6 2:21:57

系列文章目录
【CH32】| 00——开发环境搭建
【CH32】| 01——新建工程 | 下载 | 运行 |调试
【CH32】| 02——常用外设 | GPIO


失败了也挺可爱,成功了就超帅。

文章目录

  • 前言
  • 1. GPIO简介
  • 2. IO口的内部结构框图
    • 保护二极管
    • 上下拉电阻
    • 施密特触发器
    • 两个MOS管
    • 输出寄存器和输入寄存器
  • 3. GPIO的几种模式
    • 3.1 输入
      • 模拟输入
      • 浮空输入
      • 上拉输入
      • 下拉输入
    • 3.2 输出
      • 推挽输出
      • 开漏输出
      • 复用推挽/开漏输出
  • 4. GPIO模式如何选择
  • 5. 引脚的复用功能
  • 6. 引脚产生的中断 | 外部中断
  • 7. 引脚的锁定机制
  • 8. GPIO相关寄存器
    • 配置寄存器低位 GPIOx_CFGLR
    • 端口输入寄存器 GPIOx_INDR
    • 端口输出寄存器 GPIOx_OURDR
    • 端口复位/置位寄存器 GPIOx_BSHR
    • 端口复位寄存器 GPIOx_BCR
    • 配置锁存寄存器 GPIOx_LCKR
  • 9. 实践(代码篇)
    • 9.1 点灯前
      • 看查原理图 LED灯的电路 及控制引脚
    • 9.2 寄存器操作——点灯
    • 9.3 库函数操作——点灯

前言

白嫖了开发板那不得做些事情。现在好多刚入门单片机的都是从库函数入手的 大多教程也是库函数的 这样导致对一些底层怎么实现的不是很清楚。我在学习的时候 老师强烈要求寄存器 然后在学完stm32后 用一些其他单片机也是很容易上手的。所以我就通过带大家看寄存器以及库函数的底层实现深入了解各个外设。

1. GPIO简介

GPIO就是引脚,我们在使用引脚时根据作用 应配置了其模式再去使用。通过看它的参考手册(最好的资料) 了解到GPIO可以配置为很多模式。和stm32一模一样。毕竟抄的 这点可以理解 这样我们再用这个芯片可以无缝上手。当然它也有些自已的特点啦。

2. IO口的内部结构框图

在这里插入图片描述
先简单认识下它内部结构

保护二极管

在这里插入图片描述
IO进来之后遇到的第一个就是保护二极管。这两个二极管的作用就是 引脚外部电压过高/过低时 这两个二极管对其进行电压钳位 电压不会流通到后面 从而保护引脚
在这里插入图片描述

上下拉电阻

在这里插入图片描述
这组上拉下拉电阻的作用给IO口配置默认电平 拉高/拉低如果没有上拉/下拉操作 那么这个引脚是出于浮空状态的也就说会受外界因素干扰 。一般单片机复位后大多数IO口都是处于浮空状态的。通过上拉 给IO口一个高电平 ,下拉给IO低电平。让IO口有一个明确的状态。
在这里插入图片描述

施密特触发器

在这里插入图片描述
施密特触发器就是 电压高于某个值 输出变为高电平 低于某个值 输出变为低电平

两个MOS管

输出模式下有两个Mos管
在这里插入图片描述
一个PMOS 一个NMOS 他两是让其具有推挽输出和开漏输出的关键。后面详细说。

输出寄存器和输入寄存器

在这里插入图片描述
我们操作单片机 也是通过操作相关寄存器实现相关功能的。寄存器就是我们和机器交互的桥梁 我们不需要管它之后时怎么操作的 只需要配置设置寄存器让他去执行就和。在这里我们通过配置GPIO 输出 和输入 寄存器 来配置IO口模式以及IO输出高低电平。

3. GPIO的几种模式

引脚 无非 输入、输出两大类

3.1 输入

在这里插入图片描述
IO配置为输入模式时 是没有复用功能的

模拟输入

模拟输入:一般 ADC采集时 配置为该模式,ADC即采集模拟信号所以 不会经过施密特触发器

在这里插入图片描述

浮空输入

浮空输入:在系统复位后 大多数引脚处于该状态 很容易受外部干扰 这种状态下引脚处于不确定状态 不是高电平也不是低电平 一般测得电压1.几V 还不停变化。

上拉输入

上拉输入:引脚电平拉为高电平(=VDD) 该模式可以确定引脚默认状态 处于高电平 逻辑1 。一般使用在需要检测外部 信号是 低电平有效的情况下 比如 按键检测(低电平有效、某些低电平有效的数字输出传感器)
注意:芯片内部上拉 电流能力很弱 在需要电流高的情况下 外接上拉。

下拉输入

下拉输入: 设置引脚默认电平为 低电平(VSS) 逻辑0 0V
一般用在检测高电平有效的情况下。

3.2 输出

推挽输出

在这里插入图片描述
PMOS管相当于NPN三极管 NMOS相当于PNP三极管 动图通过正弦波 模拟高低电平切换时电流的流向。
在这里插入图片描述
当输出控制 IN输出高电平时,PMOS管导通,NMOS截至 OUT输出高电平。这种情况我们也称为推(灌电流)
当输出控制 IN输出低电平时,NMOS管导通,PMOS截至 OUT输出低电平。这种情况我们也称为挽(拉电流)

推挽输出的优点
1、可以快速输出(切换)高低电平
2、驱动能力较强,一般IO口驱动电流可以达到20ma
缺点
不能线与(两个推挽输出IO不能接一起) 推挽时线与等于直接短接VCC和地 会烧了芯片。
推挽输出使用场景:
一般用在需要快速切断的状态 驱动LED 驱动一些数字芯片控制引脚

开漏输出

开漏输出只有一个NMOS管 在工作
在这里插入图片描述
当漏输出 通过上拉实现高电平输出能力 输出的高电平=VDD电压 驱动能力和上拉电阻有关。
开漏输出的特点:
可以线与(该模式多个引脚可以连载一起) 可以通过上拉电阻实现 电平转换 电平切换速度也和电阻相关
开漏输出一般用在一些总线信号线比如I2C、电机驱动器信号线等

复用推挽/开漏输出

IO除了本身功能 还可以复用其他功能( 好比我这个IO口 通过复用实现ADC输入引脚的功能等)。在这种复用情况下使用开漏/推挽。

4. GPIO模式如何选择

官方参考手册给出了推荐配置 P52页 我只截取了一部分
在这里插入图片描述

5. 引脚的复用功能

一个IO口除了作为普通引脚 用作输入输出外 还可以有其他功能 我们把这个赋予引脚其他功能的操作叫做复用(重映射) 一个IO口可以复用多个功能
引脚映射有 默认映射 部分 完全三种 不同的映射 让引脚实现不同的作用

在这里插入图片描述
可以看到 复用功能 可以通过 不同的重映射方式 选择好多引脚
其他重映射 P57

6. 引脚产生的中断 | 外部中断

所以IO口都可以配置为外部中断模式。就是将一个中断线 绑定到引脚上 中短线是由编号的 需要和 IO口的对应
比如我 PA1 PB1 PC1 三个端口 他们序号是 1 做外部中断时 是绑定到 中断线1 上的 EXTI1 PC2 即 绑定到EXTI2上的 必须对应。
在这里插入图片描述

7. 引脚的锁定机制

可以让IO口处于锁定状态。无法被修改。只有复位后才可修改。
如何锁定;通过给引脚写1或0完成 锁定时序。 比如:让这个引脚写1 写1 读1 读0 类似

8. GPIO相关寄存器

每个外设的寄存器都有一个基地址(起始地址) 。即这个外设寄存器有固定范围。一个外设有又好几个寄存器 这些是在基地址基础上偏移得到。
我们GPIO也是一样的 不同端口有不同的基地
它的地址在哪看 参考手册
如图该芯片 GPIO 不同端口的基地址
在这里插入图片描述
GPIO相关寄存器名称即地址如下

在这里插入图片描述
下面我们详细介绍相关寄存器

配置寄存器低位 GPIOx_CFGLR

为什么叫配置寄存器低位 因为我手里这个芯片CHV003 一个端口 只有8个引脚 如PA0-7 一个配置寄存器是32位4字节 负责8个IO 引脚更多的芯片 就有配置寄存器高位 (一个端口 16个IO口)
在这里插入图片描述
那么具体怎么写呢

eg: 配置PA1为推挽输出 速度为50MHZ
1、可以看到一个IO口由 MODE CNF 一共四位配置 MODE[1:0]这两位在低位
2、配置PA1 A端口引脚 是不是要通过配置A端口的配置寄存器
GPIOA_CFGLR
3、要配置为输出模式 速度50MHZ
MODE和CNF时配套的 可以看到 由8组 序号是从0-7它对应8个引脚0-7
我们是PA1 那么 要设置 CNF1 MODE1 这四位
输出模式 50MHZ MODE1[1:0] =0x3或3; 3 就是二进制11
推挽输出 CNF1[1:0]=0x00或0;二进制00
合在一起 二进制 0011 是不是就是十进制3;
4、将设置值给这个寄存器
GPIOA_CFGLR | = 3<<4; 因为我们是PA1 相当于第二个引脚 一个引脚用4位 所以<<4bit

端口输入寄存器 GPIOx_INDR

相当于 读 获取引脚电平
在这里插入图片描述
可以看到 只用到低8位 因为我们芯片一个端口8个IO 每1位对应我们1个IO的电平 IDR0位 对应 编号0的IO的电平
获取引脚电平 通过读引脚对应 该寄存器的位

eg:读 PC6 IO口的电平
if(GPIOC_INDR&(1<<6)==1) 如果GPIOC INDR寄存器第6位为1 则PC6为高电平 反则低电平

端口输出寄存器 GPIOx_OURDR

这个寄存器就是 让这个IO输出 高电平还是低电平 如果IO是输入模式 可以让其设置默认电平为高还是低
在这里插入图片描述

eg: 设置PD4 输出高电平
GPIOD_OUTDR|=1<<4; 第四位设置为1 即 PD4输出高电平

端口复位/置位寄存器 GPIOx_BSHR

复位/置位 复位等价于输出低 置位等价于 输出高
可以看到如果 BS BR同时设置了 BS起效即 输出高起效果
在这里插入图片描述

eg: PC1 复位(清除/输出低)
GPIOC_BSHR |=1<<17; 复位是设置 BR位
eg: PC1 置位(输出高)
GPIOC_BSHR |=1<<1; 置位是设置 BS位

端口复位寄存器 GPIOx_BCR

和BSHR比较来说 这个只有复位(清除的功能)
在这里插入图片描述
操作和上面是一样的

配置锁存寄存器 GPIOx_LCKR

锁定IO配置的
在这里插入图片描述
锁定IO 让其无法被改变 后面代码详细说明


复用相关的寄存器 后面用到时候再说 初步看了这些寄存器 我们开始实操

9. 实践(代码篇)

9.1 点灯前

看查原理图 LED灯的电路 及控制引脚

在这里插入图片描述
我这里选择通过 PC1控制LED1 所以用杜邦线吧PC1端口和LED1连接起来

9.2 寄存器操作——点灯

1、定义PC端口相关寄存器
通过看手册 我们知道PORT C端口的起始地址
0X400011000
在这里插入图片描述
定义C端口 寄存器的地址(基地址)
因为库里已经定义了 GPIOC_BASE这种名字 我这里 后面加个杠
定义C端口 相关寄存器的地址
在这里插入图片描述
或者看具体寄存器描述上 有在基地址基础上的偏移地址
在这里插入图片描述
操作寄存器 相当于操作地址 所以我们需要使用指针
在这里插入图片描述

2、使能时钟 在使用GPIOC 前需要开GPIOC的时钟 这样GPIOC才会有作用
无论使用什么外设 在使用前都需要开相应的时钟 该外设才会生效
在这里插入图片描述
寄存器地址定义方式一样的
在这里插入图片描述
在这里插入图片描述

3、配置IO口模式 配置PC1为推挽输出 50MHZ

在这里插入图片描述
在这里插入图片描述

4、控制IO口(输出高低电平)
在这里插入图片描述
5、全部代码

在这里插入图片描述
6、LED闪烁
在这里插入图片描述

9.3 库函数操作——点灯

通过上面我们已经对相关寄存器很清楚了 库把寄存器操作封装成了函数 这样方便我们快速使用不用 看手册 查寄存器。
1、我们先看看库是怎么实现的
它也定义了寄存器地址
在这里插入图片描述
在这里插入图片描述
可以看到它通过结构体定义了 相关寄存器 然后不同端口的定义 只是将 端口地址给到这个结构体 通过这样的方式 实现不同端口访问相应寄存器 这个操作有C基础肯定可以看到就不说拉
这样情况下 访问寄存器 GPIOC->CFGLR |=3<<4;
接下来我们看看 GPIO相关操作函数是如何实现的
列举一个
在这里插入图片描述
可以看到 底层还是操作寄存器的
大家有兴趣可以 看下其他都是怎么写的
2、点灯
在这里插入图片描述
如果第一次接触如何你找这些函数
就去对应 .h头文件看函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/570230.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python加速循环的执行方法详解

Python 加速循环的执行方法详解 Python是一门非常流行的编程语言&#xff0c;它可以在很多领域应用&#xff0c;比如Web开发、数据分析、机器学习等等。然而&#xff0c;Python执行速度较慢&#xff0c;特别是在循环语句中&#xff0c;代码执行效率会大打折扣。在本文中&#…

【基于ROS Melodic环境安装rosserial arduino】

【基于ROS Melodic环境安装rosserial arduino】 1. 简介2. 安装2.1 Ubuntu下的Arduino IDE安装2.2 Ubuntu下rosserial arduino软件安装2.3 安装ros_lib到Arduino IDE开发环境 3. 将ros_lib配置到 Arduino 环境库中4. 使用helloword5. 实验验证6.总结 1. 简介 这个教程展示如何…

Linux系统初始化命令的备忘单,Linux运维工程师收藏!

在管理和维护Linux系统时&#xff0c;有一些常用的命令可以帮助您进行系统初始化和配置。这些命令涵盖了各种任务&#xff0c;包括系统设置、用户管理、软件安装和网络配置等。 本文将为您提供一个Linux系统初始化命令的备忘单&#xff0c;以便在需要时方便查阅和使用。 系统设…

chatgpt赋能python:Python动画制作指南:从入门到精通

Python动画制作指南&#xff1a;从入门到精通 Python作为一种易学易用的编程语言&#xff0c;在数据分析、机器学习等领域已经得到广泛应用。但是你知道吗&#xff1f;Python还可以用来制作动画&#xff01;本文将为你介绍如何用Python制作动画&#xff0c;从入门到精通&#…

chatgpt赋能python:Python写计算器:从入门到精通

Python写计算器&#xff1a;从入门到精通 简介 计算器无疑是计算机编程中最基本且实用的工具之一。Python 作为一门易于学习且功能强大的编程语言&#xff0c;能够轻松实现计算器的功能。在本文中&#xff0c;我们将介绍如何使用 Python 编写一个简单的计算器。 如何实现&am…

chatgpt赋能python:Python的封装:提高代码的可维护性和可复用性

Python的封装&#xff1a;提高代码的可维护性和可复用性 在软件开发领域中&#xff0c;封装是一种重要的概念。它被用于隐藏程序的实现细节&#xff0c;使得程序的功能变得更加易于使用和维护。在Python编程中&#xff0c;封装是一种被广泛使用的技术&#xff0c;可以帮助你提…

Linux 信号知识点总结

对于 Linux来说&#xff0c;实际信号是软中断&#xff0c;许多重要的程序都需要处理信号。信号&#xff0c;为 Linux提供了一种处理异步事件的方法。比如&#xff0c;终端用户输入了 ctrlc 来中断程序&#xff0c;会通过信号机制停止一个程序。信号概述 1.信号的名字和编号: 每…

JavaSE_day38(异常分类,自定义异常,File介绍,方法使用,相对路径与绝对路径概念以及注意的点)

1 A.java * 异常的分类&#xff1a; 运行时期异常:RuntimeException的子类就是运行时期异常&#xff0c;在编译时期可以自由选择处理或者不处理 编译时期异常:是Exception的子类&#xff0c;非RuntimeExcpetion的子类&#xff0c;在编译时期必须处理 public c…

注意力机制(一)SE模块(Squeeze-and-Excitation Networks)

Squeeze-and-Excitation Networks&#xff08;压缩和激励网络&#xff09; 论文地址&#xff1a;Squeeze-and-Excitation Networks 论文中文版&#xff1a;Squeeze-and-Excitation Networks_中文版 代码地址&#xff1a;GitHub - hujie-frank/SENet: Squeeze-and-Excitation Ne…

chatgpt赋能python:Python内置:优化SEO的利器?

Python 内置&#xff1a;优化SEO的利器&#xff1f; Python是一种广泛使用的高级编程语言&#xff0c;拥有丰富的标准库和第三方库&#xff0c;能够适用于很多领域。其中&#xff0c;Python内置的一些功能&#xff0c;比如字符串操作和网络请求&#xff0c;可以帮助我们进行SE…

web前端综合案例——小兔鲜首页(html+css)

前言&#xff1a;我这里只使用了html和css&#xff0c;js没有使用 项目源代码&#xff1a;https://pan.baidu.com/s/1alnekYEu5F9XwHTW7dO5RA?pwdqjhd 页面效果&#xff1a; 项目准备阶段&#xff1a; 1.准备项目相应的图片素材&#xff0c;设计稿。 2.创建项目: 2.1 项目…

用反射设计通用的实例化对象方案

需求 对象的相关信息存储在javabean.properties文件中&#xff0c;通过读取properties文件中的信息&#xff0c;实例化对象&#xff0c;要求程序不能硬编码&#xff0c;即程序可以通用&#xff0c;针对不同的对象&#xff0c;都可以实例化。仅需修改配置文件&#xff0c;不需要…

网络基础初识

目录 网络发展 时代背景 计算机内部 协议 协议的创立 什么是协议&#xff1f; 网络协议 OSI七层模型 TCP/IP五层(或四层)模型 硬件方面 -- 补充 路由器 协议的分层 网络传输基本流程 1.协议报头 2.局域网 查询自己的MAC地址 局域网通信的原理 跨路由器传递数…

以太网协议详解

文章目录 前言一、MAC地址二、以太网协议1. 以太网数据格式2. MAC地址表 前言 假设有这样一张网络拓扑图&#xff1a; 在拓扑图中有A、B、C三台计算机&#xff0c;并且它们三个是通过中间的路由器连接的。这时候计算机A要向计算机C发送一条数据&#xff0c;那么数据是怎么样到…

nvm教程

介绍 这个东西&#xff0c;是nodejs官网有个链接里面有很多列表&#xff0c;这是其中一个 下载 https://github.com/coreybutler/nvm-windows/releases 安装 安装前&#xff0c;将.npmrc文件删除&#xff1b;文件位置&#xff1a; C:\Users{User}\AppData\Roaming\npm C:\…

chatgpt赋能python:Python单行for:如何简化你的代码

Python单行for&#xff1a;如何简化你的代码 在Python编程中&#xff0c;for循环是必不可少的一部分&#xff0c;它可以用于遍历列表、元组和字典等各种数据类型。而Python单行for则是一种更加简单、更加紧凑的语法形式&#xff0c;可以让你更加高效地遍历和处理数据。 什么是…

STL--mapset(手撕AVL树,红黑树)

1. 关联式容器 在初阶阶段&#xff0c;我们已经接触过STL中的部分容器&#xff0c;比如&#xff1a;vector、list、deque、 forward_list(C11)等&#xff0c;这些容器统称为序列式容器&#xff0c;因为其底层为线性序列的数据结构&#xff0c;里面 存储的是元素本身。那什么是关…

Yolov5涨点神器:注意力机制---多头上下文集成(Context Aggregation)的广义构建模块,助力小目标检测,暴力涨点

1.数据集性能验证 在crack道路缺陷检测任务中,多头上下文集成(Context Aggregation)的广义构建模块实现暴力涨点mAP50从0.954提升至0.992 🏆🏆🏆🏆🏆🏆Yolov5/Yolov7魔术师🏆🏆🏆🏆🏆🏆 ✨✨✨魔改网络、复现前沿论文,组合优化创新 🚀🚀🚀…

内网渗透(八十三)之安装ADCS证书服务

安装ADCS证书服务 本编文章,我们来讲解安装ADCS证书服务,这里注意一下,因为证书服务特性(不能更改计算机名称、网络参数),因此在部署证书服务器时建议独立部署,ADCS证书服务不能和域控是同一台服务器,这里我用的一台加入域的Server2016搭建 1、以 Enterprise Admins …

chatgpt赋能python:Python内置变量的重要性及常用变量介绍

Python内置变量的重要性及常用变量介绍 Python是一种简单易学的脚本语言&#xff0c;其特点是直观、易读、代码简单且易维护。Python内置变量是开发人员在Python编程中必不可少的一部分&#xff0c;它们在程序中扮演着重要的角色。接下来我们来介绍一些常用的Python内置变量。…