[疑难问答] 使用STM8L-discovery时发现的问题

[复制链接]
1022|10
 楼主| bbapple 发表于 2016-7-25 19:47 | 显示全部楼层 |阅读模式
以下是我想用定时器实现1ms延时,使用了内部高速晶振,程序如下
static void TIM1_Config(void)
{
    TIM1_SetCounter(0);  
   //128分频 向上计数模式 使用HSI-16MHz
    TIM1_TimeBaseInit(128,TIM1_CounterMode_Up,124,0);

    TIM1_ARRPreloadConfig(DISABLE);
    /* Clear TIM1 update flag */
    TIM1_ClearFlag(TIM1_FLAG_Update);
    /* Enable update interrupt */
    TIM1_ITConfig(TIM1_IT_Update, ENABLE);
    /* enable interrupts */
    enableInterrupts();

    /* Enable TIM1 */
    TIM1_Cmd(ENABLE);
}

将主时钟HSI-16MHz进行128分频,向上计数到124,即125次,得到触发中断时间128/16*125=1000us即一毫秒,这个经测试准确无误,同理我想得到10us进中断,于是将初始化程序改动如下


static void TIM1_Config(void)
{
    TIM1_SetCounter(0);  
   //16分频 向上计数
    TIM1_TimeBaseInit(16,TIM1_CounterMode_Up,9,0);

    TIM1_ARRPreloadConfig(DISABLE);
    /* Clear TIM1 update flag */
    TIM1_ClearFlag(TIM1_FLAG_Update);
    /* Enable update interrupt */
    TIM1_ITConfig(TIM1_IT_Update, ENABLE);
    /* enable interrupts */
    enableInterrupts();

    /* Enable TIM1 */
    TIM1_Cmd(ENABLE);
}


理论上讲16分频后得到1MHz,向上计数到9为十次,应有10us进一次中断 可是经实际测量进中断的时间为20us左右
我又改动如下
TIM1_TimeBaseInit(16,TIM1_CounterMode_Up,4,0); 发现触发一次中断仍为20us

进一步改动,发现无论分频系数和重载值怎么改动 进中断的时间最小约为20us,不能再小了

有没有人碰见过这个问题?如何解决?与使用的内部晶振有关吗?
xia00 发表于 2016-7-25 19:57 | 显示全部楼层
10us中断不能识别,中断也要反应时间的。
hfdy01 发表于 2016-7-25 20:06 | 显示全部楼层
是不是就直接在主函数里面等待定时器溢出改变中断标志位?中断函数里面什么都不用写是不。。
CallReceiver 发表于 2016-7-25 20:10 | 显示全部楼层
可以看看这个

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
boy1990 发表于 2016-7-25 20:18 | 显示全部楼层
的确是这样,中断处理要占用时间。
sourceInsight 发表于 2016-7-25 20:22 | 显示全部楼层
就算中断函数里面只清标志位   也不会达到你下面的要求的啊
shashaa 发表于 2016-7-25 20:30 | 显示全部楼层
想得到更小的定时周期,唯一的方法就是提高时钟频率吧!
qiangweii 发表于 2016-7-25 20:33 | 显示全部楼层
将主时钟的时钟频率提高到16M,提高中断处理速度。
litengg 发表于 2016-7-25 20:41 | 显示全部楼层
在16MHZ的时候连个波形都没有还是在1M的时候没有波形?主时钟频率要快。
feiqi1 发表于 2016-7-25 20:50 | 显示全部楼层
你16M的时候,那个数字9也要相应改才行啊。
台湾笙泉MCU 发表于 2016-7-26 09:05 | 显示全部楼层
学习了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

293

主题

1811

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部