当前位置:文档之家› STM32的PWM精讲

STM32的PWM精讲

STM32的PWM精讲
STM32的PWM精讲

STM32的PWM精讲

通过对TIM1定时器进行控制,使之各通道输出插入死区的互补PWM输出,各通道输出频率均为17.57KHz。其中,通道1输出的占空比为50%,通道2输出的占空比为25%,通道3输出的占空比为12.5%。各通道互补输出为反相输出。

TIM1定时器的通道1到4的输出分别对应PA.08、PA.09、PA.10和PA.11

引脚,而通道1到3的互补输出分别对应PB.13、PB.14和PB.15引脚,中止输入引脚为PB.12。将这些引脚分别接入示波器,在示波器上观查相应通道占空比的方波[12]。

配置好各通道后, 编译运行工程;点击MDK 的Debug菜单,点击Start/Stop Debug Session;通过示波器察看PA.08、PA.09、PA.10、PB.13、PB.14、PB.15的输出波形,其中PA.08和PB.13为第一通道和互补通道,PB.09和PB.14为第二通道和其互补通道,PB.10和PB.15为第三通道和其互补通道;第一通道显示占空比为50%,第二通道占空比为25%,第三通道占空比为12.5%。

第2章 STM32处理器概述

STM32F103xx增强型系列产品中内置了多达3个同步的标准定时器。每个定时器都有一个16位的自动加载递加/递减计数器、一个16位的预分频器和4个独立的通道,每个通道都可用于输入捕获、输出比较、PWM和单脉冲模式输出,在最大的封装配置中可提供最多12个输入捕获、输出比较或PWM通道。它们还能通过定时器链接功能与高级控制定时器共同工作,提供同步或事件链接功能。

在调试模式下,计数器可以被冻结。任一个标准定时器都能用于产生PWM 输出。每个定时器都有独立的DMA请求机制。

2.4.2 高级控制定时器[22]

高级控制定时器(TIM1)由一个 16位的自动装载计数器组成,它由一个可编程预分频器驱动。它适合多种用途,包含测量输入信号的脉冲宽度(输入捕获),或者产生输出波形(输出比较,PWM,嵌入死区时间的互补 PWM等)。

使用定时器预分频器和 RCC时钟控制预分频器,可以实现脉冲宽度和波形周期从几个微秒至几个毫秒的调节。高级控制(TIM1)和通用(TIMx)定时器是完全

独立的,它们不共享任何资源,它们可以同步操作。

高级控制定时器(TIM1)可以被看成是一个分配到6个通道的三相PWM发生器,它还可以被当成一个完整的通用定时器。四个独立的通道可以用于: ·输入捕获 ;

·输出比较 ;

·产生PWM(边缘或中心对齐模式) ;

·单脉冲输出 ;

·反相PWM输出,具有程序可控的死区插入功能;

配置为16位标准定时器时,它与TIMx定时器具有相同的功能。配置为16位PWM发生器时,它具有全调制能力(0~100%)。

在调试模式下,计数器可以被冻结。很多功能都与标准的TIM定时器相同,内部结构也相同,因此高级控制定时器可以通过定时器链接功能与TIM定时器协同操作,提供同步或事件链接功能。

TIM1 定时器的功能包括:

·16位上,下,上/下自动装载计数器 ;

·16位可编程预分频器,计数器时钟频率的分频系数为 1~65535之间的任意数值;

·4个独立通道:

?输入捕获 ;

?输出比较;

?PWM生成(边缘或中间对齐模式);

?单脉冲模式输出 ;

?死区时间可编程的互补输出。

·使用外部信号控制定时器和定时器互连的同步电路;

·在指定数目的计数器周期之后更新定时器寄存器;

·刹车输入信号可以将定时器输出信号置于复位状态或者一个已知状态;

·如下事件发生时产生中断/DMA:

?更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部

/外部触发);

? 触发事件(计数器启动,停止,初始化或者由内部/外部触发计数);

? 输入捕获;

? 输出比较;

? 刹车信号输入。

时基单元

可编程高级控制定时器的主要部分是一个 16位计数器和与其相关的自动

装载寄存器。这个计数器可以向上计数、向下计数或者向上向下双向计数。此计

数器时钟由预分频器分频得到。

计数器、自动装载寄存器和预分频器寄存器可以由软件读写,即使计数器还

在运行读写仍然有效。

时基单元包含:

·计数器寄存器(TIM1_CNT);

·预分频器寄存器 (TIM1_PSC);

·自动装载寄存器 (TIM1_ARR);

·周期计数寄存器 (TIM1_RCR);

自动装载寄存器是预先装载的。写或读自动重装载寄存器将访问预装载寄存器。根据在 TIM1_CR1寄存器中的自动装载预装载使能位(ARPE)的设置,预装载

寄存器的内容被永久地或在每次的更新事件 UEV时传送到影子寄存器。当计数

器达到溢出条件(向下计数时的下溢条件)并当 TIM1_CR1寄存器中的 UDIS位等

于 0时,产生更新事件。更新事件也可以由软件产生。随后会详细描述每一种

配置下更新事件的产生。

计数器由预分频器的时钟输出 CK_CNT驱动,仅当设置了计数器 TIM1_CR1

寄存器中的计数器使能位(CEN)时,CK_CNT才有效。(有关更多的计数器使能的

细节,请参见控制器的从模式描述)。

注:真正的计数器使能信号 CNT_EN是在 CEN后的一个时钟周期后被设置。 预分频器描述 。

预分频器可以将计数器的时钟频率按 1到 65536之间的任意值分频。它是

基于一个(在 TIM1_PSC寄存器中的)16位寄存器控制的 16位计数器。因为这个控制寄存器带有缓冲器,它能够在工作时被改变。新的预分频器的参数在下一次更新事件到来时被采用。

图 2-4和 图 2-5给出了一些在预分频器工作时,更改其参数的情况下计数器操作的例子。

图2-4 当预分频器的参数从 1变到 2时,计数器的时序图

图2-5 当预分频器的参数从 1变到 4时,计数器的时序图

2.4.3 小结

经过比较和针对设计需要,使用定时器预分频器和 RCC时钟控制预分频器,

可以实现脉冲宽度和波形周期从几个微秒至几个毫秒的调节。高级控制(TIM1)和通用(TIMx)定时器是完全独立的,不共享任何资源,可以同步操作。 高级控制定时器(TIM1)还可以被看成是一个分配到6个通道的三相PWM发生器,它还可以被当成一个完整的通用定时器。因此该设计选择高级控制定时器(TIM1)。

PWM概述

PWM是Pulse Width Modulation的缩写,中文意思就是脉冲宽度调制,简称脉宽调制。它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,其控制简单、灵活和动态响应好等优点而成为电力电子技术最广泛应用的控制方式,其应用领域包括测量,通信,功率控制与变换,电动机控制、伺服控制、调光、开关电源,甚至某些音频放大器,因此研究基于PWM技术的正负脉宽数控调制信号发生器具有十分重要的现实意义。

PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。

多数负载(无论是电感性负载还是电容性负载)需要的调制频率高10Hz,通常调制频率为1kHz到200kHz之间。占空比是接通时间与周期之比;调制频率为周期的倒数。

目前,运动控制系统或电动机控制系统中实现PWM的方法主要有传统的数字电路方式、专用的PWM集成电路、单片机实现方式和可编程逻辑器件实现方式。用传统的数字电路实现PWM,电路设计较复杂,体积大,抗干扰能力差,系统的控制周期较长。专用的PWM集成电路或带有PWM的单片机价格较高。对于单片机中无PWM输出功能的情况,实现PWM将消耗大量的时间,大大降低了CPU的效率,而且得到的PWM信号精度不太高[15]。

PWM 模式

脉冲宽度调制模式可以产生一个由TIM1_ARR寄存器确定频率、由 TIM1_CCRx寄存器确定占空比的信号。在 TIM1_CCMRx寄存器中的 OCxM位写入“110”(PWM模式 1)或“111”(PWM模式 2),能够独立地设置每个通道工作在 PWM 模式,每个 OCx输出一路PWM。必须通过设置 TIM1_CCMRx寄存器 OCxPE位使能相应的预装载寄存器,最后还要设置 TIM1_CR1寄存器的 ARPE位使能自动重装载的预装载寄存器(在向上计数或中心对称模式中)。

因为仅当发生一个更新事件的时候,预装载寄存器才能被传送到影子寄存器,因此在计数器开始计数之前,必须通过设置 TIM1_EGR寄存器中的 UG位来初始化所有的寄存器。

OCx的极性可以通过软件在 TIM1_CCER寄存器中的 CCxP位设置,它可以设置为高电平有效活和低电平有效。OCx输出通过 CCxE、CCxNE、MOE、OSSI和OSSR 位(在 TIM1_CCER和 TIM1_BDTR寄存器中)的组合控制。

在 PWM模式(模式 1或模式 2)下,TIM1_CNT和 TIM1_CCRx始终在进行比较,(依据计数器的计数方向)以确定是否符合 TIM1_CCRx≤TIM1_CNT或者TIM1_CNT ≤TIM1_CCRx。根据 TIM1_CR1寄存器中 CMS位的状态,定时器能够产生边沿对齐的或中央对齐的 PWM信号。

PWM 边沿对齐模式

· 向上计数配置

当TIM1_CR1寄存器中的DIR位为低的时候执行向上计数。

当TIM1_CNT

图3-1 边沿对齐的 PWM波形(ARR=8)

· 向下计数的配置

当TIM1_CR1寄存器的DIR位为高时执行向下计数。

在 PWM模式 1,当 TIM1_CNT>TIM1_CCRx时参考信号 OCxREF为低,否则为高。如果 TIM1_CCRx中的比较值大于 TIM1_ARR中的自动重装载值,则OCxREF 保持为“1"。该模式下不能产生 0%的 PWM波形。

PWM 中央对齐模式

当TIM1_CR1寄存器中的CMS位不为 00时为中央对齐模式(所有其他的配置对OCxREF/OCx信号都有相同的作用)。根据不同的CMS位的设置,比较标志可能在计数器向上计数时被置 1、在计数器向下计数时被置 1、或在计数器向上和向下计数时被置 1。TIM1_CR1寄存器中的计数方向位(DIR)由硬件更新,不要用软件修改它。

图 3-2给出了一些中央对齐的PWM波形的例子

· TIM1_ARR=8 ;

· PWM模式 1;

· TIM1_CR1 寄存器中的 CMS=01,在中央对齐模式 1 时,当计数器向下计数时标志被设置。[21]

图3-2 中央对齐的 PWM波形(APR=8)

3.1.2 互补输出与死区插入

高级控制定时器 TIM1能够输出两路互补信号并且能够管理输出的瞬时关断和接通。这段时间通常被称为死区,应该根据连接到输出的器件和它们的特性(电平转换的延时、电源开关的延时等)来调整死区时间。

配置 TIM1_CCER寄存器中的 CCxP和 CCxNP位,可以为每一个输出独立地选择极性(主输出 OCx或互补输出 OCxN)。互补信号OCx和OCxN通过下列控制位的组合进行控制:TIM1_CCER寄存器的CCxE和CCxNE位,TIM1_BDTR和TIM1_CR2寄存器中的MOE、OISx、OISxN、OSSI和OSSR位,带刹车功能的互补输出通道OCx和OCxN的控制位。特别的是,在转换到IDLE状态时(MOS下降到 0)死区被

激活。

同时设置 CCxE和 CCxNE位将插入死区,如果存在刹车电路,则还要设置 MOE位。每一个通道都有一个 10位的死区发生器。参考信号 OCxREF可以产生 2路输出 OCx和 OCxN。如果 OCx和 OCxN为高有效:

· OCx 输出信号与参考信号相同,只是它的上升沿相对于参考信号的上升沿有一个延迟。

· OCxN 输出信号与参考信号相反,只是它的上升沿相对于参考信号的下降沿有一个延迟。

如果延迟大于当前有效的输出宽度(OCx或OCxN),则不会产生相应的脉冲。图3-3,3-4显示了死区发生器的输出信号和当前参考信号 OCxREF之间的关系(假设 CCxP=0、CCxNP=0、MOE=1、CCxE=1并且 CCxNE=1)。

图3-3 带死区插入的互补输出

图3-4 死区波形延迟大于负脉冲

3.2 PWM输出的实现[12]

STM32的高级定时器时钟TIM1CLK为固定72MHz, TIM1 预分频为 0x0(系统高速时钟不分频), 所以TIM1计数器时钟频率为72MHz。I/O口时钟为固定值50MHz,PA8、PA9、PA10、PA11设为推拉模式。

TIM1 在下面定义的频率下工作:

TIM1 频率= TIM1CLK/(TIM1_Period + 1) = 17.57 KHz。

TIM1 CC1 寄存器的值为0x7FFF, 所以 TIM1_CH1 和 TIM1_CH1N 产生一个频率为 17.57KHz的信号,这个信号的占空比为:

TIM1_CH1 占空比 = TIM1_CCR1 /(TIM1_Period + 1) = 50%。

TIM1 CC2 寄存器的值为 0x3FFF, 所以 TIM1_CH2 和 TIM1_CH2N 产生一个 17.57KHz 的信号,它的占空比为:

TIM1_CH2 占空比 = TIM1_CCR2 / (TIM1_Period + 1)= 25%。

TIM1 CC3 寄存器的值为 0x1FFF, 所以 TIM1_CH3 和TIM1_CH3N 产生一个 17.57KHz 的信号,它的占空比为:

TIM1_CH3 占空比 = TIM1_CCR3 / (TIM1_Period + 1) = 12.5%。

TIM1 波形可以在示波器上显示出来。

输出信号观察

下列引脚分别依次接到示波器上(两个一组),示波器接线正接触线下列引脚,负接触线接地(GND)。

· TIM1_CH1 pin (PA8);

· TIM1_CH1N pin (PB13);

· TIM1_CH2 pin (PA9);

· TIM1_CH2N pin (PB14) ;

· TIM1_CH3 pin (PA10);

· TIM1_CH3N pin (PB15);

· TIM1_CH4 pin (PA11)。

第4章 软件设计

4.1 开发环境

4.1.1 STM32的开发软件

STM32自问世至今,采用过如下软件,皆有利弊。

·IAR

IAR是STM32开发使用最多的软件平台。IAR官方提供IAR for ARM 两种类型的版本供免费评估: 32K学习版,只能支持编译32K目标代码,等效无时间限制 ;30天评估版,无编译代码限制。

·MDK

自从keil被ARM收购以后,在keil中集成了ARM自己的编译器,改名MDK。·RIDE

该软件支持GCC编译器开发STM32产品。该套开发板使用keilmdk370开发软件,该软件使用简单,keil是众多单片机应用开发的优秀软件之一,它集编辑编译仿真于一体,支持汇编,PLM语言和C语言的程序设计,界面清晰,易学易懂。

这里选用的是keilmdk370,4.1.2节着重介绍。

4.1.2 MDK370[11]

Real View MDK(Miertocontroller Development Kit)是ARM公司最先推出的基于ARM微控制器的专业嵌入式开发工具。它采用了ARM的最新技术编工具RVCT,集成了享誉全球的μ Vision IDE,因此特别易于使用,同时具备非常高的性能。它适合不同层次的开发者使用,包括专业的应用程序开发工程师和嵌入式软件开发的入门者。MDK包括符合工业标准的Real View编译工具、测试器以及实时内核等组件,支持所有基于ARM的设备,能帮助工程师按照计划完成项目。·MDK提供启动代码生成向导——提高开发效率;

·MDK提供强大的设备模拟器——缩短开发周期:

目标设备的所有组件都可仿真,代码可在整个设备上运行。完全的目标硬件仿真,完整的目标,高效指令集仿真,中断仿真,片内外围设备有ADC, DAC, EBI, Timers ,UART,CAN,I2C,包含外部信号和I/O。充足的仿真信息,包含在设备数据库里。

·MDK提供高效的性能开发工具;

·MDK支持最新的Cortex-M3处理器:

Cortex-M3处理器是ARM公司推出的最新的针对微控制应用的内核,提供业界领先的高性能和低成本解决方案,将成为MCU应用的热点和主流。

但是目前能支持Cortex-M3构架的开发工具很少,包括SDT,ADS1.2等多数开发工具都不支持。MDK是目前性价比最高的支持Cortex-M3处理器的开发工具。

·MDK集成了Flash编程模块;

·MDK提供业界最好的μ Vision IDE—易学易懂。

4.2 软件实现

4.2.1 设计标准

该设计对TIM1定时器进行控制,使之各通道输出插入死区的互补PWM输出,各通道输出频率均为17.57KHz。 I/O口时钟为固定值50MHz,PA8、PA9、PA10、PA11设为推拉模式。

其中,通道1输出的占空比为50%,通道2输出的占空比为25%,通道3输出的占空比为12.5%。各通道互补输出为反相输出。TIM1定时器的通道1到4

的输出分别对应PA.08、PA.09、PA.10引脚,而通道1到3的互补输出分别对应PB.13、PB.14和PB.15引脚,这些处理器引脚在开发板上已经以插针形式引出。

由于TIM1计数器的时钟频率为72MHz,各通道输出频率fTIM1为17.57KHz,根据:fTIM1=TIM1CLK/(TIM1_Period + 1),可得到TIM1预分频器的TIM1_Period 为0xFFFF。根据通道输出占空比 TIM1_CCRx/(TIM1_Period + 1),可以得到各通道比较/捕获寄存器的计数值。其中:TIM1_CCR1寄存器的值0x7FFF、TIM1_CCR2寄存器的值为0x3FFF、TIM1_CCR3寄存器的值为0x1FFF。

程序部分原代码:

/* Channel 1, 2, 3 and 4 Configuration in PWM mode */

TIM1_OCInitStructure.TIM1_OCMode = TIM1_OCMode_PWM2;

TIM1_OCInitStructure.TIM1_OutputState = TIM1_OutputState_Enable;

TIM1_OCInitStructure.TIM1_OutputNState = TIM1_OutputNState_Enable; TIM1_OCInitStructure.TIM1_Pulse = CCR1_Val;

TIM1_OCInitStructure.TIM1_OCPolarity = TIM1_OCPolarity_Low;

TIM1_OCInitStructure.TIM1_OCNPolarity = TIM1_OCNPolarity_Low;

TIM1_OCInitStructure.TIM1_OCIdleState = TIM1_OCIdleState_Set;

TIM1_OCInitStructure.TIM1_OCNIdleState = TIM1_OCIdleState_Reset;

TIM1_OC1Init (&TIM1_OCInitStructure);

TIM1_OCInitStructure.TIM1_Pulse = CCR2_Val;

TIM1_OC2Init (&TIM1_OCInitStructure);

TIM1_OCInitStructure.TIM1_Pulse = CCR3_Val;

TIM1_OC3Init (&TIM1_OCInitStructure);

运行过程:

(1) 使用Keil uVision3 编译链接工程;

(2) 点击MDK 的Debug菜单,点击Start/Stop Debug Session;

(3) 通过示波器察看PA.08、PA.09、PA.10、PB.13、PB.14、PB.15的输出波形,

其中PA.08和PB.13为一组,PB.09和PB.14为一组,PB.10和PB.15为一组。

4.2.2 程序流程图

整个设计程序流程如图4-1所示:

第5章测试及结果

5.1 JTAG仿真器介绍[11]

J-Link是支持仿真ARM内核芯片的JTAG仿真器。配合IAR EWARM,ADS,KEIL,WINARM,RealView等集成开发环境支持所有ARM7/ARM9内核芯片的仿真,通过RDI接口和各集成开发环境无缝连接,操作方便、连接方便、简单易学,是学习开发ARM最好最实用的开发工具。

DQ电子推出的J-LinkV7仿真器采用原版固件,参照原版原理图,经过DQ 团队的长时间精工制作,板型合理,元件布局美观大方,走线严谨精致,并且每一个产品都经过功能和老化测试,功能完全与原版一致,支持在线升级。

J-Link ARM主要特点:

·IAR EWARM集成开发环境无缝连接的JTAG仿真器。

·支持所有ARM7/ARM9内核的芯片,以及cortexM3,包括Thumb模式。

·支持ADS,IAR,KEIL,WINARM,REALVIEW等几乎所有的开发环境。

·下载速度高达ARM7:600kB/s,ARM9:550kB/s,通过 DCC 最高可达 800 kB/s*最高JTAG速度 12MHz。

·目标板电压范围1.2V-3.3V。

·自动速度识别功能。

·监测所有JTAG信号和目标板电压。

·完全即插即用。

·使用USB电源(可接通J12跳线给目标板供电,出厂时未接通)。

·带USB连接线和20芯JTAG连接排线。

·支持多JTAG器件串行连接。

·标准20芯JTAG仿真插头。

·带J-Link TCP/IP server,允许通过TCP/IP网络使用J-Link

支持的内核:

·ARM7TDMI(Rev 1);

·ARM7TDMI(Rev 3);

·ARM7TDMI-S(Rev 4);

·ARM720T ;

·CORTEXM3。

5.2 测试

在电脑主机USB接口上插入开发板的电源线和J-LINK的连接线,同时给示波器供电,示波器两个通道接线的负接线与开发板STM32的GND连接,正接线分别接通道n(n=1,2,3)和其互补通道。其中,通道1到3的输出分别对应PA.08、PA.09、PA.10引脚,而通道1到3的互补输出分别对应PB.13、PB.14、PB.15引脚。前序工作准备好后,再在Keil uVision3 环境里打开TIM1的工程,编译连接运行,观察示波器图像,并记录。

