henai521 发表于 2011-3-23 23:51:41

【ST公益分享】STM8-16位定时器中断

在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
}                                         
 
 

feixiang20 发表于 2017-7-3 11:33:58

有没有实验过?
页: [1]
查看完整版本: 【ST公益分享】STM8-16位定时器中断