在STM8中,除了有8位的定时器外,还有16位的定时器。今天进行的实验就是针对16位定时器2来进行的。除了计数单元为16位的,其它设置与前面8位的定时器基本一样。下面的程序也是采样中断方式,由定时器2的中断服务程序来驱动LED的闪烁。
具体的程序代码如下,其它注意点见上一篇,另外要注意别忘了修改相应的中断向量。
// 程序描述:通过初始化定时器2,以中断方式驱动LED闪烁
// LED接在MCU的GPIO的PD3上
#include "STM8S207C_S.h"
main()
{
// 首先初始化GPIO
PD_DDR = 0x08;
PD_CR1 = 0x08; // 将PD3设置成推挽输出
PD_CR2 = 0x00;
// 然后初始化定时器4
TIM2_IER = 0x00; // 禁止中断
TIM2_EGR = 0x01; // 允许产生更新事件
TIM2_PSCR = 0x01; // 计数器时钟=主时钟/128=2MHZ/2
// 相当于计数器周期为1uS
// 设定重装载时的寄存器值
// 注意必须保证先写入高8位,再写入低8位
TIM2_ARRH = 0xEA; // 设定重装载时的寄存器的高8位
TIM2_ARRL = 0x60;
TIM2_CNTRH = 0xEA; // 设定计数器的初值
TIM2_CNTRL = 0x60;
// 定时周期=1*60000=60000uS=60ms
TIM2_CR1 = 0x01; // b0 = 1,允许计数器工作
// b1 = 0,允许更新
// 设置控制器,启动定时器
TIM2_IER = 0x01; // 允许更新中断
_asm("rim"); // 允许CPU全局中断
while(1) // 进入无限循环
{
}
}
// 函数功能:定时器4的更新中断服务程序
// 输入参数:无
// 输出参数:无
// 返 回 值:无
@far @interrupt void TIM2_UPD_IRQHandler (void)
{
TIM2_SR1 = 0x00; // 清除更新标志
PD_ODR = PD_ODR ^ 0x08; // LED驱动信号取反
//LED闪烁频率=2MHZ/2/60000/2=8.3
}
|