5.3 现象及结果

通道1和其互补通道,频率为17.57kHz,占空比为50%,PWM输出显示如图5-1:

图5-1 通道1与其互补通道的PWM输出图

75%, PWM输出显示如图5-2。

图5-2 通道2与其互补通道的PWM输出图

为87.5%, PWM输出显示如图5-3。

图5-3 通道3与其互补通道的PWM输出图

结论

通过对TIM1定时器进行控制,使之各通道输出插入死区的互补PWM输出,各通道输出频率均为17.57KHz。

其中,通道1输出的占空比为50%,通道2输出的占空比为25%,通道3输出的占空比为12.5%。各通道互补输出为反相输出。

TIM1定时器的通道1到3的输出分别对应PA.08、PA.09、PA.10引脚,而通道1到3的互补输出分别对应PB.13、PB.14和PB.15引脚,将这些引脚分别接入示波器正接线,GND引脚接示波器负接线,在示波器上看到了相应通道占空比的PWM输出。

stm32f407 输入捕获两路方波

stm32f407 输入捕获两路方波,测下降沿时间间隔2017年08月07日18:49:23 muyepiao1阅读数:1303 标签:stm32f407输入捕获 记录调试过程: 实现方法:用TIM3,TIM4设置为输入捕获(下降沿触发),使能捕获中断,更新事件中断。 有时候两个下降沿间隔时间太久,超过溢出值,所以要开更新中断。更新中断手册上有讲: “●发生如下事件时生成中断/DMA 请求: —更新:计数器上溢/下溢、计数器初始化(通过软件或内部/外部触发) —触发事件(计数器启动、停止、初始化或通过内部/外部触发计数) —输入捕获 —输出比较 ” ·(计数器溢出,UDIS =0 ) --- (生成更新事件)--- 生成(更新中断或者DMA 请求) ( URS =0 ) ·计数器溢出,生成更新事件,(UDIS =1,禁止更新事件,所以此处还需UDIS =0) ·URS用来设置跟新请求源,就是用来选择哪些行为可以生成更新中断。此处URS=0; ·开始看手册时,不理解更新事件,其实不懂的时候,应该多看几遍手册,以下为手册原话: 发生更新事件时,将更新所有寄存器且将更新标志(TIMx_SR寄存器中的UIF位)置1(取 决于URS位): ●预分频器的缓冲区中将重新装载预装载值(TIMx_PSC寄存器的内容) ●自动重载影子寄存器将以预装载值进行更新

·影子寄存器存在的意义在于同步。具体可以百度。 在上是初始化设置要注意的地方。 捕获的过程描述,手册有讲,以下为来自手册: 在输入捕获模式下,当相应的ICx 信号检测到跳变沿后,将使用捕获/比较寄存器(TIMx_CCRx) 来锁存计数器的值。发生捕获事件时,会将相应的CCXIF 标志(TIMx_SR 寄存器)置1,并可发送中断或DMA 请求(如果已使能)。如果发生捕获事件时CCxIF 标志已处于高位,则会将重复捕获标志CCxOF(TIMx_SR 寄存器)置1。可通过软件向CCxIF 写入0 来给 CCxIF 清零,或读取存储在TIMx_CCRx 寄存器中的已捕获数据。向CCxOF 写入0 后会将 其清零。 要在重复捕获前,读取捕获值。由于我的输入信号是连续方波信号。重新开始一次捕获前,一定要清除中断标志位,防止误入中断。 中断处理后,要记得清标志。 清除状态寄存器 以下为TIM3初始化代码。 //捕获功能 void InitBuhuo(void) { TIM_ICInitTypeDef TIM_ICInitStructure; GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

使用STM32的定时器进行输入脉冲的计数

使用STM32的定时器进行输入脉冲的计数STM32的定时器具有计数功能,在实际应用中可以用来对引脚上的输入信号进行统计。其输入信号作为计数时钟,输入引脚为ETR引脚。 本例程使用Timer 2,其ETR输入引脚为PA1,初始化是设置该引脚工作模式为输入模式,Timer2的工作模式为从模式。 为了方便测试,另外使用PC6模式输出一个时钟信号。测试时将PC6与PA1短接。(用户也可另外连接一个时钟信号到PA1引脚上。) 代码如下: int main(void) { unsigned char i_Loop; unsigned char n_Counter; #ifdef DEBUG debug(); #endif RCC_Configuration(); // System Clocks Configuration NVIC_Configuration(); // NVIC configuration GPIO_Configuration(); // Configure the GPIO ports TIM_TimeBaseStructure.TIM_Period = 0xFFFF;

TIM_TimeBaseStructure.TIM_Prescaler = 0x00; TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // Time base configuration TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInver ted,0); TIM_SetCounter(TIM2, 0); TIM_Cmd(TIM2, ENABLE); for(i_Loop = 0; i_Loop < 100; i_Loop ++) { GPIO_SetBits(GPIOC, GPIO_Pin_6); Delay(10); GPIO_ResetBits(GPIOC, GPIO_Pin_6); Delay(10); } n_Counter = TIM_GetCounter(TIM2); while (1) {}

STM32_DAC 实验(正弦波_方波_锯齿波_发生器)

/*---------------------------------------------------------------------------- * 开发者:红芯电子_飞哥 * 功能:STM32 DAC 数模转换(正弦波/矩形波/锯齿波)输出实验 * 说明:按SW5 输出正弦波/ 按SW4 输出矩形波/ 按SW3 输出锯齿波, 输出端口PA4 * 网址:https://www.doczj.com/doc/e516404708.html, *----------------------------------------------------------------------------*/ #include #include // STM32F10x Library Definitions #include "STM32_Reg.h" // STM32 register and bit Definitions #include "STM32_Init.h" // STM32 Initialization #include "common.h" #include "sine_wave_1024.h" // 输出端口: PA4 #define SINE_W A VE 1//sine 正弦波 #define RECT_W A VE 2//rectangular 矩形波 #define HACKLE_WA VE 3//hackle 锯齿波 UINT8 flag = 0; UINT8 func = SINE_W A VE; /*---------------------------------------------------------------------------- MAIN function *----------------------------------------------------------------------------*/ int main (void) { UINT16 i = 0; UINT32 *pDAC_BASE = (UINT32 *)DAC_BASE; stm32_Init(); // STM32 setup LED_Init(); //打开DAC时钟使能,请参考STM32_Ref_Manul.pdf 第105页 RCC->APB1ENR |= (UINT32)(1 << 29); //设置DAC控制参数,请参考STM32_Ref_Manul.pdf 第260页,里面有对该寄存器中每一位的介绍 *(pDAC_BASE + 0x00) = (0x01 << 0)| (0x00 << 2) | (0x04 << 3) | (0x03 << 6) | (0x0b << 8); *(pDAC_BASE + 0x04) = 0x01;

STM32单片机定时器调试之方波输出

STM32单片机定时器调试之方波输出 今天试着让STM32的定时器输出50%占空比信号,按 照例程写了一下方波初始化函数,例程用的是STM32自 带库函数,由于嫌麻烦,我又自己写了一个简单的,采 用定时器1进行输出。结果一上来,没反应,修改了很 多参数,还是没反应,然后将开发板例程写进芯片后, 有反应,仔细越多数据手册,没有问题,纠结一上午, 中午吃饭。吃完饭后,下午又开始试验,还是别人程序 有反映,自己程序,没反应。再看了看,开发板程序使 用的是TIM3,而我使用的是TIM1,于是又把我的程序将TIM1换成TIM3,点击调试运行,有反应。不会是高级 定时器只能干高级的任务吧,像输出方波这么简单的低 级任务他不惜的干?郁闷了半天。后来通过在网上查找,这个程序 以下为源代码,CC1进行比较输出,模式为翻转电平. 程序运行后,CC中断可以进去,PA.11的指示灯能闪, 但PA.08的指示一直为低电平,请教一下程序哪里错了??? void TIM1_CC_Init(void) { NVIC_InitTypeDef NVIC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure;

/* 使能定时器 TIM1_CC 中断 */ NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPrior ity = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* 配置 PA.11 为推挽输出 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIOA->;BSRR = GPIO_Pin_11; // 将PA.08配置为高电平 /* 配置 PA.08 为复用推挽输出 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /* 预分频自动重载寄存器 */

STM32的捕获模式应用

STM32捕获模式应用。。。。。 1、stm32脉冲方波捕获 脉冲方波长度捕获 a)目的:基础PWM输入也叫捕获,以及中断配合应用。使用前一章的输出管脚P B1(19脚),直接使用跳线连接输入的PA3(13脚),配置为TIM2_CH4,进行实验。 b)对于简单的PWM输入应用,暂时无需考虑TIM1的高级功能之区别,按照目前我的应用目标其实只需要采集高电平宽度,而不必知道周期,所以并不采用PWM 输入模式,而是普通脉宽捕获模式。 c)初始化函数定义: void TIM_Configuration(void); //定义TIM初始化函数 d)初始化函数调用: TIM_Configuration(); //TIM初始化函数调用 e)初始化函数,不同于前面模块,TIM的CAP初始化分为三部分——计时器基本初始化、通道初始化和时钟启动初始化: void TIM_Configuration(void)//TIM2的CAP初始化函数 { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//定时器初始化结构 TIM_ICInitTypeDef TIM_ICInitStructure; //通道输入初始化结构 //TIM2输出初始化 TIM_TimeBaseStructure.TIM_Period = 0xFFFF; //周期0~FFFF TIM_TimeBaseStructure.TIM_Prescaler = 5; //时钟分频 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //时钟分割 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//模式

STM32F4_TIM输入波形捕获(脉冲频率)

本文在前面文章“STM32基本的计数原理”的基础上进行拓展,讲述关于“定时器输入捕获”的功能,和上一篇文章“定时器比较输出”区别还是挺大的。在引脚上刚好相反:一个输入、一个输出。 本文只使用一个TIM5通道3(也可其他通道)捕获输入脉冲的频率,通过捕获两次输入脉冲的间隔时间来计算脉冲波形的频率。间隔一定时间读取频率并通过串口打印出来。 当然也可通过两路通道捕获脉冲信号的占空比,计划后期整理。 笔者通过信号发生器产生信号,上位机串口助手显示捕获的脉冲频率。(没有信号发生器的朋友可以结合上一篇文章PWM输出做信号源:在同一块板子上也可以使用不同定时器,将输出引脚接在输入引脚) 先看一下实例的实验现象: 关于本文的更多详情请往下看。 Ⅱ、实例工程下载 笔者针对于初学者提供的例程都是去掉了许多不必要的功能,精简了官方的代码,对初学者一看就明白,以简单明了的工程供大家学习。 笔者提供的实例工程都是在板子上经过多次测试并没有问题才上传至360云盘,欢迎下载测试、参照学习。 提供下载的软件工程是STM32F417的,但F4其他型号也适用(适用F4其他型号:关注微信,回复“修改型号”)。 STM32F4_TIM输入波形捕获(脉冲频率)实例:

https://https://www.doczj.com/doc/e516404708.html,/cB6XrSi6rK3TP 访问密码 STM32F4资料: https://https://www.doczj.com/doc/e516404708.html,/cR2pxqF5x2d9c 访问密码53e7 Ⅲ、原理描述 笔者将TIM分为三大块:时基部分、比较输出和输入捕获,请看下面截图“通用TIM框图”。 前面的文章已经将“时基部分”的一些基础知识讲述过了,“时基部分”的功能是比较有用的,它除了可以用来延时(定时)之外,它还可以拿来触发其他一些功能,如:触发DA转换、AD采集等。 上一篇文章讲述的就是图中比较输出部分,比较输出部分功能相对比较简单。 该文主要讲述“输入捕获”部分,这部分输入的通道1与2、通道3与4可以相互协作。该文只使用了TIM5的通道3,捕获输入信号频率。 通用TIM框图: 上面两图截取“STM32F4x5、x7参考手册”建议下载手册参看。 Ⅳ、源代码分析 笔者以F4标准外设库(同时也建议初学者使用官方的标准外设库)为基础建立的工程,主要以库的方式来讲述。

STM32输入捕获模式

输入捕获模式 库函数例程位置:STM32F10x_StdPeriph_Lib_V3.3.0\Project\STM32F10x_StdPeriph_Examples\TIM\I nputCapture 在输入捕获模式下,当检测到ICx信号上相应的边沿后,计数器的当前值被锁存到捕获/比较寄存器(TIMx_CCRx)中。当捕获事件发生时,相应的CCxIF标志(TIMx_SR寄存器)被置’1’,如果使能了中断或者DMA操作,则将产生中断或者DMA操作。 在捕获模式下,捕获发生在影子寄存器上,然后再复制到预装载寄存器中。PWM输入模式 库函数例程位置:STM32F10x_StdPeriph_Lib_V3.3.0\Project\STM32F10x_StdPeriph_Examples\TIM\P WM_Input 该模式是输入捕获模式的一个特例 例如,你需要测量输入到TI1上的PWM信号的长度(TIMx_CCR1寄存器)和占空比(TIMx_CCR2寄存器),具体步骤如下(取决于CK_INT的频率和预分频器的值) ● 选择TIMx_CCR1的有效输入:置TIMx_CCMR1寄存器的CC1S=01(选择TI1)。 ● 选择TI1FP1的有效极性(用来捕获数据到TIMx_CCR1中和清除计数器):置CC1P=0(上升沿有效)。 ● 选择TIMx_CCR2的有效输入:置TIMx_CCMR1寄存器的CC2S=10(选择TI1)。 ● 选择TI1FP2的有效极性(捕获数据到TIMx_CCR2):置CC2P=1(下降沿有效)。 ● 选择有效的触发输入信号:置TIMx_SMCR寄存器中的TS=101(选择TI1FP1)。 ● 配置从模式控制器为复位模式:置TIMx_SMCR中的SMS=100。 ● 使能捕获:置TIMx_CCER寄存器中CC1E=1且CC2E=1。 由于只有TI1FP1和TI2FP2连到了从模式控制器,所以PWM输入模式只能使用TIMx_CH1 /TIMx_CH2信号。 强置输出模式 在输出模式(TIMx_CCMRx寄存器中CCxS=00)下,输出比较信号(OCxREF和相应的OCx)能够直接由软件强置为有效或无效状态,而不依赖于输出比较寄存器和计数器间的比较结果。 例如:CCxP=0(OCx高电平有效),则OCx被强置为高电平。置TIMx_CCMRx 寄存器中的OCxM=100,可强置OCxREF信号为低。 输出比较模式 此项功能是用来控制一个输出波形,或者指示一段给定的的时间已经到时。当计数器与捕获/比较寄存器的内容相同时,输出比较功能做如下操作: ● 将输出比较模式(TIMx_CCMRx寄存器中的OCxM位)和输出极性(TIMx_CCER 寄存器中的CCxP位)定义的值输出到对应的引脚上。在比较匹配时,输出引脚可以保持它的电平(OCxM=000)、被设置成有效电平(OCxM=001)、被设置成无效电平(OCxM=010)或进行翻转(OCxM=011)。 ● 设置中断状态寄存器中的标志位(TIMx_SR寄存器中的CCxIF位)。 ● 若设置了相应的中断屏蔽(TIMx_DIER寄存器中的CCxIE位),则产生一个中断。 ● 若设置了相应的使能位(TIMx_DIER寄存器中的CCxDE位,TIMx_CR2寄存器

stm32F1外部脉冲计数(库函数实现)

主函数 #include "stm32f10x.h" #include "timer.h" #include "led.h" #include "delay.h" #include "oled.h" #include "sys.h" int main(void) { u16 t=0; delay_init(); LED_Init(); TIM3_PWM_Init(9999,719); TIM2_Excnt_Init(10); OLED_Init(); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); OLED_ShowString(20,0,"EXCNT_TEST",16); OLED_Refresh_Gram(); TIM_SetCompare2(TIM3,1000); while(1) { delay_ms(1);

t=TIM_GetCounter(TIM2); OLED_ShowNum(20,30,t,6,16); OLED_Refresh_Gram(); } } timer.c #include "timer.h" #include "led.h" #include "usart.h" #include "oled.h" void TIM3_PWM_Init(u16 arr,u16 psc) { GPIO_InitTypeDefGPIO_InitStructure; TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure; TIM_OCInitTypeDefTIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,

