timer1是stm8的几个最复杂的外设资源之一
与之相关的功能也很多,定时器是最简单的一种,还有输入捕获、输出比较、PWM等众多复杂的功能。
要把timer1相关资源学通透不是件容易的事,估计很多地方要反复多看即便才能明白。
由于他的定时器功能与timer4基本相同,仅是计数位数增加和分频系数更加灵活,所以今天就不做研究。
今天要学习的是简单的输入捕获。
先看看大体结构
PSC时钟经过分频变成计数时钟CNT
每来一个时钟脉冲16位计数器自增1,然后同自动重装载寄存器比较
当CNTR大于ARR时产生溢出,根据设置产生事件更新和中断,CNTR清零,重新计数
这个和timer4相同
不同的地方在于CK_PSC时钟的来源
看下图
可以看到timer1的CK_PSC时钟来源很丰富
今天的实验就是使用timer1对外部输入时钟进行捕获计数
今天我们就从TIM1_CH1这儿通道来捕获外部时钟信号。
根据结构框图,我们需要配置的寄存器有TIM1_CCMR1、TIM1_CCER1、TIM1_SMCR
通过配置这几个寄存器将外部时钟输入信号选通成CK_PSC时钟源。
其它的寄存器配置就和timer4相同了。
今天的实验就是通过CCO时钟输出作为时钟源,通过杜邦线将CCO时钟接到TIM1_CH1
stm8s105k4需要配置选项字节位AFR2启用PD0脚的时钟输出功能,再将PD0脚通过杜邦线连接到
定时器1的外部时钟输入引脚PC1。
最后通过在中断服务函数中改变LED状态来观察运行状态,当然用逻辑分析仪观察更方便。
这个是使用内部高速时钟8分频得到的2M时钟,再经过64分频输出
上方是输出时钟,下方是LED状态
这个是使用外部8M晶振作为主时钟源,CPU时钟不分频,时钟输出是CPU时钟64分频
最后附上实验程序代码
- //定时计数器1输入捕获
- #include<iostm8s105k4.h>
- #define LED PE_ODR_ODR5
- #pragma vector=TIM1_OVR_UIF_vector
- __interrupt void timer1()
- {
- LED=!LED;
-
- TIM1_SR1=0;
- }
- void init()
- {
- PC_DDR_DDR1=0; //输入模式
- PC_CR1_C11=1; //上拉输入
- PC_CR2_C21=0; //无中断
-
- PE_DDR_DDR5=1; //输出模式
- PE_CR1_C15=1; //推挽输出
- PE_CR2_C25=0; //低速
-
- PD_DDR_DDR0=1; //时钟输出引脚配置
- PD_CR1_C10=1;
- PD_CR2_C20=1;
-
- CLK_SWCR|=0x20; //时钟切换
- CLK_SWR=0xb4; //外部晶振
- CLK_CKDIVR=0x00;//不分频
-
- CLK_CCOR|=0x15; //打开时钟输出功能
-
- TIM1_CCMR1=0x00; //输入捕获模式,无滤波,不分频,CH1为输入
- TIM1_CCER1=0x01; //上升沿有效,允许捕获
- TIM1_SMCR=0x57; //输入源滤波后的定时器输入1,外部时钟模式1
- TIM1_PSCRH=TIM1_PSCRL=0; //输入信号不分频
- TIM1_ARRH=0; //16位重装载高位为0
- TIM1_ARRL=8; //16位重装载低位为8
- TIM1_IER=0x01; //开中断
- TIM1_CR1=0x01; //开计数
- }
- int main( void )
- {
- init();
- asm("rim");
- while(1);
- }
THE END!