打印
[其他ST产品]

STM8的C语言编程(7)--16位定时器的中断应用

[复制链接]
335|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
麻花油条|  楼主 | 2023-5-24 14:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在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
}                                         
 

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

279

主题

1448

帖子

2

粉丝