历史上的今天
今天是:2025年02月09日(星期日)
2020年02月09日 | 解决stm8s003中timer2配置初始化中引起中断更新
2020-02-09 来源:eefocus
概述
本文简要记述关于stm8s003中初始化timer2立即进入中断的解决方法:
在调试stm8 tim2作为100ms定时器的时候发现,在enable timer2后,不久远远小于100ms大概800us左右就会立即进入中断(更新事件触发),无论是怎样设置先后顺序,以及在enable中断之前清除中断状态位都无法解决进入中断的问题。此处澄清真的不是st的bug,不过这种设计不是我等小白能够领悟到的,哈哈!
搜索
在度娘中搜索到的结果一般解决方法都是等待第一次触发后清除事件再打开中断。出于对知(领)识(导)的好(压)奇(迫),便寻找解决方法,最终找到了问题的根源(google大法好:https://community.st.com/s/question/0D50X00009XkWotSAF/premature-tim2-interrupt-happening-immediately-on-timer-start)
原因
究其原因是因为在初始化中对预分频器(ARRPreload)进行了更新。实际上在触发更新时间后,该寄存器的配置才会生效(spec中有说明),故进入中断的原因是因为预分频器数值默认为0(写文章时并没有考究是不是0,反正远远小于我设置的数值),才在使能后短时间内触发中断,实际上是真的溢出触发了中断。
附上大家喜爱的代码,亲测可用,基于2M HSI CLK
这里没有列出中断函数,清中断神马的就不是问题的根源,不在赘述(代码不在此电脑中,懒得考了)
static void TIM2_Start()
{
GPIO_WriteReverse(GPIOA, GPIO_PIN_1);//测试用
GPIO_WriteReverse(GPIOA, GPIO_PIN_2);//测试用
TIM2_Cmd(ENABLE);
}
static void TIM2_Stop()
{
TIM2_Cmd(DISABLE);
GPIO_WriteReverse(GPIOA, GPIO_PIN_2);
TIM2_UpdateDisableConfig(ENABLE);
TIM2_GenerateEvent(TIM2_EVENTSOURCE_UPDATE);
TIM2_UpdateDisableConfig(DISABLE);
}
static void TIM2_Config(void)
{
TIM2_DeInit();
/* Time base configuration */
TIM2_TimeBaseInit(TIM2_PRESCALER_128, 0x061b);
TIM2_ARRPreloadConfig(ENABLE);
TIM2_UpdateRequestConfig(TIM2_UPDATESOURCE_REGULAR);//中断源选择为只有溢出才能触发
TIM2_GenerateEvent(TIM2_EVENTSOURCE_UPDATE);//产生更新事件,不触发中断(这就是我的解决方法,此处即更新了预分频器)
TIM2->SR1 &= 0xFE;//清除中断,按常理应该没用
TIM2->IER |= 0X01;//使能TIMER
}
[1]:我的GITHUB原文 https://ladudu.github.io/2018/11/28/STM8S_TIMER2_INTERRUPT/
[2]: 参考 https://community.st.com/s/question/0D50X00009XkWotSAF/premature-tim2-interrupt-happening-immediately-on-timer-start
史海拾趣
|
请教高手:我还是不太明白,固件寄存器是怎么和PPPI_nitTypeDef中的参数联系起来的?为什么不需要对固件寄存器进行 OX xxxx 的赋值来配置呢?… 查看全部问答> |
|
某计算机的cache共有16块,采用2路组相联映射方式(即每组2块)。每个主存块大小为32字节,按字节编址。主存129号单元所在主存块应装入到的Cache组号是 A.0 B.2 C.4 D.6… 查看全部问答> |
|
请问,WINCE注册表[HKEY_LOCAL_MACHINE\Drivers\BuiltIn]下的DLL都会被设备管理器加载吗? 我在移植SDIO驱动SDHC_SC2440.dll,它在注册表里的项如下。但是我感觉它的入口函数DllEntry、初始化函数SDH_Init没有执行。 我在开头用printf打印,在串口上没看到输出。 在[HKEY_LOCAL_MACHINE\\Drivers\\Active]下确实也没看到这个DLL。 难道 ...… 查看全部问答> |
|
我们现在已经做了一个单路的视频采集卡(包括硬件和驱动程序都是自己实现的),用的是SAA7130。但现在要做一个多路的视频采集卡,仍然用SAA7130,这里需要加一个桥路。硬件比较好实现,可我不太清楚驱动程序这一块和单路的是否有很大不同。请过来人 ...… 查看全部问答> |
|
初学c51,对xdata的地址分配不是很了解,比如我定义了以下几个变量。 unsigned char xdata b1; unsigned char xdata b2; unsigned int xdata b3; unsigned ch ...… 查看全部问答> |




