我们在做嵌入式产品的开发过程中,有时需要输出指定数目的脉冲。实现它的方法较多,这里介绍一种利用 STM32定时器的单脉冲模式来实现的方法。
STM32定时器的单脉冲输出功能,其实是定时器输出比较功能的一个特殊应用。即让定时器在某个事件触发后的一段时间产生指定脉宽的单脉冲信号。
计数器的启动通常可由从模式控制器控制,可由比较输出模式或PWM输出模式来产生波形。通过置位OPM@TIMx_CR1来在下一个更新事件时关闭计数器来实现单脉冲输出。
STM32定时器里有个重复计数器TIMx_RCR,当它的值是个非0值N时,计数器不再每次溢出【上溢或下溢】时都产生更新事件,而是当发生第N+1次溢出时才产生更新事件。如果RCR=0的话,就是每次溢出都产生更新事件。
那么,当把单脉冲输出模式与RCR寄存器配合使用时,就不难生成指定数目的脉冲个数。此时脉冲个数为TIMx_RCR的值加1。
在上面原理的基础上,通过使用STM32定时器的主从模式还可以方便地实现周期性地输出指定数目的脉冲。
假如按上图所示,TIM2与TIM1主从连接,实现周期性的输出5个脉冲。
TIM2 配置为主 触发模式,触发TIM1的计数;
TIMER1 配置为从 单脉冲输出模式;TIM1_RCR=4;
关于上述内容的更多细节可以点击左下方的”阅读原文”去下载AN4776,相关应用的参考固件代码,可以去www.st.com/stm32 搜索X-CUBE-TIMCOOKER下载。整个固件包解压后的工程目录如下所示,其中就有上面提到的两种应用的参考工程代码。
关键字:STM32 单脉冲模式
引用地址:
STM32的单脉冲模式实现精确个数脉冲
推荐阅读最新更新时间:2024-11-06 11:23
STM32定时器中断
STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。 TIM1和TIM8是能够产生3对PWM互补输出的高级定时器,常用于三相电机的驱动,时钟由APB2的输出产生;TIM2-TIM5是普通定时器,TIM6和TIM7是基本定时器,其时钟由APB1输出产生。 通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成。 通用TIMx定时器特性包括: ●16位向上,向下,向上/向下自动装载计数器 ● 16位可编程预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值 ●4个独立通道:(定时器通道是什么意思?在PWM一节中有提到...)
[单片机]
STM32中EXTI外部中断的配置流程以及常见疑难问题
EXTI外部中断 STM32外部中断介绍 外部中断线与112个IO口的对应关系 112个IO口每个都可以与各自所属的外部中断线相连接,由于只有16个外部中断线,因此每7个IO口使用一个外部中断线,例如:PA4,PB4,PC4……PG4共有EXTI4中断控制总线。由于是共有,因此在任何时候只有PA4,PB4,PC4……PG4其中一个IO口占用外部中断线。 中断服务函数简介 外部中断与中断事件请求的原理 中断执行的流程 我们一般说“只有中断被挂起的时候,中断标志位才会触发中断进而执行中断服务函数”,这句话的意思是“当请求挂起寄存器使能后,一旦触发中断的条件满足也就是边沿检测电路返回有效电平,中断标志位才会被置1
[单片机]
stm32 独立看门狗
独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效。IWDG最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精度要求较低的场合。WWDG最适合那些要求看门狗在精确计时窗口起作用的应用程序。 /* * 采用独立看门狗作为看门狗定时器 * 独立看门狗由内部专门的 40Khz 低速时钟驱动, * 即使主时钟发生故障,它也仍然有效 *000:预分频因子=4 // 最短时间 0.1 ms *001:预分频因子=8 // 最短时间 0.2 ms *010:预分频因子=16 // 最短时间 0.4 ms *011:预分频因子=32 // 最短时间 0.8 ms
[单片机]
一个简单逆向stm32固件程序的实例分享
本文主要跟大家分享一个简单逆向stm32固件程序的实例,为了让大家在一款成熟的产品中去考虑加密这一块的技术,不然分分钟被别人copy! 1、情景再现 咬金,你们公司固件程序有加密处理吗 ? 额~,算了吧,我们公司的单片机程序炒鸡简单的,还加啥子密。 你这想法不对,假如产品卖得很好,如果没有任何加密措施,那岂不人家随便复制售卖。 没关系吧,反正他们没源码,应该也没那么容易复制吧 一点加密都没有,盗取还是比较简单的。 我才不信~~ 那行,把你的板子给我,不用你的源码,跟你把波特率改了! 直接读取固件 这里以stm32单片机进行演示,如果MCU没有做flash读取或者熔断保护,则可以通过jlink等烧写工具直接读取其Flash上的固
[单片机]
STM32(二)之GPIO操作(2)——通过按键控制LED灯的开关
STM32是一款低功耗的芯片,所以其外设均有一个与之对应的时钟,而在芯片刚上电的时候这些时钟是被关闭的,所以如果想要外设工作,便必须将与之对应的时钟打开。 本文介绍如何基于GPIO来通过按键控制LEN灯的开关。 (1)按键的控制 上图所示为按键的电路,在按键未被按下的时候,KEY2的输出信号为低电平(按键所在的电路不通,其与地相连);在按键按下时,KEY2的输出状态为高电平(按键所在的电路导通,其与3.3V的电源相连)。因此,通过对引脚的电平进行检测便可以判断按键是否按下。 按键的机械触点断开、闭合时,由于触点的弹性作用,按键开关不会马上稳点接通或断开,其会产生如下图所示的带波纹信号,需要使用软
[单片机]
怎样用stm32(F103系列是12位ADC)…
重点在最后一段(看懂就行了) 可采用过采样技术。过采样技术是一种以牺牲采样速度来提高ADC分辨率的技术。如果STM32的12位AD,每秒采集10个数据,即采样率为:10/秒。根据过采样技术,每提高1位ADC分辨率,需要增加4倍的采样率。从12位AD提高到14位AD,一共提高了2位,所以需要把采样率提高2 * 2 * 2 * 2 = 16倍。原来在100mS之内只采集一个数据,现在需要在100mS之内采集16个数据了。然后,我们把这16个数据累加,再把累加值右移2位,这样就得到STM32过采样之后的14位ADC。 需要注意的是,过采样技术会限制输入信号的频率。根据采样定律,采样率最少是输入信号的2倍才能将信号还原。当需要提高
[单片机]
STM32 变量无法赋值问题
STM32 在用JLink 调试的时候发现有一条将unsigned char赋值给int的语句始终不能执行,int类型变量的值始终为0; 查资料找到这个问题是编译器优化的原因,也就是说由于编译器优化,赋值语句始终没有执行; 解决办法: 在变量声明前加 volatile 修饰即可,这样就能保证赋值语句不会被编译器优化
[单片机]
STM32多机通信
从机io口设置 多机通信系统中,从机采用漏级开路方式连接,从设备的串口必须配置为漏极开路,不能是推挽方式,推挽方式的高、低电平的驱动能力很强,如果将两个不同电平的io口连接在一起,会导致灌电流过大烧坏io口,漏极开路的漏级有上拉电阻会限制电流的大小。 一主多从的硬件连接方式 主机的TX输出与从机的RX端口直接相连,从机的TX端口经过与门与主机的RX端口相连接。由于输出口为推挽输出,直接将从机的Tx与主机的RX相连即可。 通信机制 多机通信机制是使从机处于静默状态,从机发送指令唤醒从机,然后发送数据。 静默状态的特点 (1)所有接收状态都不会被置为1。 (2)所有的接收中断都被禁止。 (3)USART_CR1寄存器中的RWU被置为1
[单片机]