stm8的定时器比51的要复杂些,但基本原理都是相通的。
本质还是计数器。
计数器对时钟脉冲进行计数,当计数值和设定值相等时产生中断,完成一个定时周期。
原理就不多说了。stm8的定时器比51复杂的地方是可以设置事件更新时机,是实时更新还是产生计数溢出时更新。
当然这仅仅是最简单的TIMER4与51的差别,更高级的定时计数器功能将更加强大和复杂。
话不多说,今天就进行最简单的定时器实验。
闪烁灯。
之前用的软件延时实现闪烁,今天用定时器实现。
定时器的计数时钟来源于Fmaster主时钟。
为了提高精度使用外部晶体时钟。
外部时钟输入不能进行分频,因此是8M。
定时器可以进行预分频,这里设置成8分频,定时器计数时钟就是1M,方便计算。
计数器自动重装值设定为100。
8位定时计数器最高为255,也就是0xff;
定时器产生一次中断需要100us。
要获得1HZ的频率就需要LED每500ms进行一次翻转。
也就是需要5000*100us=500MS。
这里需要注意的是TIMx_SR这个状态寄存器需要软件清零,不然单片机会反复进入定时器中断,造成异常。
1HZ波形图
这里贴上程序代码
- /*定时器4***********/
- /*定时器4的简单应用*/
- /*******************/
- #include<iostm8s105k4.h>
- #define LED PE_ODR_ODR5 //LED引脚宏定义
- unsigned int i=0; //计数用
- #pragma vector=TIM4_OVR_UIF_vector //定时器中断
- __interrupt void timer4()
- {
- TIM4_SR=0; //标志位清零
- if(i++==5000)
- {
- LED=!LED;
- i=0;
- }
- }
- void init()
- {
- PE_DDR_DDR5=1; //输出模式
- PE_CR1_C15=1; //推挽输出
- PE_CR2_C25=0; //低速
-
- CLK_SWCR=0x02;//时钟切换使能
- CLK_SWR=0xb4;//外部晶振
- CLK_CKDIVR=0x00;//主时钟不分频 8M
-
- TIM4_PSCR=0x03; //主时钟8分频 1M
- TIM4_ARR=0x64; //计数100次溢出 100us
- TIM4_IER=0x01; //使能计数器中断
- TIM4_EGR=0x01; //触发事件更新
- TIM4_CR1=0x01; //开始计数
-
- }
- int main( void )
- {
- init(); //初始化
- asm("rim"); //使能中断
- while(1);
-
- }
THE END!