解决stm8s003中timer2配置初始化中引起中断更新

发布者:心若清泉最新更新时间:2020-02-09 来源: eefocus关键字:stm8s003  timer2  配置初始化  中断更新 手机看文章 扫描二维码
随时随地手机看文章

概述

本文简要记述关于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

关键字:stm8s003  timer2  配置初始化  中断更新 引用地址:解决stm8s003中timer2配置初始化中引起中断更新

上一篇:STM8L101F3输入捕获测脉宽及占空比
下一篇:STM8S TIM1/TIM2 初始化函数

推荐阅读最新更新时间:2024-11-01 11:25

avr单片机eeprom初始化配置及说明
ATmega16 包含 512 字节的 EEPROM 数据存储器。它是作为一个独立的数据空间而存在的,可以按字节读写。 EEPROM 的寿命至少为 100,000 次擦除周期。 EEPROM 的访问 由地址寄存器、数据寄存器和控制寄存器决定。 /* EEPROM 数据存储器 EEPROM 地址寄存器(EEARH 和 EEARL) bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 EEAR7 EEAR6 EEAR5 EEAR4 EEAR3 EEAR2 EEAR1 EEAR0 Res: 保留 保留位,读操作返回值为零。 EEAR8..0
[单片机]
STM8S003单片机串口接收与ADC设置冲突
最近在搞STM8S单片机,怎么说,真的有一种相见恨晚的感觉,以前用过51、AVR、飞思卡尔、PIC,觉得跟它比都不人性化,外围简简单单,支持3.3v和5v,有很多人用的库,但是我觉得用它就是看它的性价比,本来没多少的容量,我就直接操作寄存器,而且它跟STM32不一样,STM32内部寄存器很多,而且速度快,容量大,更本不用考虑库函数那点损失,哎,以前一直很抵触,没想到,真的很好用,回想一下以前有很多项目根本不需要STM32,一个STM8搞定,性价比超高,而且我觉得入门很容易。 不罗嗦了,说一下问题,最近做磁悬浮,用到串口中断接收修改PID参数,同时,磁悬浮用到了内部ADC,SO,问题来了,设置好ADC和UART,串口怎么都不进中
[单片机]
<font color='red'>STM8S003</font>单片机串口接收与ADC设置冲突
STM8L RTC总结(2)初始化配置
配置RTC时钟源 配置RTC时钟源为LSE,1分频,即32768Hz。 1. 等待CLK_CRTCR:RTCSWBSY位复位,然后设置CLK_CRTCR值为0x10; 2. 等待CLK_ECKCR:LSERDY位置位,标识LSE时钟源已稳定可用; 3. 等待CLK_ECKCR:LSEON位置位,标识LSE时钟源已启用。 解除RTC寄存器保护 执行以下操作顺序: 1. 写0xCA到寄存器RTC_WPR; 2. 写0x53到寄存器RTC_WPR。 写其它值到RTC_WPR,则自动激活RTC寄存器保护功能。 配置日历功能 配置步骤如下: 1. 进入初始化模式,置位RTC_ISR中INIT位;并等待初始化标志位(I
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved