MCU常用外设总线

news2025/1/13 3:13:21

目录

  • 前言
  • 一、时钟与中断
  • 二、GPIO
  • 三、ADC
  • 四、定时器
    • 4.1 基本定时器
    • 4.2 通用定时器
      • 4.2.1 输入捕获
      • 4.2.2 输出比较
  • 五、UART
  • 六、IIC
  • 七、SPI

前言

  本文主要讲单片机外设的功能,即这些外设是什么,可以用来干什么,了解了之后我们就可以通过相应的寄存器配置来驱动这些外设。本文带大家深入了解一下这些外设的工作原理,知道了功能之后,对应任意一个MCU都可以找相应功能的寄存器。因为寄存器名字可以不同,配置方式可以不同,但是功能不可能有很大的差异。这样才能在换一个平台MCU的情况下,实现快速入手


一、时钟与中断

  在之前首先了解一下寄存器,与远古时代的汇编不同,现在都是C语言操作寄存器。那寄存器是什么,百度百科说的很笼统,我们可以将寄存器比做成可以被软件控制的开关,通过不同的开关组合状态,就可以形成我们想要的功能。
  然后我们再了解一下时钟,学过数电的都知道,系统内部改变状态都需要一个CLK脉冲信号,这边到MCU就是一个时钟信号。以下所有外设都需要时钟的支持,当然我们可以通过寄存器和选择器来配置系统时钟,并对其作相应的分频和倍频,来得到我们需要的时钟频率。以下就是M4内核的时钟树结构:
在这里插入图片描述
  不过时钟不需要太关心,我们只需要知道常用的主频是多少Hz就行,因为对于像STM32之类,使用库函数都被官方封装好了时钟,然后被启动文件直接上电执行。如果是RISC或者STM8内核之类,其实配置时钟就一两个寄存器,一般就是主频选择和时钟分频。其他如51内核的,一般情况下不需要配置时钟,MCU默认开启,除非需要修改时钟的情况下才需要配置。
  有了上面的基础就可以开始中断部分了,首先要知道中断是什么?中断是一种发生了一个外部的事件时调用相应的处理程序的过程。这个概念可能不好理解,那我们直接需要知道就是中断可以用来干什么,怎么来触发中断的就行。正常情况下,计算机所有指令都是随着系统时钟从上到下执行,但是中断可以在系统指令执行期间优先执行。
  通常情况下,中断需要一个触发源,即触发中断的信号,如外部中断、定时器、ADC等等,出发后程序运行进入中断函数,原主函数位置会保存到栈空间,等中断函数执行完成之后,再从栈空间读取继续主函数的运行。
在这里插入图片描述
  上图就是STM32的中断控制器,其他MCU也很类似,由上大概可以知道需要配置的寄存器如下,然后再对比参考手册找相应的寄存器:

  • 中断触发源:即触发中断信号的来源
  • 中断优先级:部分MCU需要配置中断优先级,即高优先级的中断优先处理
  • 中断触发类型:比如在上升沿触发
  • 中断使能:即开启中断功能
  • 中断标志位:主要是触发中断和中断完成标志位,需要软件判断和设置

二、GPIO

  GPIO( general purpose intput output) 是通用输入输出端口的简称。那什么是输入输出呢?我们都知道芯片只能处理数字信号,数字信号在数据上体现为逻辑0和逻辑1,实际上代表了高电平(5V或3.3V)和低电平(0V)两种状态。那输入就是MCU通过I/O口来检测外部电平状态,而输出就是MCU向外部输出不同的电平状态。
在这里插入图片描述

  知道I/O的功能之后,我们就可以来配置GPIO,需要配置的参数如下:

  1. I/O时钟
      ARM系列需要单独开启IO时钟,其他如51、STM8、RISC等不需要配置,只需要初始化系统时钟即可。
  2. 方向控制
      方向控制就是配置IO口输入输出模式,基本所有MCU都需要配置
  3. 输入模式配置
      当IO被用于输入模式时,一般可设置为上拉、下拉或浮空模式。所谓的上拉就是接一个上拉电阻,上拉电阻连接正极,提供5V或者3.3V电压,即默认高电平。浮空模式就是没有高低电平状态,I/O口电压跟随周围电路状态
  4. 输出模式配置
      当IO被用于输出模式时,一般可设置为推挽、开漏或准双向口。准双向口和推挽的区别是,推挽是强上下拉,可以提供更大的电流。开漏输出时会关闭内部上拉电阻,只能下拉输出,上拉输出需要外部加上拉电阻。由于开漏相当于MOS开关,所以可以用于IIC电路电平匹配
  5. 数据寄存器
      当I/O口作为输入的时候,可以读取数据寄存器,查看I/O口高低电平状态;当I/O口作为输出时,将数据写进数据寄存器,此时对应的引脚就可以输出相应的电平状态
  6. I/O复用与映射
      I/O复用是一个很常见的功能,就是将普通的I/O口当作其他外设使用,比如复用为ADC可以当作模拟输入,复用给定时器作为PWM输出等等;而映射就是当复用的I/O引脚不够用的时候,可以把其他外设比如ADC的某个通道,映射到特定的引脚,原来的I/O作为其他用途

三、ADC

  首先要知道ADC是什么?ADC,Analog-to-Digital Converter的缩写,指模/数转换器或者模数转换器,是指将连续变化的模拟信号转换为离散的数字信号的器件。
  那ADC有什么用呢?我们在电路中通常会使用一些传感器,这些传感器可以将一些模拟量转换成不同的阻值,比如温度传感器,他的阻值会随着温度的变换而变化,此时我们只要测量出阻值就可以根据线性表得出温度。而ADC最基本的作用就是测量电压,然后我们就可以根据电压值计算出阻值,从而得到最终温度。
在这里插入图片描述
  上图就是STM32内部ADC框架,还是很复杂的,不过一些MCU的ADC没有那么多功能,我们可以去掉上图的3和7,以一个RISC的内部ADC框架来说明,如下图:
在这里插入图片描述
  这样了解ADC就会简单点,ADC具体配置如下:

  1. ADC时钟配置
  • 使能ADC时钟,即开启ADC
  • 选择时钟源,即时钟信号的来源,比如系统时钟,内部晶振,外部晶振
  • 进行时钟分频
  • 采样延迟,防止采样抖动,可以选择延迟一段时间后采样
  1. 通道选择
  • I/O配置:使用ADC采样一定是用的某个I/O口,将其设置成模拟输入模式
  • 通道选择:每个ADC几个通道,分别对应不同的I/O口,也可以使用I/O映射功能
  1. 触发模式选择
  • 触发源:一般可以定时器中断触发,ADC中断触发,或者软件触发
  • 触发方式:一般有上升沿、下降沿、低电平等等之类触发
  1. 参考电压选择
      参考电压是什么?参考电压就是ADC测量的范围,一般用Vref-和Vref+两个参考元组成,而输入电压Vin的范围就是:Vref- ≤ Vin ≤ Vref+ 。
      那我们通常把参考电压的负极接地,即Vref- = 0V;然后将参考电压正极接内部或者外部的其他电源,如2V、3.3V或者5V电压

  2. 数据对齐与处理
      在了解数据处理之前,先了解一下ADC最重要的参数,就是ADC的精度。通常MCU的ADC精度是12位的,当然有些专用ADC可能有更高的精度。那为什么要了解精度呢?我们要知道通常MCU内部数据为8位或者8的倍数位,那此时12位数据用8位明显不够,用16位又多了。此时就需要配置数据对其方式,16位左对齐那么低4位数据无效;同理右对齐那么高4位的数据无效。
      我们配置好之后,直接去读取的数据只是ADC的数据,而不是实际电压值。那这电压值怎么换算呢?这里就需要综合ADC精度和参考电压了,实际电压值=采样值/(2^精度)*(Vref+ - Vref-)+ Vref-,这个公式应该不难理解,就是根据参考电压,然后按照比例得出电压值。而我们精度12位就是4096,Vref-接地为0V,所以最终电压计算如下所示:
    在这里插入图片描述

四、定时器

  定时器最基本的功能就是定时与计数了,这有什么用呢?我们都知道可以软件里写一个死循环用来延迟,但是这种延迟会占系统CPU资源,而且会被中断打断,导致延迟不准确。此时我们可以用定时器设置计数标志位,从而可以得到精准的延迟。首先我们看一下定时器分类,定时器基本有以下3种类型:

  • 基本定时器:基本定时器是最简单的定时器,只有计数和定时作用,可以设置中断
  • 通用定时器:在基本定时器的基础上,再加上捕获/比较功能,一般用来PWM输出
  • 高级定时器:它一般有4路捕获/比较通道,此外还有编码器接口与刹车中断,一般用来电机控制

  正常情况下,如ARM、STM8、RISC之类PWM是由通用定时器产生的。而8051定时器没有PWM功能,其他如STC8H用的51内核,它的PWM是额外的专用定时器。本小节就讲常规的基本定时器与通用定时器功能

4.1 基本定时器

  首先看一下基本定时器框图,为了简单,这边选了一个RISC的基本定时器:
在这里插入图片描述
  从上图很容易看出,先是时钟进来分频,然后计数器就开始进行计数,基本定时器一般只支持递增计数,当计数值CNT与影子寄存器值相等时,计数器就会清零并产生更新事件,然后自动重装寄存器ARR就把值写入影子寄存器。如果使能中断,触发更新事件就会产生中断,然后我们可以在中断里清除中断标志位。工作方式如下所示:
在这里插入图片描述
  大致的工作原理如上,根据流程我们需要配置的参数如下:

  1. 时钟配置
  • 选择相应的定时器,并使能定时器时钟
  • 选择时钟源(有些MCU是默认的,比如STM32)
  • 设置分频系数
  1. 计数设置
      对于基本定时器只需要设置自动重载寄存器ARR的值即可。此时定时器产生更新事件的时间,即定时时间=系统时钟/分频系数/(计数值+1)。因为计数器是从0开始计数

4.2 通用定时器

  这边同样用一个RISC的通用定时器举例,框图如下所示:
在这里插入图片描述
  可以看出与基本定时器明显的区别就是多了几路捕获/比较通道。此外通用计数器的位数更高,并且有些通用定时器可以递减计数。那这边有个问题,捕获和比较分别是什么呢?下面会重点介绍输出比较,简略介绍输入捕获功能

4.2.1 输入捕获

  输入捕获一般应用在两个方面,一个方面是脉冲跳变沿时间测量,另一方面是 PWM 输入测量。

  1. 测量脉宽或者频率
    在这里插入图片描述
      当测量频率时,可以记录两次上升沿的时间;如果是测量脉宽就记录三个值,其中v3-v1是周期,v2-v1是脉宽
  2. PWM 输入模式
      测量脉宽和频率还有一个更简便的方法就是使用 PWM 输入模式。与上面那种只使用一个捕获寄存器测量脉宽和频率的方法相比,PWM 输入模式需要占用两个捕获寄存器。以STM32寄存器举例:
    在这里插入图片描述
      下面我们以一个更加具体的时序图来分析下 PWM 输入模式:
    在这里插入图片描述
      PWM 信号由输入通道 TI1 进入,配置 TI1FP1 为触发信号,上升沿捕获。当上升沿的时候 IC1 和IC2 同时捕获,计数器 CNT 清零,到了下降沿的时候,IC2 捕获,此时计数器 CNT 的值被锁存到捕获寄存器 CCR2 中,到了下一个上升沿的时候,IC1 捕获,计数器 CNT 的值被锁存到捕获寄存器 CCR1 中。其中 CCR2 测量的是脉宽,CCR1 测量的是周期。

4.2.2 输出比较

  在STM32F4输出比较模式总共有 8 种,具体的由寄存器 CCMRx 的位 OCxM[2:0] 配置。我们这里只讲解最常用的 PWM 模式。
  脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。我们可以让定时器产生PWM,在计数器频率固定时,PWM 频率或者周期由自动重载寄存器(TIMx_ARR)的值决定,其占空比由捕获/比较寄存器(TIMx_CCRx)的值决定。PWM 产生原理示意图如下图所示:
在这里插入图片描述
  PWM 模式分为两种,PWM1 和 PWM2,总得来说是差不多:
在这里插入图片描述
  定时器产生 PWM 的方式有许多种,下面我们以边沿对齐模式(即递增计数模式/递减计数模式)为例,PWM 模式 1 或者 PWM 模式 2 产生 PWM 的示意图,如下图所示:
在这里插入图片描述
  有了上面的基础就可以开始配置PWM了,步骤如下:

  1. I/O配置
      由于PWM输出使用的是定时器的某个通道,这个通道对应某个I/O口,所以要先开启对应I/O的复用或者映射,并将其配置为输出模式
  2. 定时器配置
      定时器配置可以参考4.1小节的基本定时器的配置
  3. 使能PWM输出比较通道,并选择PWM模式
      这个PWM输出通道指的是定时器捕获/比较通道,比如上面通用定时器框图里的CH1。至于PWM模式上面有讲
  4. 使能比较输出并配置输出极性
      这里的比较输出使能是指主通道或者互补通道的使能,输出极性就是在对应的PWM模式下,当有效时输出电平为高电平还是低电平
  5. 配置比较值
      这里的比较值就是PWM脉宽,即上面捕获比较值寄存器CCR。通常CCR需要小于自动重载值ARR,ARR配置就相当于PWM的周期
  6. 按需求使能输出比较中断

五、UART

六、IIC

七、SPI

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

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

相关文章

裁员1600人赔偿8000万,游戏巨头的寒冬要来啦!

据相关可靠消息,网易裁员1600人,消息确认可靠,并且基本都是网易游戏的技术人。 网易是一家靠门户网站起家的互联网公司,并提前布局了网易邮箱。当然最后靠网易游戏提前转型,将竞争对手搜狐和新浪远远的甩着后面啦。 网…

MacM1Pro Parallels19.1.0 CentOS7.9 Install PostgrepSQL

相关阅读 MacM1Pro安装 Parallels Desktop 19.1.0 https://blog.csdn.net/qq_41594280/article/details/135420241 MacM1Pro Parallels安装Parallels Tools https://blog.csdn.net/qq_41594280/article/details/135398780 MacM1Pro Parallels安装CentOS7.9 https://blog.csdn.n…

第十二站(20天):C++泛型编程

模板 C提供了模板(template)编程的概念。所谓模板,实际上是建立一个通用函数或类, 其 类内部的类型和函数的形参类型不具体指定 ,用一个虚拟的类型来代表。这种通用的方式称 为模板。 模板是泛型编程的基础, 泛型编程即以一种独立于任何特定…

微软Microsoft推出针对学生的AI练习英语口语工具”阅读教练“:Reading Coach

阅读教练官网链接:https://coach.microsoft.com AI工具专区:AI工具-喜好儿aigc 学生可以通过选择角色和设定,利用AI生成独特的故事,从而激发阅读兴趣并提高阅读流畅度。语音转文本AI能够实时分析学生的阅读流利性,检测…

从 fatal 错误到 sync.Map:Go中 Map 的并发策略

为什么 Go 语言在多个 goroutine 同时访问和修改同一个 map 时,会报出 fatal 错误而不是 panic?我们该如何应对 map 的数据竞争问题呢? 这篇文章将带你一步步了解背后的原理,并引出解决 map 并发问题的方案。 Map 数据竞争 首先…

慢查询定位

慢查询 使用工具 mysql自带慢日志 默认没有开启需要手动开启 查看慢日志中的文件 总结

研学活动报名系统源码开发方案

一、项目背景与目标 (一)项目背景: 随着教育水平的提高和人们对综合素质培养的需求增加,研学活动作为一种教育方式受到了广大家长和学生的青睐。为了更好地组织和管理研学活动,需要建立一个研学活动报名系统&#xf…

《WebKit 技术内幕》之八(3):硬件加速机制

3 其他硬件加速模块 3.1 2D图形的硬件加速机制 其实网页中有很多绘图操作是针对2D图形的,这些操作包括通常的网页绘制,例如绘制边框、文字、图片、填充等,它们都是典型的2D绘图操作。在HTML5中,规范又引入了2D绘图的画布功能&a…

