历史上的今天
今天是:2025年04月01日(星期二)
2021年04月01日 | 使用STM32的单个普通定时器产生4路不同频率的方波
2021-04-01 来源:eefocus
1)设置计数器为向上计数模式,将自动重装载寄存器设置为0xFFFF;这样计数器会循环计数。
2)每个定时器通道设置为输出比较模式,并设置比较匹配时对应的输出管脚翻转输出。
3)按照输出波形的半波周期计算出一个数值称作Half_Cyc。例如:定时器的时钟频率是72MHz,需要产生3456Hz的方波,则Half_Cyc = 72M/(3456*2) = 41667;如需要产生200kHz的方波,则Half_Cyc = 72M/(200k*2) = 180。
4)设置每个通道在输出比较匹配时产生中断,在中断中将比较寄存器的数值读出并加上Half_Cyc的数值,如果计算出的数值超过16位则舍弃超出的部分,再把这个新的数值写回相应的比较寄存器;这样下次比较成功将刚好发生在一个半波周期之后,对应的管脚将被翻转。
上述方法在要求频率不高时十分有效,但如果频率较高时会有频繁的中断产生,这时可以使用DMA加以改善。
上述方法的基础是通过不断改变输出比较的匹配点进而产生管脚翻转输出,我们可以事先计算好这些比较匹配点,并通过DMA在每次匹配时逐次更新比较寄存器的内容:
方法一、使用两个DMA缓冲区,在DMA控制器操作一个缓冲区时,程序计算好另一个缓冲区的数据,然后在DMA传输结束的中断处理中切换DMA操作的缓冲区。
方法二、使用一个大的DMA缓冲区,先计算好半个缓冲区的内容,启动DMA为循环模式并设置它在DMA传送一半和完成时均产生中断;启动DMA后继续计算好另外半个缓冲区的内容,当发生DMA中断时表示有一半缓冲区变空,这时在中断处理中计算好这半个缓冲区。
只要DMA缓冲区开的足够大,方法二可以保证CPU有充足的时间进行数据处理,并且保证不断地输出波形。
声明:以上说明没有经过实际验证,只是一个原理说明,也许还有没考虑周全的地方。
史海拾趣
|
AMD有可能在本月末宣布其奉行“轻晶圆厂”策略的大动作,包括转手其Dresden晶圆厂,接受来自一家中东财团的投资组建一家新公司。 在Austin美国发言人John Lau和Jefferies共同发表一份投资分析报道中指出,其智囊团认为AMD正寻找买主,打算抛售其在D ...… 查看全部问答> |
|
急!!!如何让我开发的WDM驱动程序在双核的机器中只运行在单核上? 我们一张PCI卡里面一块芯片的读写只支持在单核上运行,这样在双核机器上要强制让操作系统运行在单CPU模式下才可正确使用,我用的操作系统是Windows Vista. 请问我应该怎样通过编程的方式让我的驱动程序能内在的指定运行在单核上?… 查看全部问答> |
|
大虾们好!最近最一个产品,测试一个润滑脂的低液位报警,就是提醒要加料了! 装在直径200mm,高度75mm(这个很小)还有高度250mm的塑料桶里面。桶底有一个直流电机带动的刮板。 润滑脂粘度很大,类似于黄油,稍微稀一点,流动性很小。 用音叉肯 ...… 查看全部问答> |
|
城主及大家好. 请问STM32在休眠模式下怎么使用独立看门狗? 手册上说可以在休眠模式下工作,但看门狗需要喂吧?在停止模式下怎么喂呢? 应用中要用到休眠模式,但又要用到看门狗,该怎样解决呢? 另外.独立看门狗打开后能否关闭呢? 谢谢大家.… 查看全部问答> |
|
定义了全局变量,在中断函数中赋值。在主程序中全局变量的值为何没有变。请各位大侠指教,不胜感激!结果是 ser=0!!!!! #include <msp430x14x.h> unsigned char a[6]; unsigned char b[6]; unsigned char n; unsigned char pt; unsigned ...… 查看全部问答> |
|
飞思卡尔I.MX53软硬件平台 项目预算:¥ 50,000~80,000 开发周期: 90天 项目分类: android 竞标要求: 项目标签: java ANDROID ...… 查看全部问答> |




