9260内部有5个内部计数器,分别为TIMER_CLOCK1 --- TIMER_CLOCK5。通过这5个时钟可以为各种内部设备提供时钟基准。
其中,红外发射38K方波,是通过CLOCK1计数产生。
配置寄存器如下
//选择TC通道 __sys_reg(AT91_PMC_PCER) = 1 << AT91SAM9260_ID_TC1; //设置对外接口 at91_set_A_periph(AT91_PIN_PC7, 0); TC_CCR(tc1_io_base) = AT91_TC_CLKDIS; TC_CMR(tc1_io_base) = //挑选时钟源 AT91_TC_TIMER_CLOCK1 //选择waveform | AT91_TC_WAVESEL_UP_AUTO //选择RC比较器是对外接口清零 | AT91_TC_BCPC_CLEAR //选择RB比较器是对外接口置位 | AT91_TC_BCPB_SET //设置为waveform | AT91_TC_WAVE //the last num set the port tiob to output | AT91_TC_EEVT_XC0; TC_IDR(tc1_io_base) = ~0; //确定RC计数器的值 TC_RC(tc1_io_base) = MAIN_CLK / 2 / 38000; //确定RB计数器的值 TC_RB(tc1_io_base) = MAIN_CLK / 2 / 76000; //时钟使能 TC_CCR(tc1_io_base) = AT91_TC_CLKEN | AT91_TC_SWTRG; |
因此,方波的频率多少取决于MAIN_CLK,即系统允许的频率。
2. 25K方波的产生
1. 之前的驱动程序采取把系统允许频率MCK写死的方式,进行处理,即MCK=99328000Hz,算出的RC=1306, RB=RC/2。NOTE:占空比1/2
2. 因此,如果核心板是降频处理的话,主频是665600000。如果搭配之前的驱动,即RC= 2*RB = 1306,算出的输出的方波即25KHz。
3. 如果更新最新的驱动,MCK是根据系统的寄存器配置动态生成的话,驱动会自动调整RB RC 值,以匹配38K PWM波的产生。
3. 附录A
TC Channel mode register:
Meaning:
AT91_TC_TIMER_CLOCK1 | | TIMER_CLOCK1 = MCK/2 |
AT91_TC_WAVESEL_UP_AUTO | 2<<13 | WAVSEL = 10 |
AT91_TC_BCPC_CLEAR | 2<<26 | RC Compare Effect on TIOB = CLEAR |
AT91_TC_BCPB_SET | 1<<24 | RB Compare Effect on TIOB = SET |
AT91_TC_WAVE | 1<<15 | WAVEFORM |
AT91_TC_EEVT_XC0 1<<10 | TIOB output |
Example:
Interpretation: