深圳网站营销公司简介,建设银行校园招聘网站,网页怎么制作四页,wordpress文章列表主题目录 前言一、时钟与中断二、GPIO三、ADC四、定时器4.1 基本定时器4.2 通用定时器4.2.1 输入捕获4.2.2 输出比较 五、UART六、IIC七、SPI 前言 本文主要讲单片机外设的功能#xff0c;即这些外设是什么#xff0c;可以用来干什么#xff0c;了解了之后我们就可以通过相应的寄… 目录 前言一、时钟与中断二、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需要配置的参数如下
I/O时钟 ARM系列需要单独开启IO时钟其他如51、STM8、RISC等不需要配置只需要初始化系统时钟即可。方向控制 方向控制就是配置IO口输入输出模式基本所有MCU都需要配置输入模式配置 当IO被用于输入模式时一般可设置为上拉、下拉或浮空模式。所谓的上拉就是接一个上拉电阻上拉电阻连接正极提供5V或者3.3V电压即默认高电平。浮空模式就是没有高低电平状态I/O口电压跟随周围电路状态输出模式配置 当IO被用于输出模式时一般可设置为推挽、开漏或准双向口。准双向口和推挽的区别是推挽是强上下拉可以提供更大的电流。开漏输出时会关闭内部上拉电阻只能下拉输出上拉输出需要外部加上拉电阻。由于开漏相当于MOS开关所以可以用于IIC电路电平匹配数据寄存器 当I/O口作为输入的时候可以读取数据寄存器查看I/O口高低电平状态当I/O口作为输出时将数据写进数据寄存器此时对应的引脚就可以输出相应的电平状态I/O复用与映射 I/O复用是一个很常见的功能就是将普通的I/O口当作其他外设使用比如复用为ADC可以当作模拟输入复用给定时器作为PWM输出等等而映射就是当复用的I/O引脚不够用的时候可以把其他外设比如ADC的某个通道映射到特定的引脚原来的I/O作为其他用途
三、ADC 首先要知道ADC是什么ADCAnalog-to-Digital Converter的缩写指模/数转换器或者模数转换器是指将连续变化的模拟信号转换为离散的数字信号的器件。 那ADC有什么用呢我们在电路中通常会使用一些传感器这些传感器可以将一些模拟量转换成不同的阻值比如温度传感器他的阻值会随着温度的变换而变化此时我们只要测量出阻值就可以根据线性表得出温度。而ADC最基本的作用就是测量电压然后我们就可以根据电压值计算出阻值从而得到最终温度。 上图就是STM32内部ADC框架还是很复杂的不过一些MCU的ADC没有那么多功能我们可以去掉上图的3和7以一个RISC的内部ADC框架来说明如下图 这样了解ADC就会简单点ADC具体配置如下
ADC时钟配置 使能ADC时钟即开启ADC选择时钟源即时钟信号的来源比如系统时钟内部晶振外部晶振进行时钟分频采样延迟防止采样抖动可以选择延迟一段时间后采样 通道选择 I/O配置使用ADC采样一定是用的某个I/O口将其设置成模拟输入模式通道选择每个ADC几个通道分别对应不同的I/O口也可以使用I/O映射功能 触发模式选择 触发源一般可以定时器中断触发ADC中断触发或者软件触发触发方式一般有上升沿、下降沿、低电平等等之类触发 参考电压选择 参考电压是什么参考电压就是ADC测量的范围一般用Vref-和Vref两个参考元组成而输入电压Vin的范围就是Vref- ≤ Vin ≤ Vref 。 那我们通常把参考电压的负极接地即Vref- 0V然后将参考电压正极接内部或者外部的其他电源如2V、3.3V或者5V电压 数据对齐与处理 在了解数据处理之前先了解一下ADC最重要的参数就是ADC的精度。通常MCU的ADC精度是12位的当然有些专用ADC可能有更高的精度。那为什么要了解精度呢我们要知道通常MCU内部数据为8位或者8的倍数位那此时12位数据用8位明显不够用16位又多了。此时就需要配置数据对其方式16位左对齐那么低4位数据无效同理右对齐那么高4位的数据无效。 我们配置好之后直接去读取的数据只是ADC的数据而不是实际电压值。那这电压值怎么换算呢这里就需要综合ADC精度和参考电压了实际电压值采样值/2^精度*Vref - Vref- Vref-这个公式应该不难理解就是根据参考电压然后按照比例得出电压值。而我们精度12位就是4096Vref-接地为0V所以最终电压计算如下所示
四、定时器 定时器最基本的功能就是定时与计数了这有什么用呢我们都知道可以软件里写一个死循环用来延迟但是这种延迟会占系统CPU资源而且会被中断打断导致延迟不准确。此时我们可以用定时器设置计数标志位从而可以得到精准的延迟。首先我们看一下定时器分类定时器基本有以下3种类型
基本定时器基本定时器是最简单的定时器只有计数和定时作用可以设置中断通用定时器在基本定时器的基础上再加上捕获/比较功能一般用来PWM输出高级定时器它一般有4路捕获/比较通道此外还有编码器接口与刹车中断一般用来电机控制 正常情况下如ARM、STM8、RISC之类PWM是由通用定时器产生的。而8051定时器没有PWM功能其他如STC8H用的51内核它的PWM是额外的专用定时器。本小节就讲常规的基本定时器与通用定时器功能
4.1 基本定时器 首先看一下基本定时器框图为了简单这边选了一个RISC的基本定时器 从上图很容易看出先是时钟进来分频然后计数器就开始进行计数基本定时器一般只支持递增计数当计数值CNT与影子寄存器值相等时计数器就会清零并产生更新事件然后自动重装寄存器ARR就把值写入影子寄存器。如果使能中断触发更新事件就会产生中断然后我们可以在中断里清除中断标志位。工作方式如下所示 大致的工作原理如上根据流程我们需要配置的参数如下
时钟配置 选择相应的定时器并使能定时器时钟选择时钟源有些MCU是默认的比如STM32设置分频系数 计数设置 对于基本定时器只需要设置自动重载寄存器ARR的值即可。此时定时器产生更新事件的时间即定时时间系统时钟/分频系数/计数值1。因为计数器是从0开始计数
4.2 通用定时器 这边同样用一个RISC的通用定时器举例框图如下所示 可以看出与基本定时器明显的区别就是多了几路捕获/比较通道。此外通用计数器的位数更高并且有些通用定时器可以递减计数。那这边有个问题捕获和比较分别是什么呢下面会重点介绍输出比较简略介绍输入捕获功能
4.2.1 输入捕获 输入捕获一般应用在两个方面一个方面是脉冲跳变沿时间测量另一方面是 PWM 输入测量。
测量脉宽或者频率 当测量频率时可以记录两次上升沿的时间如果是测量脉宽就记录三个值其中v3-v1是周期v2-v1是脉宽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了步骤如下
I/O配置 由于PWM输出使用的是定时器的某个通道这个通道对应某个I/O口所以要先开启对应I/O的复用或者映射并将其配置为输出模式定时器配置 定时器配置可以参考4.1小节的基本定时器的配置使能PWM输出比较通道并选择PWM模式 这个PWM输出通道指的是定时器捕获/比较通道比如上面通用定时器框图里的CH1。至于PWM模式上面有讲使能比较输出并配置输出极性 这里的比较输出使能是指主通道或者互补通道的使能输出极性就是在对应的PWM模式下当有效时输出电平为高电平还是低电平配置比较值 这里的比较值就是PWM脉宽即上面捕获比较值寄存器CCR。通常CCR需要小于自动重载值ARRARR配置就相当于PWM的周期按需求使能输出比较中断
五、UART
六、IIC
七、SPI