STM32 波形采集、存储与回放

波形采集、存储与回放系统设计 摘要 本设计是基于数字示波器的原理,以STM32-cortex-m3作为控制芯片,把波形采集分为A、B两个通道,对A通道的输入信号进行衰减,对B通道的输入信号进行放大,然后采用内部集成的高速AD对信号进行实时采样,方式为上升沿内触发,可以实现波形的单次和多次触发存储和回放显示,以及频率、周期、峰-峰值的测量和显示,并具有掉电存储功能。由信号采集、数据处理、波形显示,控制面板等功能模块组成,整个系统分成A/D转换部分、D/A转换部分、波形存储部分、键盘输入控制四大部分,系统操作简便,输出波形可以在示波器输出显示,此存储示波器即具有一般示波器实时采样实时显示的功能,又可以对某段波形进行即时存储和连续回放显示,且界面友好,达到了较好的性能指标。具体设计原理以及过程在下面章节中详细说明。 关键字:STM32、波形采集、波形存储、波形回放

Abstract The design is based on the principle of digital oscilloscope, with STM32-cortex-m3 as the control chip, the waveform acquisition is divided into A, B two channel, the A channel input signal attenuation on B channel, the input signal is amplified, then using the internal integration of high-speed AD on real time data sampling, as rising edge trigger, can achieve waveform of single and multiple triggers the storage and playback and display, frequency, cycle, peak to peak value measurement and display, and power failure memory function. The signal acquisition, data processing, waveform display, the control panel and other functional modules, the system is divided into A/D transformation, D/A converting part, waveform storage, keyboard input control system four parts, simple operation, the output waveform can be output in the oscilloscope display, this storage oscilloscope namely has the common oscilloscope real-time sampling real time display function, can be a real-time storage and continuous playback waveform display, and friendly interface, has achieved good performance. The design principle and process are described in detail in the following sections. Keywords: STM32, waveform acquisition, storage, waveform waveform playback

stm32的定时器输入捕获与输出比较讲解

stm32的定时器输入捕获与输出比较 (2015-09-28 09:26:24) 转载▼ 分类:stm32 标签: it 明确一点对比AD的构造,stm32有3个AD,每个AD有很多通道,使用哪个通道就配置成哪个通道,这里定时器也如此,有很多定时器TIMx,每个定时器有很多CHx(通道),可以配置为输入捕捉-------测量频率用,也可以配置为输出比较--------输出PWM使用 输入捕捉:可以用来捕获外部事件,并为其赋予时间标记以说明此事件的发生时刻。 外部事件发生的触发信号由单片机中对应的引脚输入(具体可以参考单片机的datasheet),也可以通过模拟比较器单元来实现。 时间标记可用来计算频率,占空比及信号的其他特征,以及为事件创建日志,主要是用来测量外部信号的频率。 输出比较:定时器中计数寄存器在初始化完后会自动的计数。从bottom计数到top。并且有不同的工作模式。 另外还有个比较寄存器。一旦计数寄存器在从bottom到top计数过程中与比较寄存器匹配则会产生比较中断(比较中断使能的情况下)。 然后根据不同的工作模式计数寄存器将清零或者计数到top值。

1、朋友,可以解释一下输入捕获的工作原理不? 计数寄存器的初值,是自己写进去的吗? 我如果捕获上升沿,两个值相减,代表的时两个上升沿中间那段电平的时间。对不? timer1有五个通道(对应五个IO引脚),在同一时刻,只能捕获一个引脚的值,对不? 那输出比较的原理你可以帮我介绍一下不?

比较单元的值是人为设进去的吧? 上面这个总看不懂,好像不不止你说的那几种情况:“匹配了是io电平取反、变低、还是变高,就会产生不同的波形了” 设置输出就是置1,清除输出就是置0,切换输出就是将原来的电平取反,对不? 011:计数器向上计数达到最大值时将引脚置1,达到0时,引脚电平置0,,对不?

STM32定时器控制方波

/* \\\|/// \\ - - // ( @ @ ) +---------------------oOOo-(_)-oOOo-------------------------+ | 奋斗版STM32开发板试验程序| | TIM1-PWM实验| | Sun68 | | 2009.12.8 | | 演示通过示波器观察TIM1的1通道的PWM波形| | 奋斗STM32嵌入式开发工作室| | https://www.doczj.com/doc/e516404708.html, | | QQ: 9191274 | | Oooo | +-----------------------oooO--( )-------------------------+ ( ) ) / \ ( (_/ \_) */ /*引脚A0、A1、A3*/ /* Includes ------------------------------------------------------------------*/ #include "stm32f10x.h" #include "stm32f10x_tim.h" #include "stm32f10x_rcc.h" #include "stm32f10x_flash.h" #include "stm32f10x_gpio.h" #include "misc.h" /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ TIM_TimeBaseInitTypeDef TIM2_TimeBaseStructure; TIM_TimeBaseInitTypeDef TIM3_TimeBaseStructure; TIM_OCInitTypeDef TIM2_OCInitStructure; TIM_BDTRInitTypeDef TIM2_BDTRInitStructure; TIM_OCInitTypeDef TIM3_OCInitStructure; TIM_BDTRInitTypeDef TIM3_BDTRInitStructure; NVIC_InitTypeDef NVIC_InitStructure; u16 capture = 0; u16 CCR1_Val = 20 * 200 / 100;

stm32脉冲方波捕获

1、stm32脉冲方波捕获 脉冲方波长度捕获 a)目的:基础PWM输入也叫捕获,以及中断配合应用。使用前一章的输出管脚P B1(19脚),直接使用跳线连接输入的PA3(13脚),配置为TIM2_CH4,进行实验。 b)对于简单的PWM输入应用,暂时无需考虑TIM1的高级功能之区别,按照目前我的应用目标其实只需要采集高电平宽度,而不必知道周期,所以并不采用PWM 输入模式,而是普通脉宽捕获模式。 c)初始化函数定义: void TIM_Configuration(void); //定义TIM初始化函数 d)初始化函数调用: TIM_Configuration(); //TIM初始化函数调用 e)初始化函数,不同于前面模块,TIM的CAP初始化分为三部分——计时器基本初始化、通道初始化和时钟启动初始化: void TIM_Configuration(void)//TIM2的CAP初始化函数 { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//定时器初始化结构 TIM_ICInitTypeDef TIM_ICInitStructure; //通道输入初始化结构 //TIM2输出初始化 TIM_TimeBaseStructure.TIM_Period = 0xFFFF; //周期0~F FFF TIM_TimeBaseStructure.TIM_Prescaler = 5; //时钟分频 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //时钟分割

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//模式 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);//基本初始化 //TIM2通道的捕捉初始化 TIM_ICInitStructure.TIM_Channel = TIM_Channel_4;//通道选择 TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;//下降沿 TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;/ /管脚与寄存器对应关系 TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;//分频器 TIM_ICInitStructure.TIM_ICFilter = 0x4; //滤波设置,经历几个周期跳变认定波形稳定0x0~0xF TIM_ICInit(TIM2, &TIM_ICInitStructure); //初始化 TIM_SelectInputTrigger(TIM2, TIM_TS_TI2FP2); //选择时钟触发源 TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);//触发方式 TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable); //启动定时器的被动触发 TIM_ITConfig(TIM2, TIM_IT_CC4, ENABLE); //打开中断 TIM_Cmd(TIM2, ENABL E); //启动TIM2 }

STM32中采用DMA实现方波的产生和捕获

STM32中采用DMA实现方波的产生和捕获 1 STM3 2 微控制器介绍STM32 系列微控制器是ST 公司基于Cortex-M 3 内核的高集成度的微控制器。它在性能、价格、功耗和实时性方面树立了一个 新的标杆,集成了Cortex-M3 内核,以及双ADC、多用途的通用时钟 TIMx、RTC、I2C、SPI、UART、CAN、DMA、USB 等丰富的外设。其功耗 在全速72MHz 所有模块都打开时也仅仅为36 mA,在低功耗模式下其功耗仅为2μA。2 DMA 和TIMx 简介STM32 系列微控制器均含有DMA 和通用时钟TIMx 模块。其低端型号中仅包含DMA1,支持7 个通道;高端型号还包 括DMA2,支持5 个通道。它的每个通道可任意指定工作模式,如内存到内存、内存到外设或外设到内存等。当涉及到外设时,一般是由外设来触发DMA 的 一次传输,如串口收到数据的标志位可触发DMA。DMA 的每次传输都分为 4 个阶段:申请仲裁、地址计算、总线存取和应答。除总线存取阶段,其他3 个阶段都只需要一个系统周期,并且不占用总线,可在DMA 控制器内部并发 地执行。总线存取阶段,每个字(4 字节)的传输需要3 个系统周期。DMA 和CPU 工作在交替方式下,不会相互阻塞。DMA 各个通道可独立设置优先级, 当访问同一资源时高优先级通道先获得资源。DMA 的使用比较简单,每路DMA 仅包括4 个寄存器,用于指定DMA 的工作模式、源地址、目标地址和传输次数。ST 公司提供了很好的驱动库,简化了外设的使用,方便阅读和移植。本文采用库函数来展示功能。其通用时钟是很有特色的外围模块,可实现多种复杂的功能。时钟模块内部主要包含一个计数器和4 个通道的比较/捕获寄 存器。时钟可工作在捕获或比较模式。在捕获模式下,若有对应的触发信号, 计数器的值会保存到比较/捕获寄存器,并触发中断或DMA;在比较模式下,若计数器的值与比较/捕获寄存器的值相等,则对外输出预选设定好的信号,

stm32基于定时器计量外部脉冲的实现

stm32基于定时器计量外部脉冲的实现(Gavin) 选用stm32f103c8作主控制器,来计量外部输入的脉冲数.选用外部时钟触发模式(TIM—ETRClockMode2Config),下面介绍具体的实现: 1、设置GPIO,根据硬件电路原理图,配置对应的资源IO引脚。 GPIO_InitTypeDef GPIO_InitStructure; /****** PA0,PA12-> 配置为脉冲输入引脚******/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_12; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M时钟速度 GPIO_Init(GPIOA, &GPIO_InitStructure); 注意:(1)stm32f103c8只有TIM1_ETR(PA12,Pin33),和TIM2_CH1_ETR(PA0,Pin10)两个可以用。其它更多管脚的芯片,有更多的可以输入(如100管脚的有4个可以输入的);(2)外部时钟输入与中断无关;(3)stm32f103c8的这个两个应用中,不需要重映射。对于哪些需要重映射,参考数据手册。 2、设置RCC,RCC_ClocksTypeDef RCC_ClockFreq; SystemInit(); //源自system_stm32f10x.c文件,只需要调用此函数,则可完成RCC的配置. RCC_GetClocksFreq(&RCC_ClockFreq); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); 3、第三步,设置定时器模式 void TIM1_Configuration(void) //只用一个外部脉冲端口 { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //配置TIMER1作为计数器 TIM_DeInit(TIM1); TIM_TimeBaseStructure.TIM_Period = 0xFFFF; TIM_TimeBaseStructure.TIM_Prescaler = 0x00; TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;

理解STM32定时器中的输入捕获滤波器

理解STM32定时器中的输入捕获滤波器 关于STM32定时器中的输入捕获滤波器的功能描述,在中文参考手册中描述如下: 我不理解官方的说明,在网上搜了老半天,基本都是下面这几句话: 1)当滤波器连续采样到N次个有效电平时,认为一次有效的输入电平。 2)该数字滤波器实际上是个事件计数器,它记录到N个事件后会产生一个输出的跳变。例如:当f(CK_INT) = 72MHz, CKD[1:0] = 01时,选择f(DTS) = f(CK_INT)/2 = 36MHz; 而ETF[3:0] = 0100,则采样频率f(SAMPLING) = f(DTS) / 2 = 18MHz, N = 6,此时高于3MHz 的信号 将被这个滤波器滤除,这样就有效地屏蔽了高于3MHz的干扰。 看了这些说法,我还是不理解这个数字滤波器到底是如何工作的,问题如下: 问题1:当滤波器连续采样到N次个有效电平时,是输出这个电平?还是输出一个跳变?问题2:当滤波器没有连续采样到N次个有效电平时,输出是的什么? 带着这两个问题,我们来分析一下,下面以TIM3为例: 首先可以肯定输入捕获过程如下:详细信息见参考手册中的14.2节,通用定时器框图 TIM3_CH1(PA.6) ----> TI1(外部信号) -------> 输入滤波器IC1F[3:0] -----> IC1(滤波器输出信号) -------> 输入捕获预分频器IC1PSC[1:0] ----> 捕获/比较1寄存器CCR1 从上面的过程可以知道, 1)发生输入捕获所需要的跳变沿是由滤波器输出产生的。 2)滤波器和预分频器可软件编程,如果IC1F[3:0] = 0x0,则滤波器全通,即TI1 和IC1是同一个信号。 借助这两点分析,我假设的滤波器的工作原理是: 问题1猜测答案:当滤波器连续采样到N次个有效电平时,就输出这个有效电平。 问题2猜测答案:当滤波器没有连续采样到N次个有效电平时,再从0开始计数,输出一

