查看“第十八课--定时器中断的使用/zh”的源代码
←
第十八课--定时器中断的使用/zh
跳转至:
导航
、
搜索
因为以下原因,您没有权限编辑本页:
您所请求的操作仅限于该用户组的用户使用:
用户
您可以查看与复制此页面的源代码。
== 目的 == 上一课我们学习了Microduino CoreSTM32外部中断的使用,本课将学习定时器中断的使用。仅有硬币大小的Microduino CoreSTM32内部有4个16位定时器,每个定时器可以计数到最大65535,每个定时器有4个比较器,每个比较器可以独立地与定时器比较触发操作,触发操作可以是PWM或产生中断。同一个定时器上的不同比较器可以以相同的频率触发,但触发的相位不同,这可以用于PWM与步进电机驱动等应用。 == 设备 == *[[Microduino-CoreSTM32/zh]] Microduino-CoreSTM 是以ARM Cortex-M3为核心的32位单片机开发核心板,是一个开源的、与Microduino其它模块扩展模块兼容的控制器模块。 * 其他硬件设备 :* 面包板跳线 一盒 :* 面包板 一块 :* USB数据连接线 一根 == 实验原理 == 控制硬件定时器需要实例化HardwareTimer类。注意,PWM也是由定时器控制的,在同时使用定时器和PWM时,需要尽量避免共用一个定时器或触发器。 *为了使用定时器中断,这里建议采用下面的步骤: :* 1)用pause()函数暂停定时器。 :* 2)设定分频器与溢出值(也可用setPeriod()来设定)。 :* 3)选择一个通道来处理中断,并将该通道工作模式设定为TIMER_OUTPUT_COMPARE。 :* 4)设定选定通道的比较值,该值可以是0到溢出值之间的一个值,如果你不在乎具体什么值触发中断则可以忽略,默认会在计数器为1时触发。 :* 5)连接中断到用于处理该定时器中断的函数。 :* 6)用refresh()函数重置计数器。 :* 7)用resume()函数恢复计数器计时。 下面我们结合上边的步骤用定时器来闪烁Microduino CoreSTM32上的LED。 == 程序 == <source lang="cpp"> HardwareTimer timer1(1); void setup() { pinMode(BOARD_LED_PIN, OUTPUT); timer1.pause(); //暂停定时器 timer1.setPeriod(50000); //50ms,设置定时器的计时周期,该操作会设定分频器和溢出值,已获得尽可能接近指定周期的溢出周期 timer1.setMode(1,TIMER_OUTPUT_COMPARE); //设定比较器1触发中断 timer1.setCompare(1, 1); //设定比较器1的值为1,当计数器计数到1时触发比较器1 timer1.attachInterrupt(1,handler_led); //为通道1设置中断 timer1.refresh(); //重置定时器,恢复定时器的值为0,并更新溢出值与分频设置 timer1.resume(); //开始计数 } void loop() {} void handler_led(void) { toggleLED(); } </source> 程序说明: * void setMode(int channel, timer_mode mode) :* 设定定时器的工作模式。 :* 参数:channel定时器通道。 :* mode定时器的工作模式有3种:TIMER_DISABLED(关闭)、TIMER_PWM(PWM,初始化后的默认模式)、TIMER_OUTPUT_COMPARE(由定时器触发中断)。 * void setCompare(int channel, uint16 compare) :* 参数:channel定时器通道。 :* compare比较值,可以是0或溢出值-1。 :* 设定定时器中指定通道的比较值,该值用于控制触发事件的相位,当比较值大于定时器溢出值时,会被设定为定时器的溢出值。定时器计数达到比较器的比较值时会触发操作,例如,PWM或是通过中断执行某个指定函数。 == 调试 == * 把程序代码复制到Maple IDE编译下载到Microduino CoreSTM32观察实验现象。 * 大家可以尝试通过设置void setPrescaleFactor(uint32 factor)和void setOverflow(uint16 val)函数来设置定时器的计时周期。第一个函数是用来设置定时器的分频系数,取值范围在1-65536之间,第二个函数是用于设定定时器的溢出值,用于控制定时器计数周期。 * Maple 的工作频率为72 MHz,若factor为1,则定时分辨率为13.89 ns(1 ns=10-9 s=10-6 ms=10-3 μs)。下表给出常见的定时器分频系数与分辨率、最长计时周期的关系。 {|class=“wikitable” | align="center" style="background:#f0f0f0;"|'''分频系数(factor)''' | align="center" style="background:#f0f0f0;"|'''分辨率''' | align="center" style="background:#f0f0f0;"|'''频率''' | align="center" style="background:#f0f0f0;"|'''最大计时周期(分辨率x65535)''' |- | 1||13.899ns(约)||72MHz||910us |- | 9||125ns||8MHz||8.191875us |- | 18||250ns||4MHz||16.38375us |- | 36||0.5ns||2MHz||32.7675ms |- | 72||1us||1MHz||65.535ms |- | 720||10us||100KHz||655.35ms |- | 1440||20us||50KHz||1.3107s |- | 7200||100us||10KHz||6.5535s |- | 65536||910.22(约)||1098.5Hz(约)||59.65s(约) |- | |} == 结果 == 程序下载成功后可以看到LED没50ms闪烁一次。 [[File:Lesson18|600px|thumbnail|center|Lesson18]] == 视频 ==
返回至
第十八课--定时器中断的使用/zh
。
导航菜单
个人工具
创建账户
登录
名字空间
页面
讨论
变种
视图
阅读
查看源代码
查看历史
更多
搜索
Welcome
首页
创客大赛
大赛详情
3D打印
安装月球车
图形化编程
操控月球车
升级月球车
编程工具下载
软件下载
Arduino
Processing
Mixly
Scratch
模块套件
Microduino 102
mCookie 102
mCookie 202
mCookie 302
IBC
其他
应用套件
四轴飞行器
平衡车
小车CUBE
音乐播放器
刷卡音乐播放器
wifi气象站
彩虹音乐触摸灯
分贝检测仪
迎门汇报
LED点阵时钟
LED点阵屏幕
硬件
mCookie
Sensor
Microduino
MicroWrt
MicroNux
MicroRobot-Core
MicroRobot-CoreESP
ideaBoard
ideaBox
MicroMV
MicroAI
帮助
常见问题
帮助
工具
链入页面
相关更改
特殊页面
页面信息