Windows下载安装vcpkg并使用它来安装第三方库(visualstudio)

1.使用Git下载vcpkg仓库(下载比较慢,个人比较喜欢打开下面网址然后用迅雷下载,速度飞快) git clone "https://github.com/Microsoft/vcpkg.git"2.下载好之后解压打开文件夹,双击bootstrap-vcpkg.bat文件&…

BMP图像文件头

文件头总字节为54 byte 其代码的含义有 424d:ASCII BM 36ec_5e00:1920*1080*354 3600:偏移54byte 2800: 40 byte 8007 0000 :16‘h780 1920 3804 0000 :16‘h4801080 1800 :24bit 00ec 5e00&…

FPGA时序分析与时序约束(五)——使用Timing Analyzer进行时序分析与约束

Quartus的安装路径下会自带有例程,通过fir_filter进行学习如何使用Timing Analyzer进行时序分析与约束。 1.1 创建时序网表 打开fir_filter并进行综合后可通过菜单栏Tool->Timing Analyzer或工具栏按钮运行Timing Analyzer。 根据前面提到的,时序分析…

JVM中的垃圾收集算法

标记-清除算法 首先标记出所有需要回收的对象,在标记完成后,统一回收掉所有被标记的对象,也可以反过来,标记存活的对象,统一回收所有未被标记的对象。标记过程就是对象是否属于垃圾的判定过程 缺点 第一个是执行效率…

自我摸索:如何运营并玩转CSDN?

自注册CSDN以来已有七年之久,但真正运营CSDN也是最近一年的事情,大概就是22年底,参加2022 博客之星 的竞选。接触了很多大佬,也学习模仿着开始玩转CSDN,虽然没有同期运营的大佬们玩的6,但也有一些经验可以来…

2022-2024年最全的计算机软件毕业设计选题大全:1000个热门选题推荐✅

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行交流合作✌ 主要内容:SpringBoot、Vue、SSM、HLM…

2023 年顶级前端工具

谁不喜欢一个好的前端工具?在本综述中,您将找到去年流行的有用的前端工具,它们将帮助您加快开发工作流程。让我们深入了解一下! 在过去的 12 个月里,我在我的时事通讯 Web Tools Weekly 中分享了数百种工具。我为前端…

【视频媒体】深入了解直播视频流

深入了解直播视频流🎥 YouTube、TikTok live和Twitch上的直播视频是如何工作的? 直播视频流与常规流媒体不同,因为视频内容通过互联网近乎实时发送,通常只有几秒钟的延迟。 下图解释了实现这一目标背后所发生的事情。 步骤1&…

Python 面向对象(类)

目录 面向对象理念 面向对象三大特性 定义类 格式 创建对象(实例化一个对象) 创建方法 实例方法 类方法 静态方法 self含义 对象属性 添加获取对象属性 ​编辑 类里面获取对象属性 继承 单继承 多继承 多态 面向对象理念 面向对象编程…

day01.基础知识

目录 一.函数与语句 1.1进入C 1.1.1main( )头函数 1.1.2 注释 1.1.3头文件 1.1.4预处理 1.1.5命名空间 1.1.6输入与输出 1.1.7格式化 1.2语句 1.2.1声明语句与变量 1.2.2赋值语句 1.3函数 1.3.1使用有返回值的函数 一.函数与语句 1.1进入C 1.1.1main( )头函数 …

手机也能随时随地玩红警啦!

还在为找不到红警安装包苦恼吗? 现在可以随时随地,无论手机、ipad、电脑都可以无需安装包在线玩红警啦!! 不仅能本地单机玩耍,还能联网玩耍(可以和老外一起玩哦~) 具体在线链接可…

Python中函数的4种参数形式

默认参数的特点是在声明函数时使用“”来指定默认值。缺省参数指因为程序使用了默认值,使得函数调用时不必写出全部参数。 关键字参数可以摆脱位置匹配的限制,直接用变量名匹配。可变参数用于处理任意数量的参数,形参中带一个*,将…