项目案例:定时器实现秒闪指示灯
硬件资源: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); //进入死循环
}