Ai8g1k08 单片机 内部32K 时,定时器最小中断间隔
本帖最后由 DebugLab 于 2024-11-22 12:20 编辑最近在做低功耗项目
1 .Ai8g1k08 单片机内部32K 时,定时器最小中断间隔328HZ,
意味着中断间隔都有1.5MS多了。
2.在p54端口可以看到35K的输出,但是并不是50%的脉冲
///************************ 定时器配置 ****************************/
void Timer_config(u8 e)
{
TIM_InitTypeDef TIM_InitStructure; //结构定义
TIM_InitStructure.TIM_Mode = TIM_16BitAutoReload; //指定工作模式, TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask
TIM_InitStructure.TIM_Priority = Priority_0; //指定中断优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
TIM_InitStructure.TIM_Interrupt = ENABLE; //中断是否允许, ENABLE或DISABLE
TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T; //指定时钟源, TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
TIM_InitStructure.TIM_ClkOut = DISABLE; //是否输出高速脉冲, ENABLE或DISABLE
TIM_InitStructure.TIM_Value = 65536UL - 10;//(MAIN_Fosc / 10000); //中断频率, 1000次/秒
// TL1= 0xFE;
// TH0= 0xFF;
TIM_InitStructure.TIM_Run = e; //是否初始化后启动定时器, ENABLE或DISABLE
Timer_Inilize(Timer0,&TIM_InitStructure); //初始化Timer0 Timer0,Timer1,Timer2,Timer3,Timer4
}
重载值很小了,为何定时器间隔还是这么大呢? 由于24M,或者22.1184M,工作时功耗还是比较高,想用内部32k系统时钟工作,主要目的是想采集外部脉宽。外部脉宽大约500-800us的脉宽。精度有100us也够用。 TIM_InitStructure.TIM_Value = 65536UL - 1;//(MAIN_Fosc / 10000); //中断频率, 1000次/秒
设置成这样也不行,定时器间隔也要达到1.5ms。328HZ 这个定时间隔无法采集到外部500-800us的脉冲间隔。 32.768不能作为主时钟吧。这个可以看单片机的时钟部分原理图。 第一个是内部的32K并不精准,,
第二个是随单片机的供电电压和当前的温度影响,手册里有图,,
以上造成的误差你觉得仍然没问题,那么就可以用,在环境变化很小的情况下,也还行
不是的,我的问题是32k内部时钟,定时器的最小中断间隔,应该是30us多吧,不会是1.5ms这是我的疑问。不是误差的问题,误差32k-35k这都没问题。 本帖最后由 prxkuqfr 于 2024-11-22 11:19 编辑
soma 发表于 2024-11-22 11:14
32.768不能作为主时钟吧。这个可以看单片机的时钟部分原理图。
多谢,我去看看。
图上看,是可以作为系统时钟的,而且输出到P54口,也可以看到有35k输出,说明内部32k时钟开始工作了。 /*
内部32K
*/
MCLKOCR=0x00;// 不分频,不输出到IO口主时钟分频,且输出到IO口
P_SW2 = 0x80; //需要访问特殊寄存器,需要先置1
IRC32KCR = 0x80; //启动内部32K IRC
CLKSEL = 0x03; //选择内部32K
CLKDIV = 0x00; //时钟不分频
while (!(IRC32KCR & 1));//等待时钟稳定
页:
[1]
2