昨天使用定时器做了一个PWM功能,现在用定时器做个计数功能,就是计数方波的个数。这个功能在叫外部事件计数器。就是对外部的方波进行计数。一下就是这个功能的一些说明:
计数器可以用16位或者8位定时器进行计数,实际只有8位定时器可以计数,在计数是就是读取TCR0n寄存器的高八位和第八位的值,在我的实际测试中,无论配置16位还是8位定时器也是只有TCR0nL的在计数,而实际TCR0nH是不计数,我也想不通。
接下来我可以看看计数器的框图:
我要用计数器的功能时,首先要对管脚进行配置,手册上也有详细的说明:
如上图就是管脚的配置要求:
例如下面的例子就是把P14配置成TI03;
/* Set IO */
PMC1 &= 0xEFU;
P1 |= 0x10U;
PM1|=0x10U;
接下来就是对定时器进行配置,我可以参考一下两个图进行配置:
我的配置代码如下:
void TAU0_Counter_Init(void)
{
/*Set IO */
PMC1 &= 0xEFU;
P1 |= 0x10U;
PM1 |= 0x10U;
/*Basic configuration */
TAU0EN =1; /* Enables input clock supply for TAU */
TPS0 =0x70; /* CK00 = 20MHz, CK01 = 156kHz */
/*Configure TAU00, TAU01(PWM) */
TMR03H =0x10; /* Selection of operation clock (fMCK) ofchannel 0 - operation clock CK00(20MHz) */
TMR03L =0x06; /* Master channel */
TDR03H = 0xFFU;
TDR03L = 0xFFU;
TO0 = 0x00;
TOL0 |= 0x00;
TOM0 |=0x00; /* Slave channel output mode for TO01 */
TOE0 |=0x00; /* Enables output of TO01 */
TMMK03 = 1;
//TE0|= 0x02;
NFEN1 = 0x08;
TS0 =0x00; /* Disables TAU0 */
}
计数的最大范围通过TDR0n进行设置,假如你设置了TDR0n为1999,假如你设置了上升沿触发,每当方波的上升沿进行计数,而且是从2000递减,也就是最大计数到2000,当计数到0后然后会产生INTTM0n中断,然后继续从2000递减,如此反复下去。
我可以在程序中自由改变TDR0n的值进行最大计数值的设定,但在实际测试中,我即使改变了TDR0n的值,TCR0n也不会从按我设定的TDR0n值进行递减。
我的主函数很简单,就是不断的获取TCR0n的值,然后通过OLED显示计数值,虽然高位用不了,但我也进行了读取,由于手上没有信号源,我只能用stm32f103产生1s的方波,看到的现象就是计数值在递减,每一秒递减1,递减到0后,再从255递减,如此反复下去,我没有配置中断:
void main(void)
{
/*Start user code. Do not edit comment generated here */
MD_STATUS result; /* communication result */
hdwinit();
R_CSI00_Start(); /* start serial module */
GPIO_Init();
R_PORT_Create();
LCD_Init();
LCD_CLS();
//Clk_Out_Init();
R_TAU0_Create();
R_TAU0_Channel0_Start();
TAU0_Counter_Init();
TAU0_Start();
LCD_show();
while (1U)
{
count =(TCR03H >> 8 | TCR03L);
OLED_Refresh();
}
/*End user code. Do not edit comment generated here */
}
小git图显示,对1s的方波进行计数:
源代码分享:
Counter.zip
(237.09 KB, 下载次数: 6)