STM32--输入捕获和输出比较

概述 首先,明确一点对比AD的构造,stm32有3个AD, 每个AD有很多通道(一个外设可以有多个中断通道,但是每个中断通道只有一个外设),使用哪个通道就配置成哪个通道(只设置用一个就可以),这里定时器也如此,有很多定时器TIMx,每个定时器有很多CHx(通道),可以配置为输入捕捉-------测量频率用, 也可以配置为输出比较--------输出PWM使用 输入捕获 输入捕捉:可以用来捕获外部事件,并为其赋予时间标记以说明此事件的发生时刻。 外部事件发生的触发信号由单片机中对应的引脚输入(对应的引脚设置成输入)(具体可以参考单片机的datasheet),也可以通过模拟比较器单元来实现。 时间标记可用来计算频率,占空比及信号的其他特征,以及为事件创建日志,主要是用来测量外部信号的频率。 1.1、朋友,可以解释一下输入捕获的工作原理不? 很简单,当你设置的捕获开始的时候,cpu会将计数寄存器的值复制到捕获比较寄存器中并开始计数,当再次捕捉到电平变化时,这是计数寄存器中的值减去刚才复制的值就是这段电平的持续时间,你可以设置上升沿捕获、下降沿捕获、或者上升沿下降沿都捕获。它没多大用处,最常用来测频率。 1.2、计数寄存器的初值,是自己写进去的吗? 是的,不过默认不要写入(即计数寄存器为零) 1.3、我如果捕获上升沿,两个值相减,代表的时两个上升沿中间那段电平的时间。对不? 是的 1.4、timer1有五个通道(对应五个IO引脚),在同一时刻,只能捕获一个引脚的值,对不? 那是肯定的,通道很像ADC通道,是可以进行切换的。 输出比较 输出比较:定时器中的计数寄存器在初始化完后会自动的计数,从bottom计数到top,并且有不同的工作模式。另外,还有个比较寄存器。一旦计数寄存器在从bottom到top 计数过程中与比较寄存器匹配(在计数的过程中进行比较,不单指bottom或top)则会产生比较中断(比较中断使能的情况下),这里的匹配指的是计数寄存器的值与比较寄存器的值相等。 然后根据不同的工作模式计数寄存器将清零或者计数到top值。

STM32中基于DMA的频率信号采集

2019年第3期 信息通信2019 (总第 195 期)INFORMATION&COMMUNICATIONS(Sum.No 195) STM32中基于DM A的频率信号采集 樊芊 (中国航空工业集团公司西安航空计算技术研究所,陕西西安710068 ) 摘要:以意法半导体的STM32F4系列单片机为例,针对嵌入式实时系统实现了一种基于D M A的频率信号采集方法。该 方法与周期任务配合后不用中断CPU,也不需要配合外部可编程逻辑芯片,就能实现频率信号采集,且可采集的频率信 号范围较宽,更适合在资源较少的实时系统中使用,可以降低系统成本,极大地提高系统的运行效率。同时试验■表明,该 方法具有很高的精度,可以广泛应用于实时控制系统。 关键词:频率采集;D M A;STM32单片机;嵌入式系统 中图分类号:TP274.2 文献标识码:A文章编号:1673-1131(2019)03-0143-03 Frequency Signal Acquisition Based on DMA in STM32 Fan Qian (Xi'an Aeronautics Computing Technique Research Institute,AV1C,Xi'an710068, China) Abstract:Realized a method to acquire frequency signal based on DM A for embedded real-time systems,using STM32F4. Li coopa^tion with periodic task,this method can acquire frequency signal without interrupting the CPU or using FPGA.This method can acquire a wide range o f frequency signal,fit for real-time systems with less resource,reduce the system cost,im-prove the efficiency o f t he system.Test shows that this method has high precision and can be widely used for real-time control systems. Keyword:Frequency signal acquisition;DMA;STM32 SCM;Embedded system 0引言 频率信号采集是工业控制系统常用的功能之一,广泛用 于汽车控制和航空发动机控制等领域。对于转速信号来说,频率信号采集是将输入的正弦形式的模拟信号,经比较电路 转化为同频方波信号,再经采样后获取相邻上升沿或下降沿 时间差的一种信号处理方法。工业控制系统一般均为实时系 统,无法依靠频繁中断CPU直接采集频率信号,因此大多使用 可编程逻辑芯片实现频率信号的采集,但同时会占用本来就不多的可编程逻辑芯片的资源,同时还会增加系统成本。本文针对具有D M A模块,且D M A请求可以被通用定时器输入捕获单元触发的CPU,提出了一种频率信号的采集方法,该方 法可以仅使用C P U实现频率信号的采集,且不会中断实时系 统中的其他任务。 STM32F4是意法半导体在2010年推出的CortexM4内核的髙性能、高集成度的微控制器11],该系列微控制器均含有直接内存存取D M A单元和通用时钟T IM单元,其中TIM 单元除了包含通用时钟的功能外,还具有强大的输入捕获功能,可以实现方波信号的频率采集,同时每个T IM单元均至 图2自动化部署构架示意图 (3)云资源监控。在监控资源过程中,云计算技术就是把故障的相关问题。 随着云计算技术不断成熟与发展,必然会对信息时代产 生重大影响,有效改变用户所处核心地位。从现状来看,云计 算技术处于快速发展阶段,虽然能够有效改变用户对资源的 运用方式,但是很多方面依然需要不断完善。相信在互联网 中,云计算技术具有更大发展前景,为互联网稳健发展发挥推 波助澜的功效。 参考文献: [1]王健勇?浅析计算机“云计算”技术现状及发展[J].信息系 统工程,2013(04)_ [2]郭达永,杨楠,贾耀文.计算机云计算及其实现技术分析[J]. 电子技术与软件工程’2015G3). 服务器管理与相关数据相结合,合理整合动态化的信息数据,[3]宋国平?计算机云计算及其实现技术分析[J]?电子技术与 为快速数据服务提供依据,合理转化动态资源,从而实现资源监控管理,对数据进行分析,实现云资源的有效分配,而且部 署动态资源是系统及时跟进的重要部分。因此,当信息数据 软件工程,2013(21)_ [4]方海诺.计算机云计算及其实现技术分析[J].科技与企业, 2016(10). 传送到数据仓库,就会监控各个环节的数据资源运行程序情 况,并对资源数据进行系统、精准的分析。采用云计算技术监作者简介:潘巍(1982-),男,江苏无锡人,硕士,研究方向:云计 察信息,整合传统服务器上各种数据,可及时检査与排除引发 算、网络技术。 143

相关主题
文本预览
相关文档 最新文档