小蜜蜂笔记
嵌入式开发与物联网应用教育践行者

【STM8教程-06】8位基础型定时器TIM4的原理与应用

项目案例:定时器实现秒闪指示灯

硬件资源:1个LED灯。
D3灯 <——– PC1。
硬件电路相关信息,详见:XMF06A开发的电路结构框图

功能要求
1. 系统的主时钟采用默认的高速内部振荡器8分频,即2MHz。
2. 利用8位基本型定时器TIM4实现0.5秒的间隔定时。
3. 在定时中断服务函数中,翻转D3灯的开关状态,即D3灯亮0.5秒,秒0.5秒,实现秒闪指示功能。

案例的参考源码及注释

#include "iostm8s105k6.h"

#define D3      PC_ODR_ODR1

unsigned int count = 0;  
/*========================GPIO端口初始化=========================*/
void Init_GPIO()
{
  //初始化D3灯的PC1引脚
  PC_DDR |= 0x02;       //PC1设置为输出模式
  PC_CR1|= 0x02;        //PC1设置为推挽输出
  PC_CR2&= ~0x02;       //PC1输出速度最大为2MHz
  //初始化按键SW3的PB0引脚
  PB_DDR &= ~0x01;      //PB0设置为输入模式              
  PB_CR1|= 0x01;        //PB0设置为带上拉电阻输入
  PB_CR2&= ~0x01;       //PB0禁止外部中断
}

/*=======================TIM4定时器初始化========================*/
void Init_TIM4()
{
  asm("rim");           //打开总中断
  TIM4_CR1=0x00;        //关闭计数器
  TIM4_IER=0x01;        //更新中断使能
  TIM4_EGR=0x01;        //
  
  TIM4_PSCR=0x04;       //2MHz的主时钟16分频为125KHz
  TIM4_CNTR=250;        //最大计数值250,间隔定时为2ms
  TIM4_ARR=250;         //自动重装的值
  
  TIM4_CR1=0x01;        //使能计数器
  asm("rim");           //打开总中断
}

/*==================TIM4定时溢出中断服务函数=====================*/
#pragma vector = TIM4_OVR_UIF_vector    
__interrupt void TIM4_OVR_UIF_IRQHandler()
{
  count++;
  TIM4_SR = 0x00;
  if(count == 250)      //2ms * 250 = 500ms = 0.5s
  {
    count = 0;          //间隔定时中断次数累计清零
    D3 = ~D3;           //D3灯开关状态切换
  }
}

void main()
{
  Init_GPIO();          //初始化GPIO端口
  Init_TIM4();          //初始化TIM4定时器
  while(1);             //进入死循环
}
赞(0)
未经允许不得转载:小蜜蜂笔记 » 【STM8教程-06】8位基础型定时器TIM4的原理与应用

小蜜蜂笔记 更专业 更方便 更高效

联系我们精品小店