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

网站公司必须帮备案wordpress 调用页面列表

网站公司必须帮备案,wordpress 调用页面列表,wordpress主题代码放在哪里,哈密建设局网站1.1通用定时器介绍 通用定时器具有基本定时器的所有特征#xff0c;基本定时器只能递增计数#xff0c;而通用定时器可以递减计数#xff0c;可以中心对齐计数#xff1b;也可以触发ADC和DAC#xff0c;同时在更新事件#xff0c;触发事件#xff0c;输入捕获#xff…1.1通用定时器介绍 通用定时器具有基本定时器的所有特征基本定时器只能递增计数而通用定时器可以递减计数可以中心对齐计数也可以触发ADC和DAC同时在更新事件触发事件输入捕获输出比较的时候可以产生中断和DMA请求而基本定时器只有更新事件的时候可以触发中断或DMA请求通用定时器还有独立通道用来和外部进行信息交互比如输入捕获输出比较输出PWM和单脉冲模式这就有个疑问了之前基本定时器就看到配置寄存器里有单脉冲模式但是原子的教程说这个是通用定时器特有有空可以做个实验验证一下基本定时器有没有单脉冲模式。通用定时器可以使用外部信号控制定时器可以实现多个定时器互连的同步电路应该就是主从模式了。也支持编码器和霍尔传感器电路等这些东西是用在电机控制中的。现在很多概念都不懂随着学习的深入慢慢理解吧。 1.2 通用定时器框图 通用定时器的框图比基本定时器多了很多东西因为它包含了基本定时器所有的功能所以可以先从框图里找到基本定时器的结构剩下的就是通用定时器对它的扩展下面对框图大致讲解一下后面会详细说明。 ①时钟源 基本定时器的时钟只能来自内部时钟也就是APB总线上时钟经过倍频器之后得到的时钟而通用定时器的时钟可以有4个来源1来自APB总线的时钟2内部触发输入的时钟就是①中的ITR0到ITR3的部分这个内部信号就是其他的定时器3外部时钟模式1右下角的TI1F_EDTI1FP1和TI2FP2这个来自下面第④部分的输入滤波器和边沿检测器最初是来自外部IO口的输入只有外部通道TIMx_CH1和TIMx_CH2的输入信号可以作为时钟源4图中TIMx_ETR的那里来自外部IO口称为外部时钟模式2。 ②控制器 TRGO触发信号可以连接到其余定时器的ITR0到ITR3作为别的定时器的时钟源也就是完成定时器的级联从模式和基本定时器没什么区别。 控制器包括从模式控制器、编码器接口和触发控制器TRGO。从模式控制器可以控制计数器复位、启动、递增/递减、计数。编码器接口针对编码器计数。触发控制器用来提供触发信号给别的外设可以连接到其余定时器的ITR0到ITR3作为别的定时器的时钟源也就是完成定时器的级联也可以为 DAC/ADC 的触发转换提供信号。 ③时基单元 这个就和基本定时器一样参考STM32学习之基本定时器。 ④输入捕获 以TIMx_CH1为例信号从外部输入后先经过一个异或门(常用于电机控制领域这里先忽略)然后进入输入滤波器和边沿检测器滤波器可以过滤掉一些高频噪声然后得到两个信号TI1FP1和TI2FP2这两个信号可以由我们用户自己选择映射到IC1还是IC2不能同时使用一般就是CH1映射到IC1然后经过一个预分频器之后产生一个捕获事件U捕获事件就是捕获的上升沿还是下降沿产生捕获事件之后就会把计数器的值转移到捕获比较1寄存器里面来一次事件记一个数这样就可以根据配置去计算外部信号的时间比如周期和脉宽之类的。除了捕获事件U以外还可以通过配置来产生一个CC1I中断。 ⑤输入比较 这部分是连接④和⑤的桥梁结合另外两部分看就可以了。 ⑥输出比较 将计数器的值与预先存入捕获/比较1寄存器的影子寄存器进行比较如果二者相等则会使输出参考信号进行改变这个信号为固定高电平有效同时还会产生一个比较事件CC1I 如果同时开启了中断的话还会开启比较中断输出参考信号会进入输出控制来控制产生一些信号比如PWM然后通过TIMx_CH1输出。图片的最左边和最右边属于分时复用同一时间根据IO扣得配置模式只能有一个起作用。 现在对上面的框图详细解释一下。 1.2.1. 通用定时器时钟源 时钟模式来源设置方法内部时钟(CK_INT)APB总线设置 TIMx_SMCR 的 SMS0000外部时钟模式1外部输入引脚TIx设置 TIMx_SMCR 的 SMS1111外部时钟模式 2外部触发输入ETR设置 TIMx_SMCR 的 ECE1内部触发输入模式内部触发输入ITRx参考《STM32F10xxx参考手册_V10(中文版).pdf》 14.3.15 小节 时钟源选择内部时钟CK_INT的时候和基本定时器一样都是由APB总线经过倍频器之后得到的。外部时钟模式1的时钟源是来自定时器通道1或者通道2的引脚信号输入外部时钟源信号→IO→TIMx_CH1或者 TIMx_CH2只有CH1和CH2可以CH3和CH4是不行的这时候就需要配置IO的复用模式为定时器这时候信号从IO口进来才能和定时器通道相连。 如上图所示时钟源信号经过CH2以后会先经过一个滤波器滤波器这里把这个信号称为TI2由TIMx_CCMR1的寄存器 ICF[3:0]位来设置滤波方式然后经过边沿检测器由 TIMx_CCER寄存器的CC2P 位来设置信号检测是上升沿还是下降沿。然后经过触发输入选择器由TIMx_SMCR寄存器的TS[2:0]位来选择 TRGI触发输入信号的来源。可以看到图中框出了 TI1F_ED图片中漏了字母F、 TI1FP1 和 TI2FP2 三个触发输入信号TRGI。 TI1F_ED 表示来自于 CH1并且没有经过边沿检测器过滤的信号所以它是 CH1 的双边沿信号即上升沿或者 下降沿都是有效的。 TI1FP1 表示来自 CH1 并经过边沿检测器后的信号可以是上升沿或者下降沿。 TI2FP2 表示来自 CH2 并经过边沿检测器后的信号可以是上升沿或者下降沿。这里以CH2 为例那只能选择 TI2FP2。如果是 CH1 为例那就可以选择 TI1F_ED 或者TI1FP1。最后经过从模式选择器从模式是上升沿触发的所以TIMx_CCER的CC2P 位如果配置成采集下降沿那么检测器就会对信号进行反相操作以保证传到从模式选择器的信号是上升沿由TIMx_SMCR寄存器的ECE位和SMS[2:0]位来选择定时器的时钟源。这里介绍的是外部时钟模式 1所以 ECE 位置 0 SMS[2:0] 111 即可。 CK_PSC 经过定时器的预分频器分频后就能到达计数器进行计数了。外部时钟模式 2来自于外部ETR引脚ETR引脚指的是可以复用为TIMx_ETR的IO引脚把IO口重定义到TIMx_ETR。 信号从外部IO口进入以后会经过外部触发极性选择器由 TIMx_SMCR寄存器的ETP 位来设置上升沿有效还是下降沿有效选择下降沿有效的话信号会经过反相器作用和外部时钟模式1的CC2P一样。然后会经过外部触发分频器分频系数由TIMx_SMCR寄存器的ETP[1:0]来设置然后经过滤波器由TIMx_SMCR寄存器的 ETF[3:0]位来设置滤波方式。其中滤波器的采样频率 f D T S f_{DTS} fDTS​由TIMx_CR1寄存器的CKD[1:0]位来决定。滤波原理后面再说。最后经过从模式选择器这里和外部时钟模式1一样由 TIMx_SMCR寄存器的ECE 位和 SMS[2:0]位来选择定时器的时钟源。这里采用的是外部时钟模式 2直接把 ECE 位置 1 即可。 CK_PSC 经过定时器的预分频器分频后就能到达计数器进行计数了。内部触发输入(ITRx)用于和内部的其他通用/高级定时器进行级联级联的本质是定时器1作为定时器2的预分频器。 定时器1的主模式需要把TIMx_CR2寄存器的MMS[2:0]位设置为010作用是更新事件被选为触发输出中文手册的这里写的是错误的定时器2TIMx_SMCR寄存器的TS[2:0]位用来选择 TRGI触发输入信号的来源设置为000这样就将定时器1和2连接起来了。然后定时器2的TIMx_SMCR寄存器的SMS[2:0]位来进行从模式选择设置为111选择外部时钟模式1。最后启动两个定时器就可以了。 1.2.2. 通用定时器输入捕获 输入捕获是用来采集外部信号的上升沿和下降沿的一个常见的应用就是电机转动的时候采集霍尔数是一系列的脉冲信号本质上就是一个pwm波霍尔数就是指其中的上升沿和下降沿的数量一种方法就是采用输入捕获然后在上升沿和下降沿的时候触发中断在中断函数内对计数变量加1就行了。STM32的输入捕获主要用到上面通用定时器框图的④和⑤部分TIMx_CH1~TIMx_CH4 表示定时器的 4 个通道这 4 个通道都是独立工作的。通过IO端口复用功能将IO口与这些计数器通道相连。配置好 IO 端口的复用功能后将需要测量的信号输入到相应的IO 端口输入捕获部分就可以对输入的信号的上升沿下降沿或者双边沿进行捕获了常见的测量有测量输入信号的脉冲宽度、测量 PWM 输入信号的频率和占空比等。本质上是通过计数器采集时间的所以喊空比和频率都是后期算出来的原始的读出来的数据一般都是脉宽和周期然后根据这俩去计算其他的信息。 在测量脉宽的时候一般要先设置输入捕获的边沿检测极性如我们设置上升沿检测那么当检测到上升沿时定时器会把计数器 CNT的值锁存到相应的捕获/比较寄存器 TIMx_CCRy 里 y1~4。然后我们再设置边沿检测为下降沿检测当检测到下降沿时定时器会把计数器 CNT 的值再次锁存到相应的捕获/比较寄存器TIMx_CCRy 里。最后我们将前后两次锁存的 CNT 的值相减就可以算出高电平脉冲期间内 计数器的计数个数再根据定时器的计数频率就可以计算出这个高电平脉冲的持续时间。如果要测量的高电平脉宽时间长度超过定时器的溢出时间周期就会发生溢出这时候还需要做定时器溢出的额外处理。以通道1来简单介绍一下 外部信号TI1通过IO口进入TIMx_CH1后先经过一个滤波器滤波器的配置由TIMx_CCMR1决定接着经过边沿检测器由 CC1P 位来设置检测的边沿可以上升沿或者下降沿检测。 CC1NP是配置互补通道的边沿检测的只有在高级定时器才有通用定时器没有。然后经过输入捕获映射选择器由 CC1S[1:0]位来选择把 IC1 映射到TI1FP1、TI2FP1还是 TRC。这里我们的待测量信号从通道1进来所以选择IC1 映射到TI1FP1。紧接着经过输入捕获 1 预分频器由 ICPS[1:0]位来设置预分频系数范围 1、 2、 4、 8。最后把CC1E位置1使能输入捕获 IC1PS 就是分频后的捕获信号。这个信号将会到达通用定时器框图的第⑤部分下图是第⑤部分的放大版。 上图的灰色阴影部分是输出比较功能部分和输入捕获无关。左边没有阴影部分是输入捕获功能部分。首先看到捕获/比较预装载寄存器还是以通道1为例它就是CCR1寄存器通道 2、通道 3、通道 4 就是CCR2、CCR3、CCR4。在最开始通用定时器框图中可以看到 CCR1~4 是有影子寄存器的所以这里就可以看到上图中有捕获/比较影子寄存器影子寄存器都是不可直接访问的。上图左下角TIMx_EGR寄存器的CC1G位可以产生软件捕获事件和基本定时器的更新事件一样就是软件触发一个更新事件来将预装载寄存器的值传递到对应的影子寄存器中那么硬件捕获事件如何产生的这里我们还是以通道 1 输入为例CC1S[1:0] 01即IC1映射到TI1上CC1E位置1使能输入捕获比如不滤波、不分频 ICF[3:0] 00 ICPS[1:0] 00比如检测上升沿 CC1P 位置 0接着就是等待测量信号的上升沿到来。当上升沿到来时 IC1PS 信号就会触发输入捕获事件发生计数器的值就会被锁存到捕获/比较影子寄存器里。当 CCR1 寄存器没有被进行读操作的时候捕获/比较影子寄存器里的值就会锁存到 CCR1 寄存器中那么程序员就可以读取 CCR1 寄存器得到计数器的计数值。检测下降沿同理。 1.2.3. 通用定时器输出比较 输出比较是用来向外部发出信号的一般是周期性的发出高低电平一个常见的应用就是发出PWM波来控制MOS管来进一步控制电机的转速和车灯的亮度等。STM32的输出比较主要用到通用定时器框图的⑤和⑥部分和输入捕获一样TIMx_CH1~TIMx_CH4 表示定时器的4个通道这 4 个通道都是独立工作的。通过IO端口复用功能将IO口与这些计数器通道相连。下图是通用定时器框图的第⑤部分的放大版 灰色阴影部分是输入捕获功能部分前面已经说过了。右 边没有阴影部分就是输出比较功能部分。下面以通道 1 输出比较功能为例来看定时器如何实现输出功能的。首先向CCR1 寄存器内写入比较值。这个比较值需要转移到对应的捕获/比较影子寄存器后才会真正生效。当compare_transfer 旁边与门的三个条件都满足的时候才会进行数据转移1. CCR1 不在写入操作期间、 2. CC1S[1:0] 0 配置为输出、 3. OC1PE位置0或者OC1PE 位置1并且需要发生更新事件这个更新事件可以软件产生或者硬件产生。当 CCR1 寄存器的值转移到其影子寄存器后新的值就会和计数器的值进行比较它们的比较结果将会通过第⑥部分影响定时器的输出。下面看第⑥部分 可以看到输出模式控制器由OC1M[2:0]位配置输出比较模式该位的描述需要看参考手册。oc1ref 是输出参考信号高电平有效为高电平时称之为有效电平为低电平时称之为无效电平。它的高低电平受到三个方面的影响1. OC1M[3:0]位配置的输出比较模式2. 第⑤部分比较器的比较结果3. OC1CE位配置的ETRF信号ETRF信号就是通用定时器框图第⑤部分最下面和第①部分上面的那个信号。 ETRF 信号可以将 Oc1ref 电平强制清零该信号来自 IO 外部。 一般来说当计数器的值和捕获/比较寄存器的值相等时输出参考信号 oc1ref 的极性就会根据我们选择的输出比较模式而改变。如果开启了比较中断还会触发比较中断。CC1P 位用于选择通道输出极性配置高电平就输出高电平配置低电平就取反后输出。CC1E 位置 1 使能通道输出。OC1 信号就会从 TIMx_CH1 输出到 IO 端口再到 IO 外部。 1.3. 通用定时器寄存器学习 1.3.1. 控制寄存器 1(TIMx_CR1) 寄存器低十位有效。 位9:8CKD[1:0]设置滤波器的采样频率与定时器时钟之间的关系位7ARPE设置自动预装载寄存器是否具有缓存功能位6:5CMS[1:0]设置计数器的计数的对齐模式边沿对齐还是中央对齐以及中央对齐的时候触发中断的方式位4DIR计数器的计数方向递增计数还是递减计数位3OPM单脉冲模式和基础计数器一样计数器溢出一次之后就不计数了位2URS更新事件的触发源选择位通过配置该位来选择计数器更新事件的触发源位1UDIS与基本定时器一样更新事件的使能位如果置1那么影子寄存器的值就不会改变如果TIMx_EGR寄存器的UG位被置1或者从模式控制器产生了硬件复位那么整个定时器都会被初始化包括影子寄存器的内容都会被清除。位0CEN计数器的使能位置1则使能计数器。 1.3.2. 控制寄存器2(TIMx_CR2) 寄存器7:3位有效。 位7TI1S选择TI1信号的输入通道位6:4MMS[2:0]配置当前计数器在主模式下送到从定时器的同步信息(TRGO)位3CCDS置0时DMA请求源是预装载寄存器TIMx_CCRx比如发生计数器溢出的时候置1时计数器的DMA请求源是实际的捕获/比较寄存器比如计数器的值与捕获/比较寄存器相等的时候。 1.3.3. 从模式控制寄存器(TIMx_SMCR) 这个寄存器除了第3位保留其余所有位都有意义。 位15 ETP用来选择在外部时钟模式 2的时候外部输入的时钟源的触发极性置1反相低电平有效置0不反相高电平有效位14ECE外部时钟模式2的使能位置0禁止外部时钟模式2置1使能外部时钟模式2位13:12ETPS[1:0]外部触发信号ETRP的预分频配置寄存器ETRP的频率最多是内部时钟CK_INT的1/4如果频率过高的话可以配置这个寄存器来降低ETRP的频率位11:8ETF[3:0]这个寄存器对外部触发信号ETRP进行滤波就像手册里说的那样它的本质上是一个事件计数器比如配置成“0001采样频率 f S A M P L I N G f C K _ I N T f_{SAMPLING}f_{CK\_INT} fSAMPLING​fCK_INT​ N2”它的意思是说这个寄存器以 f S A M P L I N G f_{SAMPLING} fSAMPLING​的频率对外部信号进行采样采样频率和内部时钟频率相同如果是别的情况由TIMx_CR1寄存器的CKD位决定然后后面的数字N表示只有采满N个数字才认为是有效的电平变化比如采集的第一个数据是低电平第二个是高电平那就不认为这个高电平是有效的还是记录这个数据为低电平只有第二个数据也是低电平第三个数据变成高电平的时候就认为它是有效的高电平这时候会记录为高电平如果N等于其他值时候也是同理比如N6那就是必须采够6个数据才会认为是有效的电平变化所以高频变化的信号就会被过滤掉位7MSM主模式选择位置1当前计数器工作在主模式定时器可以为其他定时器或外设提供同步信号置0当前计数器工作在从模式定时器的启动停止复位等由其他的定时器控制。位6:4TS[2:0]选择定时器触发输入TRGI的触发源位2:0SMS[2:0]从模式选择位对从模式进行选择。 1.3.4. DMA/中断使能寄存器(TIMx_DIER) 这个寄存器的各个位的作用是用来使能和禁止一些中断和DMA请求的没什么好说的。 1.3.5. 状态寄存器(TIMx_SR) 这个寄存器工是个位有效记录捕获比较的一些标志位。 位12CC4OF捕获/比较4重复捕获标记意思就是说输入捕获通道 4 中是已经存储了捕获的值但是又发生了一次捕获事件而新的捕获值无法及时存储导致了数据丢失这时候会被硬件置1可以通过软件写入0来清除该位位11CC3OF捕获/比较3重复捕获标记位10CC2OF捕获/比较2重复捕获标记位9CC1OF捕获/比较1重复捕获标记位6TIF触发器中断标记当从模式控制器处于除门控模式外的其它模式时在TRGI输入端检测到有效边沿或门控模式下的任一边沿时由硬件置1通过软件置1清0位4CC4IF捕获/比较4 中断标记配置为输入模式的时候捕获到配置的触发源的时候已经将计数器的值拷贝到捕获/比较寄存器(TIMx_CCR1)这时候会对这位置1配置为输出模式的时候TIMx_CNT的值与TIMx_CCR1的值匹配的时候该位置1位3CC3IF捕获/比较4 中断标记位2CC2IF捕获/比较4 中断标记位1CC1IF捕获/比较4 中断标记位0UIF更新中断标记当产生更新事件时计数器溢出或软件触发更新事件硬件置1由软件清0。 1.3.6. 事件产生寄存器(TIMx_EGR) 这个寄存器6个位有效。 位6TG该位置1之后产生一个触发事件同时会将TIMx_SR寄存器的TIF位置1硬件自动清零位4CC4G产生捕获/比较4事件在通道CC4上产生一个捕获/比较事件若通道CC4配置为输出则设置CC4IF1若开启了对应的中断和DMA则产生相应的中断和DMA若通道CC1配置为输入则将当前的计数器值捕获至TIMx_CCR4寄存器并设置CC4IF1若开启对应的中断和DMA则产生相应的中断和DMA。若CC4IF已经为1则设置CC4OF1位3CC3G产生捕获/比较3事件位2CC2G产生捕获/比较2事件位1CC1G产生捕获/比较1事件位0UG产生更新事件软件产生一个更新事件。 1.3.7. 捕获/比较模式寄存器1(TIMx_CCMR1) 这个寄存器的16位均有效高八位和低八位功能相同只是针对不同的器通道 输出比较模式 位15OC2CE输出比较2清0使能如果该位置1那么当检测到ETRF输入高电平时就将OC2REF置0位14:12OC2M[2:0]选择输出比较2的模式选择输出比较的模式具体的可以看参考手册位11OC2PE输出比较2预装载使能可以设置TIMx_CCR1寄存器是否具有缓存功能位10OC2FE输出比较2快速使能位该位用于加快CC输出对触发器输入事件的响应正常情况下当定时器的计数器值与输出比较通道的比较值相等时会触发一个输出比较事件。这个事件会更新相应的输出引脚状态切换高低电平状态在常规的操作中这个更新过程会受到定时器内部的同步机制的影响所谓同步机制是为了确保输出信号的完整性和稳定性需要在合适的时刻更新输出引脚的状态比如修改了预分频值或者别的东西的时候所做的修改不会立即反映到引脚上。而当这一位置1的话定时器只做一件事情那就是比较计数器值与输出比较通道的比较值是否相等以此来加快OC2的输出速度。只有在通道配置成PWM模式的时候才会生效位9:8CC2S[1:0]这一位定义输入输出的通道方向以及输入引脚的位置 输入捕获模式位15:12IC2F[3:0]输入捕获2滤波器滤波原理和TIMx_SMCR的ETF位相同配置参数查询参考手册位11:10IC2PSC[1:0]输入/捕获2预分频器这两位定义外部信号捕获的预分频系数位9:8CC2S[1:0]这一位定义输入输出的通道方向以及输入引脚的位置 低八位和高八位含义相同针对通道1。 1.3.8. 捕获/比较模式寄存器2(TIMx_CCMR2) 含义相同针对通道3和4。 1.3.9. 捕获/比较使能寄存器(TIMx_CCER) 这个寄存器配置四个定时器通道的输出极性和使能 位13CC4P输入/捕获4输出极性当CC4通道配置为输出时置1高电平位为OC4的有效电平置0低电平为有效电平当CC4通道配置为输入时置0捕获上升沿置1捕获下降沿位12CC4E输入/捕获4输出使能当CC4通道配置为输出时置1使能输出置0禁止输出当CC4通道配置为输入时置0捕获禁止置1捕获使能位9CC3P输入/捕获3输出极性位8CC3E输入/捕获3输出使能位5CC2P输入/捕获2输出极性位4CC2E输入/捕获2输出使能位1CC1P输入/捕获1输出极性位0CC1E输入/捕获1输出使能。 1.3.10. 计数器(TIMx_CNT) 16位寄存器CNT[15:0]储存计数器的值。 1.3.11. 预分频器(TIMx_PSC) 16位寄存器PSC[15:0]储存预分频器的值。 1.3.12. 自动重装载寄存器(TIMx_ARR) 16位寄存器ARR[15:0]包含了将要传送至实际工作的自动重装载寄存器的数值。 1.3.13. 捕获/比较寄存器 1(TIMx_CCR1) 16位寄存器CCR1[15:0]: 捕获/比较1的值当CC1通道是输出时CCR1包含了装入当前捕获/比较1寄存器的值(预装载值)当CC1通道是输入时CCR1包含了由上一次输入捕获1事件(IC1)传输的计数器值。 1.3.14. 捕获/比较寄存器 2(TIMx_CCR2) 16位寄存器CCR2[15:0]: 捕获/比较2的值当CC2通道是输出时CCR2包含了装入当前捕获/比较1寄存器的值(预装载值)当CC2通道是输入时CCR2包含了由上一次输入捕获1事件(IC2)传输的计数器值。 1.3.15. 捕获/比较寄存器 3(TIMx_CCR3) 16位寄存器CCR3[15:0]: 捕获/比较3的值当CC3通道是输出时CCR3包含了装入当前捕获/比较1寄存器的值(预装载值)当CC3通道是输入时CCR3包含了由上一次输入捕获1事件(IC3)传输的计数器值。 1.3.16. 捕获/比较寄存器 4(TIMx_CCR4) 16位寄存器CCR4[15:0]: 捕获/比较4的值当CC4通道是输出时CCR4包含了装入当前捕获/比较1寄存器的值(预装载值)当CC4通道是输入时CCR4包含了由上一次输入捕获1事件(IC4)传输的计数器值。 1.3.17. DMA控制寄存器(TIMx_DCR) 位12:8DBL[4:0]: DMA连续传送长度 (DMA burst length) 位4:0DBA[4:0]: DMA基地址 (DMA base address)。 目前还用不到。 1.3.18. 连续模式的DMA地址(TIMx_DMAR) 位15:0DMAB[15:0]: DMA连续传送寄存器 (DMA register for burst accesses)目前还用不到。 1.4. PWM输出实验 pwm输出实验的目标是通过使用定时器来出书pwm波控制LED0来实现一个呼吸灯。通过上面知识的学习可以知道定时器输出pwm波的原理很简单因为定时器计数的频率是确定的所以通过预先设置好捕获比较寄存器的值和自动重装载寄存器的值就可以调节pwm的高脉宽和周期了这俩参数确定了以后pwm波的所有的信息就都确定了。 1.4.1. 原理图阅读 这里只需用用到LED0LED0的一端接入VCC另一端接入MCU的PB5所以需要查看PB5可以映射哪些功能打开数据手册找到PB5的引脚定义如下 可以看到PB5可以重映射到TIM3_CH2所以需要将PB5映射到TIM3_CH2。 1.4.2. 定时器的初始化 void gtim_timx_pwm_chy_init(uint16_t arr, uint16_t psc) {uint8_t chy GTIM_TIMX_PWM_CHY;GTIM_TIMX_PWM_CHY_GPIO_CLK_ENABLE(); /* TIMX 通道 IO口时钟使能 */GTIM_TIMX_PWM_CHY_CLK_ENABLE(); /* TIMX 时钟使能 */sys_gpio_set(GTIM_TIMX_PWM_CHY_GPIO_PORT, GTIM_TIMX_PWM_CHY_GPIO_PIN,SYS_GPIO_MODE_AF, SYS_GPIO_OTYPE_PP, SYS_GPIO_SPEED_HIGH, SYS_GPIO_PUPD_PU); /* TIMX PWM CHY 引脚模式设置 */sys_gpio_remap_set(10, 2, 2); /* IO口重映射 */GTIM_TIMX_PWM-ARR arr; /* 设定计数器自动重装值 */GTIM_TIMX_PWM-PSC psc; /* 设置预分频器 */GTIM_TIMX_PWM-BDTR | 1 15; /* 使能MOE位(仅TIM1/8 有此寄存器,必须设置MOE才能输出PWM), 其他通用定时器, 这个* 寄存器是无效的, 所以设置/不设置并不影响结果, 为了兼容这里统一改成设置MOE位*/if (chy 2){GTIM_TIMX_PWM-CCMR1 | 6 (4 8 * (chy - 1)); /* CH1/2 PWM模式1 */GTIM_TIMX_PWM-CCMR1 | 1 (3 8 * (chy - 1)); /* CH1/2 预装载使能 */}else if (chy 4){GTIM_TIMX_PWM-CCMR2 | 6 (4 8 * (chy - 3)); /* CH3/4 PWM模式1 */GTIM_TIMX_PWM-CCMR2 | 1 (3 8 * (chy - 3)); /* CH3/4 预装载使能 */}GTIM_TIMX_PWM-CCER | 1 (4 * (chy - 1)); /* OCy 输出使能 */GTIM_TIMX_PWM-CCER | 1 (1 4 * (chy - 1)); /* OCy 低电平有效 */GTIM_TIMX_PWM-CR1 | 1 7; /* ARPE使能 */GTIM_TIMX_PWM-CR1 | 1 0; /* 使能定时器TIMX */ }第3行变量chy初始化为GTIM_TIMX_PWM_CHY表示当前选择的通道是通道2就是TIM3_CH2中的CH2第4行和第5行分别使能定时器通道IO口的时钟和定时器外设的时钟第7行设置IO的初始化模式和状态第3个参数SYS_GPIO_MODE_AF表示当前是复用功能而不是普通的GPIO第4个参数SYS_GPIO_OTYPE_PP说明当前是复用推挽输出在输出模式下最后一个参数无效因为输出模式下内部上下拉电阻无效第10行将IO口PB5重映射至TIM3_CH2因为PB5的默认复用功能并没有定时器所以需要这行代码进行重映射官方例程中说这里是非必需的实际上就是取决于是不是默认复用如果不是默认复用那就需要重映射那么这里就是必需的第12行和第13行设置计数器的自动重装载值和预分频系数例程中使用1Mhz的计数频率且产生2Khz的PWM波TIM3定时器位于APB1总线和基本定时器一样所以当采用内部时钟的时候TIM3的时钟频率也是72Mhz要得到1Mhz频率的计数器频率需要配置预分频系数为72配置的PSC寄存器的值就是72-1产生的PWM周期是2Khz说明一个周期计数器计数的个数为(1/2000)/(1000000)500所以自动装载值为500-1第14行这个寄存器只有高级定时器有这里官方例程写出来只是为了兼容统一没啥用第18-27行分别选择通道12和通道34的输出模式以及使能对应通道的捕获比较寄存器TIMx_CCRy的预装载功能这里chy的y等于2移位运算前面的6和1表示将要写入寄存器的值即0b110和0b1第29行使能捕获比较寄存器的输出第30行设置输出信号的有效电平第31行使能自动重装载寄存器的缓存功能第32行使能对应的定时器。 1.4.3. 主程序解读 while (1){delay_ms(10);if (dir) {ledrpwmval;} else {ledrpwmval--;}if (ledrpwmval 300)dir 0;if (ledrpwmval 0)dir 1;GTIM_TIMX_PWM_CHY_CCRX ledrpwmval;}定时器初始化结束以后就可以编写主程序了在主程序里面先延时10ms延时的意义是防止闪烁频率过快肉眼观察不到然后通过变量dir来调整占空比是增加还是减少对应灯亮度的增加和减少通过变量ledrpwmval来调整具体占空比的值计数值300对应占空比300/50060%这时候对占空比的变化方向取反也就是说占空比从0变化到60%以后紧接着从60%再变化到0。 可以通过把300改成499来调节灯的最大亮度同时把第5行到第8行改成下面这样让灯的呼吸灯效果更加明显。 if (dir) {ledrpwmval 5;} else {ledrpwmval - 5;}1.5. 输入捕获实验 输入捕获实验是对一个管脚进行高电平持续时间进行计算 1.5.1. 原理图阅读 这个实验用到的是开关KEY_UP这一路开关未打开时PA0采集到低电平开关打开时PA0采集到持续的高电平然后将这个高电平的持续时间采集后通过串口发出来。 PA0可以映射的定时器通道是TIM5_CH1而TIM2_CH1_ETR和TIM8_ETR是外部时钟模式2的时钟输入信号不要搞混。 1.5.2. 定时器的初始化 void gtim_timx_cap_chy_init(uint16_t arr, uint16_t psc) {uint8_t chy GTIM_TIMX_CAP_CHY;GTIM_TIMX_CAP_CHY_GPIO_CLK_ENABLE(); /* TIMX 通道IO口时钟使能 */GTIM_TIMX_CAP_CHY_CLK_ENABLE(); /* TIMX 时钟使能 */sys_gpio_set(GTIM_TIMX_CAP_CHY_GPIO_PORT, GTIM_TIMX_CAP_CHY_GPIO_PIN,SYS_GPIO_MODE_AF, SYS_GPIO_OTYPE_PP, SYS_GPIO_SPEED_HIGH, SYS_GPIO_PUPD_PU); /* TIMX PWM CHY 复用功能 下拉 */GTIM_TIMX_CAP-ARR arr; /* 设定计数器自动重装值 */GTIM_TIMX_CAP-PSC psc; /* 设置预分频器 */if (chy 2){GTIM_TIMX_CAP-CCMR1 | 1 8 * (chy - 1); /* CCyS[1:0] 01 选择输入端 IC1/2映射到TI1/2上 */GTIM_TIMX_CAP-CCMR1 | 0 (2 8 * (chy - 1)); /* ICyPSC[1:0] 00 输入捕获不分频,全捕获 */GTIM_TIMX_CAP-CCMR1 | 0 (4 8 * (chy - 1)); /* ICyF[3:0] 00 输入端滤波 不滤波 */}else if (chy 4){GTIM_TIMX_CAP-CCMR2 | 1 8 * (chy - 3); /* CCyS[1:0] 01 选择输入端 IC3/4映射到TI3/4上 */GTIM_TIMX_CAP-CCMR2 | 0 (2 8 * (chy - 3)); /* ICyPSC[1:0] 00 输入捕获不分频,全捕获 */GTIM_TIMX_CAP-CCMR2 | 0 (4 8 * (chy - 3)); /* ICyF[3:0] 00 输入端滤波 不滤波 */}GTIM_TIMX_CAP-CCER | 1 (4 * (chy - 1)); /* CCyE 1 输入捕获使能 */GTIM_TIMX_CAP-CCER | 0 (1 4 * (chy - 1)); /* CCyP 0 捕获上升沿 ,注意:CCyNP使用默认值0 */GTIM_TIMX_CAP-EGR | 1 0; /* 软件控制产生更新事件,使写入PSC的值立即生效,否则将会要等到定时器溢出才会生效 */GTIM_TIMX_CAP-DIER | 1 1; /* 允许捕获中断 */GTIM_TIMX_CAP-DIER | 1 0; /* 允许更新中断 */GTIM_TIMX_CAP-CR1 | 1 0; /* 使能定时器TIMX */sys_nvic_init(1, 3, GTIM_TIMX_CAP_IRQn, 2);/* 抢占1子优先级3组2 */ }第3行变量chy初始化为GTIM_TIMX_CAP_CHY这个宏的值为1表示当前选择的通道是通道1就是TIM5_CH1中的CH2第4行和第5行分别使能定时器通道IO口的时钟和定时器5外设的时钟第7行设置IO的初始化模式和状态第3个参数SYS_GPIO_MODE_AF表示当前是复用功能而不是普通的GPIO第4个参数SYS_GPIO_OTYPE_PP说明当前是复用推挽输出在输出模式下最后一个参数无效因为输出模式下内部上下拉电阻无效第10行和第11行设置计数器的自动重装载值和预分频系数设置方法和之前一样重装载值指的是采集高电平的时候溢出的时间设置的小多溢出几次设置的大少溢出几次第13到24行设置通道的映射关系信号滤波情况以及信号的预分频情况等按自己的需求配置就行了第26和27行使能输入捕获通道就是设置输入捕获寄存器连接到哪里和设置有效电平的极性第29行软件控制产生一个更新事件使写入PSC的值立即生效否则将会要等到定时器溢出才会生效第30行和第31行使能更新中断和捕获中断触发中断是为了采集上升沿和下降沿更新中断是为了记录在高电平持续时间内计时器溢出了多少次第32行使能定时器TIM5第34行设置定时器的中断优先级。 1.5.3. 中断函数学习 void GTIM_TIMX_CAP_IRQHandler(void) {uint16_t tsr GTIM_TIMX_CAP-SR; /* 获取中断状态 */uint8_t chy GTIM_TIMX_CAP_CHY; /* 需要捕获的通道 */if ((g_timxchy_cap_sta 0X80) 0) /* 还未成功捕获 */{if (tsr (1 0)) /* 溢出中断 */{if (g_timxchy_cap_sta 0X40) /* 已经捕获到高电平了 */{if ((g_timxchy_cap_sta 0X3F) 0X3F) /* 高电平太长了 */{GTIM_TIMX_CAP-CCER ~(1 (1 4 * (chy - 1)));/* CCyP 0 设置为上升沿捕获 */g_timxchy_cap_sta | 0X80; /* 标记成功捕获了一次 */g_timxchy_cap_val 0XFFFF;}else /* 还可以累加高电平长度 */{g_timxchy_cap_sta; }}}if (tsr (1 chy)) /* 通道y 发生了捕获事件 */{if (g_timxchy_cap_sta 0X40) /* 捕获到一个下降沿 */{g_timxchy_cap_sta | 0X80; /* 标记成功捕获到一次高电平脉宽 */g_timxchy_cap_val GTIM_TIMX_CAP_CHY_CCRX; /* 获取当前的捕获值. */GTIM_TIMX_CAP-CCER ~(1 (1 4 * (chy - 1)));/* CCyP 0 设置为上升沿捕获 */ }else /* 还未开始,第一次捕获上升沿 */{g_timxchy_cap_val 0;g_timxchy_cap_sta 0X40; /* 标记捕获到了上升沿 */GTIM_TIMX_CAP-CNT 0; /* 计数器清空 */ GTIM_TIMX_CAP-CCER | 1 (1 4 * (chy - 1)); /* CCyP 1 设置为下降沿捕获 */ }}}GTIM_TIMX_CAP-SR 0; /* 清除所有中断标志位 */ }中断函数干的事情总结起来就是捕获上升沿和下降沿并记录时间同时记录计数器溢出次数最后计算总的高电平持续时间。 第1行获取中断状态就是获取当前的触发源这里获取了所有的通道是因为原本也需要用到更新中断标志和捕获中断标志所以就所有的都获取了用到的时候再解析第2行设置捕获的通道第6行这个if判断中的全局变量表示的是当前捕获中断的电平变化类型在后面的代码中进行赋值操作当它与0x80进行与运算以后得到的值如果是0说明当前还没有捕获到一个完整的上升沿加下降沿要么还没有捕获到上升沿要么是刚捕获到了上升沿当前正在高电平持续时间阶段如果是0说明当前已经捕获到了一个完整的高脉宽接下来就会通过main函数将高脉宽的持续时间通过串口发到上位机第8行这个if判断当前的中断的触发源是不是计数器溢出第10行判断当前是否已经捕获到高电平 如果已经捕获到了高电平且当前的触发源是计数器溢出说明当前正处在高脉宽的持续时间内需要记录计数器的溢出次数第12行对计数器最大溢出次数做判断如果溢出次数达到0x3F次则强制返回一次能记录到的最大脉宽时间第14行修改中断的触发为上升沿触发因为已经采集到了最大的脉宽时间需要重新采集所以已经是完成了一次完整的采集需要重新捕获上升沿第15行标记捕获完成在主函数内进行判断g_timxchy_cap_sta是否等于0x80然后将采集时间通过串口发送至上位机第16行记录采集的最大脉宽时间为0xFFFF;第20行当前还没有达到设置的最大计数器溢出次数对溢出次数进行累加第25行当前的中断触发源不是计数器溢出而是外部触发第27行判断是不是下降沿触发的中断如果是下降沿触发的中断那就要在接下来的代码中计算总的高脉宽持续时间第29行标记捕获完成第30行获取当前捕获到的值第31行修改中断的触发为上升沿触发因为已经采集到了最大的脉宽时间需要重新捕获上升沿第35行重新初始化采集到的脉宽时间第36行记录当前采集到了高脉宽第37行清空计数器第38行修改中断的触发为下降沿触发因为已经采集到了上升沿需要捕获标志着高脉宽结束的下降沿 说明g_timxchy_cap_sta这个变量是8位的最高位用来标记已经完整采集到了一次高脉宽次高位用来标记当前已经捕获到了上升沿低6位用来记录计数器的溢出次数。我个人觉得这写法有点太抠门了给初学者的教程完全可以把这三个用三个变量来表示要不然还得琢磨一下。 1.6. 脉冲计数实验 中断脉冲实验的目标是使用外部信号作为计数器时钟假设计数器工作在递增模式下那么外部来一个脉冲则计数器加1。采用的IO口和脉宽捕获一样不过服用的功能不同现在映射到外部时钟输入TIM2_CH1_ETR。 1.6.1 定时器初始化 void gtim_timx_cnt_chy_init(uint16_t psc) {uint8_t chy GTIM_TIMX_CNT_CHY;GTIM_TIMX_CNT_CHY_GPIO_CLK_ENABLE(); /* TIMX 通道IO口时钟使能 */GTIM_TIMX_CNT_CHY_CLK_ENABLE(); /* TIMX 时钟使能 */sys_gpio_set(GTIM_TIMX_CNT_CHY_GPIO_PORT, GTIM_TIMX_CNT_CHY_GPIO_PIN,SYS_GPIO_MODE_AF, SYS_GPIO_OTYPE_PP, SYS_GPIO_SPEED_HIGH, SYS_GPIO_PUPD_PD); /* TIMX PWM CHY 复用功能 下拉 */GTIM_TIMX_CNT-ARR 65535; /* 设定计数器自动重装值为最大 */GTIM_TIMX_CNT-PSC psc; /* 设置预分频器 */GTIM_TIMX_CNT-CCMR1 | 1 8 * (chy - 1); /* CCyS[1:0] 01 选择输入端 IC1/2映射到TI1/2上 */GTIM_TIMX_CNT-CCMR1 | 0 (2 8 * (chy - 1)); /* ICyPSC[1:0] 00 输入捕获不分频,全捕获 */GTIM_TIMX_CNT-CCMR1 | 0 (4 8 * (chy - 1)); /* ICyF[3:0] 00 输入端滤波 不滤波 */GTIM_TIMX_CNT-CCER | 1 (4 * (chy - 1)); /* CCyE 1 输入捕获使能 */GTIM_TIMX_CNT-CCER | 0 (1 4 * (chy - 1)); /* CCyP 0 捕获上升沿,即上升沿计数 ,注意:CCyNP使用默认值0 */GTIM_TIMX_CNT-SMCR | (4 chy) 4; /* TS[4:0] 5/6 触发选择: 5,TI1FP1(TIMX_CH1); 6,TI2FP2(TIMX_CH2); */GTIM_TIMX_CNT-SMCR | 7 0; /* SMS[2:0] 7 从模式选择: 外部时钟模式1 */GTIM_TIMX_CNT-EGR | 1 0; /* 软件控制产生更新事件,使写入PSC的值立即生效,否则将会要等到定时器溢出才会生效 */GTIM_TIMX_CNT-DIER | 1 0; /* 允许更新中断 */GTIM_TIMX_CNT-CR1 | 1 0; /* 使能定时器TIMX */sys_nvic_init(1, 3, GTIM_TIMX_CNT_IRQn, 2);/* 抢占1子优先级3组2 */ }11行之前的内容和之前都一样没啥好说的需要说一下第10行自动重装载值这个值在这里的意思就是统计的按键次数第13行
http://www.hkea.cn/news/14369447/

相关文章:

  • 用dw做的网站能用吗合肥网页设计就业
  • 怎么用国外的服务器做网站哪个网站可以做魔方图片大全
  • 安徽省建设厅人员名单官方网站上海招聘网站建设
  • 学科建设网站app开发公司有什么部门
  • 大安网站建设高仿做的好点的网站
  • 当当网网站系统建设的意义西安推广平台排行榜
  • 刷链接浏览量网站网站外链怎么发布
  • 本地门户网站一个人做网站要多久
  • 上海虹口网站制作提升网站建设品质价位
  • ...无锡网站制作网站安全认证去哪做
  • 自己做网站步骤 域名亿网
  • 精品网站做爆款网站显示iis7
  • 网站开发技术员有趣实用的网站
  • 网站建设实训报告建议网络公司管理系统
  • 网站建设合同属于技术合同吗轻量服务器wordpress
  • seo详细教程大型网站seo策略
  • 网站降权的表现wordpress 区块链主题
  • 怎样把自己做的网站上传上海外国语大学学风建设网站
  • tp5.1做的网站360免费建站李梦
  • 在线ps网站在百度如何发布作品
  • 网站建设中目录常熟做网站推广的
  • 艺术设计招聘网站怎么发布信息到百度
  • 贵阳网站建设咨询俄罗斯网站后缀
  • 上海网站开发的公司wordpress commerce
  • 做网站用国内还是国外的vps怎么用html在wordpress
  • 建设网站注意什么微网站建设包括哪些
  • php和网站建设境外网站搭建
  • 建网页网站广州正规网站建设企业
  • 10个零网站建设单位网站建设情况说明书
  • 如何通过网站开发客户2狠狠做网站