STM32定时器中断关于何时清除中断的总结
来源:互联网 发布:国航网上值机软件 编辑:程序博客网 时间:2024/06/06 21:48
问题:在调STM32的程序的时候,发现定时器(timer2)比自己设定的中断周期缩小了一倍。设定为10ms中断一次,但实测发现5ms便中断了一次。
初始化代码如下:
void InitTimer2(void)
{
RCC->APB1ENR|=0x01; //enable clock,max clock=36M
TIM2->PSC=71; // counter clock CK_CNT=72M/(71+1)=1M
TIM2->ARR=10000; // 10000*1us=10ms
TIM2->CR1 |=0x0080; //Auto-reload preload enable
TIM2->EGR |=0x0001; //Re-initialize the counter and generates an update of the registers.
TIM2->DIER|= 0x0001; //Update interrupt enabled
TIM2->CR1 |=0x01; //enable timer2
}
{
RCC->APB1ENR|=0x01; //enable clock,max clock=36M
TIM2->PSC=71; // counter clock CK_CNT=72M/(71+1)=1M
TIM2->ARR=10000; // 10000*1us=10ms
TIM2->CR1 |=0x0080; //Auto-reload preload enable
TIM2->EGR |=0x0001; //Re-initialize the counter and generates an update of the registers.
TIM2->DIER|= 0x0001; //Update interrupt enabled
TIM2->CR1 |=0x01; //enable timer2
}
中断服务函数如下:
void TIM2_IRQHandler(void)
{
TIM2->SR&=0xfffe;//位置一
DS[1].js++;
if(DS[1].js>500)
{
DS[1].en=1;
DS[1].js=0;
}
{
TIM2->SR&=0xfffe;//位置一
DS[1].js++;
if(DS[1].js>500)
{
DS[1].en=1;
DS[1].js=0;
}
//TIM2->SR&=0xfffe;//位置二
}
原因分析:
如上图代码框架,通过多次试验发现,当中断服务函数中执行较少时,把中断清除操作放到位置二,一般也是没有问题,但当服务函数中执行较多时,会发现进行中断的周期会被缩小一半,当把中断清除操作放到位置一时,会发现定时准了。
根据以上现象的猜想如下:
内核为72MHZ,而外设时钟频率最大为36MHZ,当在中断服务函数执行且未及时清除中断标志时,内核发现还未进行中断,便再次启动了,中断函数,此时便会发生此类现象。此说法仅为臆断,只为更好记住此应用。
结论:在进入中断后首先要清除中断标志。
阅读全文
0 0
- STM32定时器中断关于何时清除中断的总结
- STM32的定时器中断
- 关于STM32通用定时器更新事件中断
- STM32 定时器中断
- STM32定时器中断
- stm32-定时器中断
- stm32定时器中断实验
- STM32 定时器中断函数
- stm32定时器中断
- STM32定时器中断
- stm32之定时器中断
- stm32中定时器中断的套路
- stm32 uart清除中断时机
- STM32学习-定时器中断实验
- STM32定时器中断实验-TIM3
- STM32学习之:定时器中断
- 关于STM32外部中断
- STM32外部中断总结
- WinHttpCrackUrl function
- python中的lambda函数
- 五月个人赛-Easy to improve(大数据,找规律)
- 邮件收发过程中STMP_POP_IMAP_MIME协议祥析
- [树形DP] [FWT] [HDU5909] Tree Cutting
- STM32定时器中断关于何时清除中断的总结
- 46.网络安全与主机基本防护:限制端口、网络升级与 SELinux
- tpc慢起动
- 第2章 计算机工作原理
- IntelliJ IDEA优秀插件(编程通用)
- 学习kubernetes
- js获取当前时间 显示的格式类型2017-06-03 16:13:12
- erase方法+erase(lob,amount,offset)+使用erase方法
- Caffe 深度学习框架上手教程